GroupControllerTest.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <?php
  2. namespace Tests\Unit\Api\v1\Controllers;
  3. use App\Api\v1\Controllers\GroupController;
  4. use App\Api\v1\Requests\GroupAssignRequest;
  5. use App\Api\v1\Requests\GroupStoreRequest;
  6. use App\Api\v1\Resources\GroupResource;
  7. use App\Api\v1\Resources\TwoFAccountReadResource;
  8. use App\Facades\Groups;
  9. use App\Models\Group;
  10. use App\Models\TwoFAccount;
  11. use App\Models\User;
  12. use Illuminate\Foundation\Testing\WithoutMiddleware;
  13. use Illuminate\Http\Request;
  14. use Mockery;
  15. use Tests\TestCase;
  16. /**
  17. * @covers \App\Api\v1\Controllers\GroupController
  18. */
  19. class GroupControllerTest extends TestCase
  20. {
  21. use WithoutMiddleware;
  22. /**
  23. * @var \App\Api\v1\Controllers\GroupController tested controller
  24. */
  25. protected $controller;
  26. /**
  27. * @var \App\Api\v1\Requests\GroupStoreRequest mocked request
  28. */
  29. protected $groupStoreRequest;
  30. /**
  31. * @var \App\Models\User mocked user
  32. */
  33. protected $user;
  34. /**
  35. * @var \Illuminate\Http\Request mocked request
  36. */
  37. protected $request;
  38. public function setUp() : void
  39. {
  40. parent::setUp();
  41. $this->groupStoreRequest = Mockery::mock(GroupStoreRequest::class);
  42. $this->request = Mockery::mock(Request::class);
  43. $this->request->shouldReceive('user')
  44. ->andReturn(new User());
  45. $this->controller = new GroupController();
  46. }
  47. /**
  48. * @test
  49. */
  50. public function test_index_returns_api_resources_using_groupService()
  51. {
  52. $groups = Group::factory()->count(3)->make();
  53. Groups::shouldReceive('for')
  54. ->with($this->request->user())
  55. ->once()
  56. ->andReturnSelf()
  57. ->shouldReceive('withTheAllGroup')
  58. ->once()
  59. ->andReturnSelf()
  60. ->shouldReceive('all')
  61. ->once()
  62. ->andReturn($groups);
  63. $response = $this->controller->index($this->request);
  64. $this->assertContainsOnlyInstancesOf(GroupResource::class, $response->collection);
  65. }
  66. /**
  67. * @test
  68. */
  69. public function test_store_returns_api_resource_stored_using_groupService()
  70. {
  71. $group = Group::factory()->make();
  72. $validated = ['name' => $group->name];
  73. $this->groupStoreRequest->shouldReceive([
  74. 'validated' => $validated,
  75. 'user' => new User(),
  76. ]);
  77. Groups::shouldReceive('for')
  78. ->with($this->groupStoreRequest->user())
  79. ->once()
  80. ->andReturnSelf()
  81. ->shouldReceive('create')
  82. ->with($validated)
  83. ->once()
  84. ->andReturn($group);
  85. $response = $this->controller->store($this->groupStoreRequest);
  86. $this->assertInstanceOf(Group::class, $response->original);
  87. // $this->assertInstanceOf(GroupResource::class, $response);
  88. }
  89. /**
  90. * @test
  91. */
  92. public function test_show_returns_api_resource_using_groupService()
  93. {
  94. $group = Group::factory()->make();
  95. Groups::shouldReceive('for')
  96. ->with($this->request->user())
  97. ->once()
  98. ->andReturnSelf()
  99. ->shouldReceive('get')
  100. ->with($group->id)
  101. ->once()
  102. ->andReturn($group);
  103. $response = $this->controller->show($group, $this->request);
  104. $this->assertInstanceOf(GroupResource::class, $response);
  105. }
  106. /**
  107. * @test
  108. */
  109. public function test_update_returns_api_resource_updated_using_groupService()
  110. {
  111. $group = Group::factory()->make();
  112. $validated = ['name' => $group->name];
  113. $this->groupStoreRequest->shouldReceive([
  114. 'validated' => $validated,
  115. 'user' => new User(),
  116. ]);
  117. Groups::shouldReceive('for')
  118. ->with($this->groupStoreRequest->user())
  119. ->once()
  120. ->andReturnSelf()
  121. ->shouldReceive('update')
  122. ->with($group, $validated)
  123. ->once()
  124. ->andReturn($group);
  125. $response = $this->controller->update($this->groupStoreRequest, $group);
  126. $this->assertInstanceOf(GroupResource::class, $response);
  127. }
  128. /**
  129. * @test
  130. */
  131. public function test_assignAccounts_returns_api_resource_assigned_using_groupService()
  132. {
  133. $group = Group::factory()->make();
  134. $groupAssignRequest = Mockery::mock(GroupAssignRequest::class);
  135. $validated = ['ids' => $group->id];
  136. $groupAssignRequest->shouldReceive([
  137. 'validated' => $validated,
  138. 'user' => new User(),
  139. ]);
  140. Groups::shouldReceive('for')
  141. ->with($groupAssignRequest->user())
  142. ->once()
  143. ->andReturnSelf()
  144. ->shouldReceive('assign')
  145. ->with($group->id, $group)
  146. ->once();
  147. $response = $this->controller->assignAccounts($groupAssignRequest, $group);
  148. $this->assertInstanceOf(GroupResource::class, $response);
  149. }
  150. /**
  151. * @test
  152. */
  153. public function test_accounts_returns_api_resources_fetched_using_groupService()
  154. {
  155. $group = Group::factory()->make();
  156. $groupAccounts = new TwoFAccount();
  157. $groupAccounts = $groupAccounts->newCollection(
  158. array(
  159. new TwoFAccount(),
  160. new TwoFAccount()
  161. )
  162. );
  163. Groups::shouldReceive('for')
  164. ->with($this->request->user())
  165. ->once()
  166. ->andReturnSelf()
  167. ->shouldReceive('accounts')
  168. ->with($group)
  169. ->once()
  170. ->andReturn($groupAccounts);
  171. $response = $this->controller->accounts($group, $this->request);
  172. $this->assertContainsOnlyInstancesOf(TwoFAccountReadResource::class, $response->collection);
  173. }
  174. /**
  175. * @test
  176. */
  177. public function test_destroy_uses_group_service()
  178. {
  179. $group = Group::factory()->make();
  180. $group->id = 0;
  181. Groups::shouldReceive('for')
  182. ->with($this->request->user())
  183. ->once()
  184. ->andReturnSelf()
  185. ->shouldReceive('delete')
  186. ->with($group->id)
  187. ->once()
  188. ->andReturn(1);
  189. $response = $this->controller->destroy($group, $this->request);
  190. $this->assertInstanceOf('Illuminate\Http\JsonResponse', $response);
  191. }
  192. }