GroupControllerTest.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. namespace Tests\Unit\Api\v1\Controllers;
  3. use App\Api\v1\Controllers\GroupController;
  4. use App\Api\v1\Requests\GroupStoreRequest;
  5. use App\Api\v1\Resources\GroupResource;
  6. use App\Api\v1\Resources\TwoFAccountReadResource;
  7. use App\Facades\Groups;
  8. use App\Models\Group;
  9. use App\Models\User;
  10. use Illuminate\Foundation\Testing\WithoutMiddleware;
  11. use Illuminate\Http\Request;
  12. use Mockery;
  13. use PHPUnit\Framework\Attributes\CoversClass;
  14. use PHPUnit\Framework\Attributes\Test;
  15. use Tests\TestCase;
  16. /**
  17. * GroupControllerTest test class
  18. */
  19. #[CoversClass(GroupController::class)]
  20. class GroupControllerTest extends TestCase
  21. {
  22. use WithoutMiddleware;
  23. /**
  24. * @var \App\Models\User|\Illuminate\Contracts\Auth\Authenticatable
  25. */
  26. protected $user;
  27. protected function setUp() : void
  28. {
  29. parent::setUp();
  30. $this->user = new User;
  31. // We do not use $this->actingAs($this->user) to prevent intelephense
  32. // static analysis error. Dumb, but I don't like errors...
  33. $this->app['auth']->guard(null)->setUser($this->user);
  34. $this->app['auth']->shouldUse(null);
  35. }
  36. #[Test]
  37. public function test_index_returns_api_resources()
  38. {
  39. $user = Mockery::mock(User::class);
  40. $request = Mockery::mock(Request::class);
  41. $groups = Group::factory()->count(3)->make();
  42. $controller = new GroupController;
  43. $user->shouldReceive('groups->withCount->get')
  44. ->once()
  45. ->andReturn($groups);
  46. $request->shouldReceive('user')
  47. ->andReturn($user);
  48. Groups::shouldReceive('prependTheAllGroup')
  49. ->once()
  50. ->andReturn($groups);
  51. $response = $controller->index($request);
  52. $this->assertContainsOnlyInstancesOf(GroupResource::class, $response->collection);
  53. }
  54. #[Test]
  55. public function test_store_uses_validated_data_and_returns_api_resource()
  56. {
  57. $request = Mockery::mock(GroupStoreRequest::class);
  58. $controller = new GroupController;
  59. $group = Group::factory()->for($this->user)->make();
  60. $validated = ['name' => $group->name];
  61. $request->shouldReceive([
  62. 'validated' => $validated,
  63. 'user->groups->create' => $group,
  64. ]);
  65. $response = $controller->store($request);
  66. $this->assertInstanceOf(Group::class, $response->original);
  67. // $this->assertInstanceOf(GroupResource::class, $response);
  68. }
  69. #[Test]
  70. public function test_show_returns_api_resource()
  71. {
  72. $request = Mockery::mock(GroupStoreRequest::class);
  73. $controller = Mockery::mock(GroupController::class)->makePartial();
  74. $group = Group::factory()->make();
  75. $response = $controller->show($request, $group);
  76. $this->assertInstanceOf(GroupResource::class, $response);
  77. }
  78. #[Test]
  79. public function test_update_validates_data_and_returns_api_resource()
  80. {
  81. $request = Mockery::mock(GroupStoreRequest::class);
  82. $controller = Mockery::mock(GroupController::class)->makePartial();
  83. $group = Group::factory()->make();
  84. $validated = ['name' => $group->name];
  85. $request->shouldReceive([
  86. 'validated' => $validated,
  87. ]);
  88. $response = $controller->update($request, $group);
  89. $this->assertInstanceOf(GroupResource::class, $response);
  90. }
  91. // 26/03/25: Cannot be tested as a Unit test anymore because of the call to $group->loadCount()
  92. // in the assignAccounts() controller method. The loadCount() has been introduced
  93. // in the controller by commit 19f3a71c "Move group->loadCount from the Assign void method to the caller"
  94. // on Feb 24-2025 as part of the CWE-362 fix.
  95. // #[Test]
  96. // public function test_assignAccounts_returns_api_resource_assigned_using_groupService()
  97. // {
  98. // $request = Mockery::mock(GroupAssignRequest::class);
  99. // $controller = Mockery::mock(GroupController::class)->makePartial();
  100. // $group = Group::factory()->make();
  101. // $validated = ['ids' => $group->id];
  102. // $request->shouldReceive([
  103. // 'validated' => $validated,
  104. // 'user' => $this->user,
  105. // ]);
  106. // Groups::shouldReceive('assign')
  107. // ->with($group->id, $this->user, $group)
  108. // ->once();
  109. // $response = $controller->assignAccounts($request, $group);
  110. // $this->assertInstanceOf(GroupResource::class, $response);
  111. // }
  112. #[Test]
  113. public function test_accounts_returns_api_resources()
  114. {
  115. $request = Mockery::mock(GroupStoreRequest::class);
  116. $controller = Mockery::mock(GroupController::class)->makePartial();
  117. $group = Group::factory()->make();
  118. $response = $controller->accounts($request, $group);
  119. $this->assertContainsOnlyInstancesOf(TwoFAccountReadResource::class, $response->collection);
  120. }
  121. #[Test]
  122. public function test_destroy_uses_group_service()
  123. {
  124. $controller = Mockery::mock(GroupController::class)->makePartial();
  125. $group = Group::factory()->make();
  126. $group->id = 0;
  127. $response = $controller->destroy($group);
  128. $this->assertInstanceOf('Illuminate\Http\JsonResponse', $response);
  129. $this->assertEquals(204, $response->status());
  130. }
  131. }