ProjectTest.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  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_detail()
  39. {
  40. $project = Project::factory()->create();
  41. $response = $this->get(route('project.show', ['project' => $project->id]));
  42. $response->assertStatus(200)
  43. ->assertJsonStructure([
  44. 'data' => [
  45. 'id',
  46. 'name',
  47. 'code',
  48. 'status',
  49. 'const',
  50. 'begin',
  51. 'end',
  52. 'available_days',
  53. 'latitude',
  54. 'longitude',
  55. 'type',
  56. 'acl',
  57. 'whitelist',
  58. 'description',
  59. ]
  60. ]);
  61. }
  62. public function test_project_create(): void
  63. {
  64. $form = Project::factory()->make();
  65. $form->whitelist = [
  66. 1
  67. ];
  68. $form->plans = [
  69. Plan::factory()->create()->id,
  70. Plan::factory()->create()->id,
  71. ];
  72. $form->assets = [
  73. Asset::factory()->create()->id,
  74. Asset::factory()->create()->id,
  75. ];
  76. $response = $this->post(route('project.store'), $form->toArray());
  77. $response->assertStatus(201);
  78. }
  79. public function test_project_update(): void
  80. {
  81. $project = Project::factory()->create();
  82. $form = Project::factory()->make();
  83. $form->whitelist = [1];
  84. $form->plans = [
  85. Plan::factory()->create()->id,
  86. Plan::factory()->create()->id,
  87. ];
  88. $form->assets = [
  89. Asset::factory()->create()->id,
  90. Asset::factory()->create()->id,
  91. ];
  92. $response = $this->put(route('project.update', ['project' => $project->id]), $form->toArray());
  93. $response->assertStatus(204);
  94. $newAsset = Project::find($project->id);
  95. $this->assertEquals($form->name, $newAsset->name);
  96. }
  97. public function test_project_delete(): void
  98. {
  99. $project = Project::factory()->create();
  100. $response = $this->delete(route('project.destroy', ['project' => $project->id]));
  101. $response->assertStatus(204);
  102. $this->assertNull(Project::find($project->id));
  103. }
  104. public function test_project_closed(): void
  105. {
  106. $project = Project::factory()->create();
  107. $response = $this->patch(route('project.closed', ['project' => $project->id]));
  108. $response->assertStatus(204);
  109. $this->assertEquals(Project::find($project->id)->status, ProjectStatus::CLOSED->value);
  110. }
  111. public function test_project_start(): void
  112. {
  113. $project = Project::factory()->create();
  114. $response = $this->patch(route('project.start', ['project' => $project->id]));
  115. $response->assertStatus(204);
  116. $this->assertEquals(Project::find($project->id)->status, ProjectStatus::DOING->value);
  117. }
  118. public function test_project_pause(): void
  119. {
  120. $project = Project::factory()->create();
  121. $response = $this->patch(route('project.pause', ['project' => $project->id]));
  122. $response->assertStatus(204);
  123. $this->assertEquals(Project::find($project->id)->status, ProjectStatus::PAUSE->value);
  124. }
  125. public function test_project_postpone(): void
  126. {
  127. $project = Project::factory()->create();
  128. $response = $this->patch(route('project.postpone', ['project' => $project->id]), [
  129. 'begin' => Carbon::now()->toDateString(),
  130. 'end' => Carbon::now()->addDays(3)->toDateString(),
  131. 'available_days' => 3,
  132. ]);
  133. $response->assertStatus(204);
  134. }
  135. public function test_project_plans(): void
  136. {
  137. $project = Project::factory()->create();
  138. $plan = Plan::factory()->create();
  139. $projectPlan = ProjectPlan::create([
  140. 'project_id' => $project->id,
  141. 'plan_id' => $plan->id,
  142. ]);
  143. $response = $this->get(route('project.plan', ['project' => $project->id]));
  144. $response->assertStatus(200)
  145. ->assertJsonStructure([
  146. 'data' => [
  147. '*' => [
  148. 'id',
  149. 'title'
  150. ]
  151. ]
  152. ])->assertJsonPath("data.0.id", $projectPlan->id);
  153. }
  154. public function test_project_not_link_asset_requirement(): void
  155. {
  156. $project = Project::factory()->create();
  157. $requirement = Requirement::factory()->create();
  158. ProjectAsset::create([
  159. 'project_id' => $project->id,
  160. 'asset_id' => $requirement->asset_id,
  161. ]);
  162. $response = $this->get(route('project.not-link-asset-requirement', ['project' => $project->id]));
  163. $response->assertStatus(200)
  164. ->assertJsonStructure($this->simplePaginateResponseStructure([
  165. 'id', 'title',
  166. ]))->assertJsonPath("data.0.id", $requirement->id);
  167. }
  168. public function test_link_requirement(): void
  169. {
  170. $project = Project::factory()->create();
  171. $requirement = Requirement::factory()->create();
  172. ProjectAsset::create([
  173. 'project_id' => $project->id,
  174. 'asset_id' => $requirement->asset_id,
  175. ]);
  176. $response = $this->patch(route('project.link-requirement', ['project' => $project->id]), [
  177. 'requirement_id' => $requirement->id,
  178. ]);
  179. $response->assertStatus(204);
  180. }
  181. public function test_unlink_requirement(): void
  182. {
  183. $project = Project::factory()->create();
  184. $requirement = Requirement::factory()->create();
  185. ProjectAsset::create([
  186. 'project_id' => $project->id,
  187. 'asset_id' => $requirement->asset_id,
  188. ]);
  189. ProjectRequirement::create([
  190. 'project_id' => $project->id,
  191. 'requirement_id' => $requirement->id,
  192. ]);
  193. $response = $this->patch(route('project.unlink-requirement', ['project' => $project->id]), [
  194. 'requirement_id' => $requirement->id,
  195. ]);
  196. $response->assertStatus(204);
  197. $count = ProjectRequirement::where([
  198. 'project_id' => $project->id,
  199. 'requirement_id' => $requirement->id,
  200. ])->count();
  201. $this->assertEquals(0, $count);
  202. }
  203. public function test_project_link_requirement_by_plan(): void
  204. {
  205. $project = Project::factory()->create();
  206. $plan = Plan::factory()->create();
  207. $requirement = Requirement::factory()->make();
  208. $requirement->asset_id = $plan->asset_id;
  209. $requirement->plan_id = $plan->id;
  210. $requirement->save();
  211. PlanRequirement::create([
  212. 'plan_id' => $plan->id,
  213. 'requirement_id' => $requirement->id,
  214. ]);
  215. $response = $this->patch(route('project.link-requirement-by-plan', ['project' => $project->id]), [
  216. 'plan_id' => $plan->id,
  217. ]);
  218. $response->assertStatus(204);
  219. $count = ProjectRequirement::where([
  220. 'project_id' => $project->id,
  221. 'requirement_id' => $requirement->id,
  222. ])->count();
  223. $this->assertEquals(1, $count);
  224. }
  225. public function test_project_requirement_list(): void
  226. {
  227. $project = Project::factory()->create();
  228. $requirements = Requirement::factory(30)->create();
  229. foreach ($requirements as $requirement) {
  230. ProjectRequirement::create([
  231. 'project_id' => $project->id,
  232. 'requirement_id' => $requirement->id,
  233. ]);
  234. }
  235. $response = $this->get(route('project.requirement', ['project' => $project->id]));
  236. $response->assertStatus(200)
  237. ->assertJsonStructure($this->simplePaginateResponseStructure([
  238. 'id', 'title', 'created_by', 'status'
  239. ]));
  240. }
  241. }