ProjectTest.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. <?php
  2. namespace Tests\Feature\API;
  3. use App\Models\Asset;
  4. use App\Models\Enums\ProjectStatus;
  5. use App\Models\Plan;
  6. use App\Models\PlanRequirement;
  7. use App\Models\Project;
  8. use App\Models\ProjectAsset;
  9. use App\Models\ProjectPlan;
  10. use App\Models\ProjectRequirement;
  11. use App\Models\Requirement;
  12. use Carbon\Carbon;
  13. use Illuminate\Foundation\Testing\RefreshDatabase;
  14. use Illuminate\Foundation\Testing\WithFaker;
  15. use Tests\Feature\TestCase;
  16. class ProjectTest extends TestCase
  17. {
  18. public function test_project_list()
  19. {
  20. Project::factory(30)->create();
  21. $response = $this->get(route('project.index'));
  22. $response->assertStatus(200)
  23. ->assertJsonStructure([
  24. 'data' => [
  25. '*' => [
  26. 'id',
  27. 'name',
  28. 'code',
  29. 'status',
  30. 'const',
  31. 'begin',
  32. 'end',
  33. 'available_days',
  34. ]
  35. ]
  36. ]);
  37. }
  38. public function test_project_create(): void
  39. {
  40. $form = Project::factory()->make();
  41. $form->whitelist = [
  42. 1
  43. ];
  44. $form->plans = [
  45. Plan::factory()->create()->id,
  46. Plan::factory()->create()->id,
  47. ];
  48. $form->assets = [
  49. Asset::factory()->create()->id,
  50. Asset::factory()->create()->id,
  51. ];
  52. $response = $this->post(route('project.store'), $form->toArray());
  53. $response->assertStatus(201);
  54. }
  55. public function test_project_update(): void
  56. {
  57. $project = Project::factory()->create();
  58. $form = Project::factory()->make();
  59. $form->whitelist = [1];
  60. $form->plans = [
  61. Plan::factory()->create()->id,
  62. Plan::factory()->create()->id,
  63. ];
  64. $form->assets = [
  65. Asset::factory()->create()->id,
  66. Asset::factory()->create()->id,
  67. ];
  68. $response = $this->put(route('project.update', ['project' => $project->id]), $form->toArray());
  69. $response->assertStatus(204);
  70. $newAsset = Project::find($project->id);
  71. $this->assertEquals($form->name, $newAsset->name);
  72. }
  73. public function test_project_delete(): void
  74. {
  75. $project = Project::factory()->create();
  76. $response = $this->delete(route('project.destroy', ['project' => $project->id]));
  77. $response->assertStatus(204);
  78. $this->assertNull(Project::find($project->id));
  79. }
  80. public function test_project_closed(): void
  81. {
  82. $project = Project::factory()->create();
  83. $response = $this->patch(route('project.closed', ['project' => $project->id]));
  84. $response->assertStatus(204);
  85. $this->assertEquals(Project::find($project->id)->status, ProjectStatus::CLOSED->value);
  86. }
  87. public function test_project_start(): void
  88. {
  89. $project = Project::factory()->create();
  90. $response = $this->patch(route('project.start', ['project' => $project->id]));
  91. $response->assertStatus(204);
  92. $this->assertEquals(Project::find($project->id)->status, ProjectStatus::DOING->value);
  93. }
  94. public function test_project_pause(): void
  95. {
  96. $project = Project::factory()->create();
  97. $response = $this->patch(route('project.pause', ['project' => $project->id]));
  98. $response->assertStatus(204);
  99. $this->assertEquals(Project::find($project->id)->status, ProjectStatus::PAUSE->value);
  100. }
  101. public function test_project_postpone(): void
  102. {
  103. $project = Project::factory()->create();
  104. $response = $this->patch(route('project.postpone', ['project' => $project->id]), [
  105. 'begin' => Carbon::now()->toDateString(),
  106. 'end' => Carbon::now()->addDays(3)->toDateString(),
  107. 'available_days' => 3,
  108. ]);
  109. $response->assertStatus(204);
  110. }
  111. public function test_project_plans(): void
  112. {
  113. $project = Project::factory()->create();
  114. $plan = Plan::factory()->create();
  115. $projectPlan = ProjectPlan::create([
  116. 'project_id' => $project->id,
  117. 'plan_id' => $plan->id,
  118. ]);
  119. $response = $this->get(route('project.plan', ['project' => $project->id]));
  120. $response->assertStatus(200)
  121. ->assertJsonStructure([
  122. 'data' => [
  123. '*' => [
  124. 'id',
  125. 'title'
  126. ]
  127. ]
  128. ])->assertJsonPath("data.0.id", $projectPlan->id);
  129. }
  130. public function test_project_not_link_asset_requirement(): void
  131. {
  132. $project = Project::factory()->create();
  133. $requirement = Requirement::factory()->create();
  134. ProjectAsset::create([
  135. 'project_id' => $project->id,
  136. 'asset_id' => $requirement->asset_id,
  137. ]);
  138. $response = $this->get(route('project.not-link-asset-requirement', ['project' => $project->id]));
  139. $response->assertStatus(200)
  140. ->assertJsonStructure($this->simplePaginateResponseStructure([
  141. 'id', 'title',
  142. ]))->assertJsonPath("data.0.id", $requirement->id);
  143. }
  144. public function test_link_requirement(): void
  145. {
  146. $project = Project::factory()->create();
  147. $requirement = Requirement::factory()->create();
  148. ProjectAsset::create([
  149. 'project_id' => $project->id,
  150. 'asset_id' => $requirement->asset_id,
  151. ]);
  152. $response = $this->patch(route('project.link-requirement', ['project' => $project->id]), [
  153. 'requirement_id' => $requirement->id,
  154. ]);
  155. $response->assertStatus(204);
  156. }
  157. public function test_unlink_requirement(): void
  158. {
  159. $project = Project::factory()->create();
  160. $requirement = Requirement::factory()->create();
  161. ProjectAsset::create([
  162. 'project_id' => $project->id,
  163. 'asset_id' => $requirement->asset_id,
  164. ]);
  165. ProjectRequirement::create([
  166. 'project_id' => $project->id,
  167. 'requirement_id' => $requirement->id,
  168. ]);
  169. $response = $this->patch(route('project.unlink-requirement', ['project' => $project->id]), [
  170. 'requirement_id' => $requirement->id,
  171. ]);
  172. $response->assertStatus(204);
  173. $count = ProjectRequirement::where([
  174. 'project_id' => $project->id,
  175. 'requirement_id' => $requirement->id,
  176. ])->count();
  177. $this->assertEquals(0, $count);
  178. }
  179. public function test_project_link_requirement_by_plan(): void
  180. {
  181. $project = Project::factory()->create();
  182. $plan = Plan::factory()->create();
  183. $requirement = Requirement::factory()->make();
  184. $requirement->asset_id = $plan->asset_id;
  185. $requirement->plan_id = $plan->id;
  186. $requirement->save();
  187. PlanRequirement::create([
  188. 'plan_id' => $plan->id,
  189. 'requirement_id' => $requirement->id,
  190. ]);
  191. $response = $this->patch(route('project.link-requirement-by-plan', ['project' => $project->id]), [
  192. 'plan_id' => $plan->id,
  193. ]);
  194. $response->assertStatus(204);
  195. $count = ProjectRequirement::where([
  196. 'project_id' => $project->id,
  197. 'requirement_id' => $requirement->id,
  198. ])->count();
  199. $this->assertEquals(1, $count);
  200. }
  201. public function test_project_requirement_list(): void
  202. {
  203. $project = Project::factory()->create();
  204. $requirements = Requirement::factory(30)->create();
  205. foreach ($requirements as $requirement) {
  206. ProjectRequirement::create([
  207. 'project_id' => $project->id,
  208. 'requirement_id' => $requirement->id,
  209. ]);
  210. }
  211. $response = $this->get(route('project.requirement', ['project' => $project->id]));
  212. $response->assertStatus(200)
  213. ->assertJsonStructure($this->simplePaginateResponseStructure([
  214. 'id', 'title', 'created_by', 'status'
  215. ]));
  216. }
  217. }