GroupControllerTest.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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\User;
  11. use Illuminate\Foundation\Testing\WithoutMiddleware;
  12. use Illuminate\Http\Request;
  13. use Mockery;
  14. use PHPUnit\Framework\Attributes\CoversClass;
  15. use PHPUnit\Framework\Attributes\Test;
  16. use Tests\TestCase;
  17. /**
  18. * GroupControllerTest test class
  19. */
  20. #[CoversClass(GroupController::class)]
  21. class GroupControllerTest extends TestCase
  22. {
  23. use WithoutMiddleware;
  24. /**
  25. * @var \App\Models\User|\Illuminate\Contracts\Auth\Authenticatable
  26. */
  27. protected $user;
  28. public function setUp() : void
  29. {
  30. parent::setUp();
  31. $this->user = new User();
  32. // We do not use $this->actingAs($this->user) to prevent intelephense
  33. // static analysis error. Dumb, but I don't like errors...
  34. $this->app['auth']->guard(null)->setUser($this->user);
  35. $this->app['auth']->shouldUse(null);
  36. }
  37. #[Test]
  38. public function test_index_returns_api_resources()
  39. {
  40. $user = Mockery::mock(User::class);
  41. $request = Mockery::mock(Request::class);
  42. $groups = Group::factory()->count(3)->make();
  43. $controller = new GroupController();
  44. $user->shouldReceive('groups->withCount->get')
  45. ->once()
  46. ->andReturn($groups);
  47. $request->shouldReceive('user')
  48. ->andReturn($user);
  49. Groups::shouldReceive('prependTheAllGroup')
  50. ->once()
  51. ->andReturn($groups);
  52. $response = $controller->index($request);
  53. $this->assertContainsOnlyInstancesOf(GroupResource::class, $response->collection);
  54. }
  55. #[Test]
  56. public function test_store_uses_validated_data_and_returns_api_resource()
  57. {
  58. $request = Mockery::mock(GroupStoreRequest::class);
  59. $controller = new GroupController();
  60. $group = Group::factory()->for($this->user)->make();
  61. $validated = ['name' => $group->name];
  62. $request->shouldReceive([
  63. 'validated' => $validated,
  64. 'user->groups->create' => $group,
  65. ]);
  66. $response = $controller->store($request);
  67. $this->assertInstanceOf(Group::class, $response->original);
  68. // $this->assertInstanceOf(GroupResource::class, $response);
  69. }
  70. #[Test]
  71. public function test_show_returns_api_resource()
  72. {
  73. $controller = Mockery::mock(GroupController::class)->makePartial();
  74. $group = Group::factory()->make();
  75. $response = $controller->show($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. #[Test]
  92. public function test_assignAccounts_returns_api_resource_assigned_using_groupService()
  93. {
  94. $request = Mockery::mock(GroupAssignRequest::class);
  95. $controller = Mockery::mock(GroupController::class)->makePartial();
  96. $group = Group::factory()->make();
  97. $validated = ['ids' => $group->id];
  98. $request->shouldReceive([
  99. 'validated' => $validated,
  100. 'user' => $this->user,
  101. ]);
  102. Groups::shouldReceive('assign')
  103. ->with($group->id, $this->user, $group)
  104. ->once();
  105. $response = $controller->assignAccounts($request, $group);
  106. $this->assertInstanceOf(GroupResource::class, $response);
  107. }
  108. #[Test]
  109. public function test_accounts_returns_api_resources()
  110. {
  111. $controller = Mockery::mock(GroupController::class)->makePartial();
  112. $group = Group::factory()->make();
  113. $response = $controller->accounts($group);
  114. $this->assertContainsOnlyInstancesOf(TwoFAccountReadResource::class, $response->collection);
  115. }
  116. #[Test]
  117. public function test_destroy_uses_group_service()
  118. {
  119. $controller = Mockery::mock(GroupController::class)->makePartial();
  120. $group = Group::factory()->make();
  121. $group->id = 0;
  122. $response = $controller->destroy($group);
  123. $this->assertInstanceOf('Illuminate\Http\JsonResponse', $response);
  124. $this->assertEquals(204, $response->status());
  125. }
  126. }