createUser('admin@admin.com', ['ROLE_SUPER_ADMIN']); $this->client->loginUser($admin); $this->client->request('GET', '/user/'); self::assertResponseIsSuccessful(); self::assertSelectorTextNotContains('body', 'Aucun utilisateur trouvé'); self::assertSelectorExists('#tabulator-userList'); } #[Test] public function test_index_regular_user_forbidden(): void { // 1. Arrange $user = $this->createUser('user@mail.com'); $this->client->loginUser($user); // 2. Act $this->client->request('GET', '/user/'); // 3. Assert self::assertResponseStatusCodeSame(403); } //Can't test for no users as page is designed to always have at least one user (the logged in one) //endregion //region Show Tests #[Test] public function test_view_super_admin(): void { $admin = $this->createUser('admin@admin', ['ROLE_SUPER_ADMIN']); $this->client->loginUser($admin); $role = $this->createRole('ADMIN'); $role2 = $this->createRole('EMPTY'); $app = $this->createApp('Test App'); $organization = $this->createOrganization('Test Org'); $uo = $this->createUOLink($admin, $organization); $uoa = $this->createUOALink($uo, $app, $role); $this->client->request('GET', '/user/view/' . $admin->getId()); self::assertResponseIsSuccessful(); self::assertSelectorTextContains('body', $admin->getEmail()); self::assertSelectorTextContains('body', $admin->getName()); self::assertSelectorTextContains('body', $app->getName()); self::assertSelectorTextContains('body', ucfirst(strtolower($role->getName()))); self::assertCheckboxChecked("roles[]", ucfirst(strtolower($role->getName()))); } #[Test] public function test_view_regular_user_forbidden(): void { // 1. Arrange $user = $this->createUser('user@email.com'); $user2 = $this->createUser('user2@email.com'); $this->client->loginUser($user); // 2. Act $this->client->request('GET', '/user/view/' . $user2->getId()); // 3. Assert self::assertResponseStatusCodeSame(403); } #[Test] public function test_view_admin(): void { $admin = $this->createUser('admin@admin', ['ROLE_ADMIN']); $user = $this->createUser('user@admin'); $this->client->loginUser($admin); $role = $this->createRole('ADMIN'); $role2 = $this->createRole('USER'); $app = $this->createApp('Test App'); $organization = $this->createOrganization('Test Org'); $uo = $this->createUOLink($admin, $organization); $uo2 = $this->createUOLink($user, $organization); $uoa = $this->createUOALink($uo, $app, $role); $uoa2 = $this->createUOALink($uo2, $app, $role2); $this->client->request('GET', '/user/view/' . $user->getId() . '?organizationId=' . $organization->getId()); self::assertResponseIsSuccessful(); self::assertSelectorTextContains('body', $user->getEmail()); self::assertSelectorTextContains('body', $user->getName()); self::assertSelectorTextContains('body', $app->getName()); self::assertSelectorTextContains('body', ucfirst(strtolower($role->getName()))); } #[Test] public function test_view_admin_different_organization_forbidden(): void { $admin = $this->createUser('admin@admin', ['ROLE_ADMIN']); $user = $this->createUser('user@admin'); $this->client->loginUser($admin); $role = $this->createRole('ADMIN'); $role2 = $this->createRole('USER'); $app = $this->createApp('Test App'); $organization = $this->createOrganization('Test Org'); $organization2 = $this->createOrganization('Test Org2'); $uo = $this->createUOLink($admin, $organization); $uo2 = $this->createUOLink($user, $organization2); $uoa = $this->createUOALink($uo, $app, $role); $uoa2 = $this->createUOALink($uo2, $app, $role2); $this->client->request('GET', '/user/view/' . $user->getId() . '?organizationId=' . $organization->getId()); self::assertResponseStatusCodeSame(403); } #[Test] public function test_view_user_self_success(): void { $user = $this->createUser('user@email.com'); $this->client->loginUser($user); $this->client->request('GET', '/user/view/' . $user->getId()); self::assertResponseIsSuccessful(); self::assertSelectorTextContains('body', $user->getEmail()); } #[Test] public function test_view_user_self_with_organization_success(): void { $user = $this->createUser('user@email.com'); $organization = $this->createOrganization('Test Org'); $uo = $this->createUOLink($user, $organization); $this->client->loginUser($user); $this->client->request('GET', '/user/view/' . $user->getId()); self::assertResponseIsSuccessful(); self::assertSelectorTextContains('body', $user->getEmail()); } #[Test] public function test_view_user_not_found(): void { $admin = $this->createUser('admin@admin', ['ROLE_SUPER_ADMIN']); $this->client->loginUser($admin); $this->client->request('GET', '/user/view/999999'); self::assertResponseStatusCodeSame(404); } //endregion //region Edit Tests #[Test] public function test_edit_super_admin_success(): void { $admin = $this->createUser('admin@admin', ['ROLE_SUPER_ADMIN']); $this->client->loginUser($admin); $this->client->request('GET', '/user/edit/' . $admin->getId()); self::assertResponseIsSuccessful(); self::assertSelectorTextContains('body', 'Modifier l\'utilisateur'); } #[Test] public function test_edit_regular_user_forbidden(): void { // 1. Arrange $user = $this->createUser('user@mail.com'); $this->client->loginUser($user); // 2. Act $this->client->request('GET', '/user/edit/' . $user->getId()); // 3. Assert self::assertResponseIsSuccessful(); self::assertSelectorTextContains('body', 'Modifier l\'utilisateur'); } #[Test] public function test_edit_other_user_forbidden(): void { // 1. Arrange $user = $this->createUser('user@email.com'); $user2 = $this->createUser('user2@email.com'); $this->client->loginUser($user); // 2. Act $this->client->request('GET', '/user/edit/' . $user2->getId()); // 3. Assert self::assertResponseStatusCodeSame(403); } #[Test] public function test_edit_user_not_found(): void { $admin = $this->createUser('admin@admin', ['ROLE_SUPER_ADMIN']); $this->client->loginUser($admin); $this->client->request('GET', '/user/edit/999999'); self::assertResponseStatusCodeSame(404); } #[Test] public function test_edit_super_admin_edit_other_user_success(): void { // 1. Arrange: Disable reboot to keep our AWS mock alive $this->client->disableReboot(); $admin = $this->createUser('admin@user.com', ['ROLE_SUPER_ADMIN']); $this->client->loginUser($admin); // 2. MOCK AWS Service (Crucial!) // Your code calls $awsService->PutDocObj, so we must intercept that. // 2. MOCK AWS Service $awsMock = $this->createMock(AwsService::class); $awsMock->expects($this->any()) ->method('PutDocObj') ->willReturn(1); // <--- FIXED: Return an integer, not a boolean // Inject the mock into the test container static::getContainer()->set(AwsService::class, $awsMock); // 3. Create a Dummy Image File $tempFile = tempnam(sys_get_temp_dir(), 'test_logo'); file_put_contents($tempFile, 'fake image content'); // Create a dummy file $logo = new UploadedFile( $tempFile, 'logo.png', 'image/png', null, true // 'test' mode = true ); // 4. Act: Submit the Edit Form $this->client->request('GET', '/user/edit/' . $admin->getId()); $this->client->submitForm('Enregistrer', [ 'user_form[email]' => 'new@mail.com', 'user_form[name]' => 'New Name', 'user_form[pictureUrl]' => $logo, ]); // 5. Assert self::assertResponseRedirects('/user/view/' . $admin->getId()); $this->client->followRedirect(); self::assertSelectorTextContains('body', 'new@mail.com'); // Clean up the temporary file} unlink($tempFile); } #[Test] public function test_edit_admin_user_not_found(): void { $admin = $this->createUser('admin@admin', ['ROLE_SUPER_ADMIN']); $this->client->loginUser($admin); $this->client->request('GET', '/user/edit/999999'); self::assertResponseStatusCodeSame(404); } #[Test] public function test_edit_admin_edit_other_user_success(): void { // 1. Arrange: Disable reboot to keep our AWS mock alive $this->client->disableReboot(); $admin = $this->createUser('admin@user.com', ['ROLE_ADMIN']); $user = $this->createUser('user@user.com'); $this->client->loginUser($admin); $org = $this->createOrganization('Test Org'); $uoAdmin = $this->createUOLink($admin, $org); $uoUser = $this->createUOLink($user, $org); $app = $this->createApp('Test App'); $roleAdmin = $this->createRole('ADMIN'); $roleUser = $this->createRole('USER'); $this->createUOALink($uoAdmin, $app, $roleAdmin); $this->createUOALink($uoUser, $app, $roleUser); // 2. MOCK AWS Service (Crucial!) // Your code calls $awsService->PutDocObj, so we must intercept that. // 2. MOCK AWS Service $awsMock = $this->createMock(AwsService::class); $awsMock->expects($this->any()) ->method('PutDocObj') ->willReturn(1); // <--- FIXED: Return an integer, not a boolean // Inject the mock into the test container static::getContainer()->set(AwsService::class, $awsMock); // 3. Create a Dummy Image File $tempFile = tempnam(sys_get_temp_dir(), 'test_logo'); file_put_contents($tempFile, 'fake image content'); // Create a dummy file $logo = new UploadedFile( $tempFile, 'logo.png', 'image/png', null, true // 'test' mode = true ); // 4. Act: Submit the Edit Form $this->client->request('GET', '/user/edit/' . $user->getId() . '?organizationId=' . $org->getId()); $this->client->submitForm('Enregistrer', [ 'user_form[email]' => 'new@mail.com', 'user_form[name]' => 'New Name', 'user_form[pictureUrl]' => $logo, ]); // 5. Assert self::assertResponseRedirects('/user/view/' . $user->getId() . '?organizationId=' . $org->getId()); $this->client->followRedirect(); self::assertSelectorTextContains('body', 'new@mail.com'); // Clean up the temporary file} unlink($tempFile); } #[Test] public function test_edit_admin_edit_other_user_different_organization_forbidden(): void { // 1. Arrange: Disable reboot to keep our AWS mock alive $this->client->disableReboot(); $admin = $this->createUser('admin@user.com', ['ROLE_ADMIN']); $user = $this->createUser('user@user.com'); $this->client->loginUser($admin); $org = $this->createOrganization('Test Org'); $org2 = $this->createOrganization('Test Org2'); $uoAdmin = $this->createUOLink($admin, $org); $uoUser = $this->createUOLink($user, $org2); $app = $this->createApp('Test App'); $roleAdmin = $this->createRole('ADMIN'); $roleUser = $this->createRole('USER'); $this->createUOALink($uoAdmin, $app, $roleAdmin); $this->createUOALink($uoUser, $app, $roleUser); // 2. MOCK AWS Service (Crucial!) // Your code calls $awsService->PutDocObj, so we must intercept that. // 2. MOCK AWS Service $awsMock = $this->createMock(AwsService::class); $awsMock->expects($this->any()) ->method('PutDocObj') ->willReturn(1); // <--- FIXED: Return an integer, not a boolean // Inject the mock into the test container static::getContainer()->set(AwsService::class, $awsMock); // 3. Create a Dummy Image File $tempFile = tempnam(sys_get_temp_dir(), 'test_logo'); file_put_contents($tempFile, 'fake image content'); // Create a dummy file $logo = new UploadedFile( $tempFile, 'logo.png', 'image/png', null, true // 'test' mode = true ); // 4. Act: Submit the Edit Form $this->client->request('GET', '/user/edit/' . $user->getId() . '?organizationId=' . $org2->getId()); // 5. Assert self::assertResponseStatusCodeSame(403); } #[Test] public function test_edit_user_not_found_admin(): void { $admin = $this->createUser('admin@admin', ['ROLE_ADMIN']); $this->client->loginUser($admin); $this->client->request('GET', '/user/edit/999999'); self::assertResponseStatusCodeSame(404); } #[Test] public function test_edit_user_self_success(): void { $user = $this->createUser('user@email.com'); $this->client->loginUser($user); $this->client->request('GET', '/user/edit/' . $user->getId()); self::assertResponseIsSuccessful(); self::assertSelectorTextContains('body', 'Modifier l\'utilisateur'); $this->client->submitForm('Enregistrer', [ 'user_form[email]' => 'new@email.com', 'user_form[name]' => 'New Name', ]); self::assertResponseRedirects('/user/view/' . $user->getId()); $this->client->followRedirect(); self::assertSelectorTextContains('body', 'new@email.com'); } #[Test] public function test_edit_user_self_with_organization_success(): void { $user = $this->createUser('user@email.com'); $this->client->loginUser($user); $org = $this->createOrganization('Test Org'); $this->createUOLink($user, $org); $this->client->request('GET', '/user/edit/' . $user->getId() . '?organizationId=' . $org->getId()); self::assertResponseIsSuccessful(); self::assertSelectorTextContains('body', 'Modifier l\'utilisateur'); $this->client->submitForm('Enregistrer', [ 'user_form[email]' => 'new@email.com', 'user_form[name]' => 'New Name', ]); self::assertResponseRedirects('/user/view/' . $user->getId() . '?organizationId=' . $org->getId()); $this->client->followRedirect(); self::assertSelectorTextContains('body', 'new@email.com'); } //endregion //region Create Tests #[Test] public function test_create_super_admin_forbidden(): void { $admin = $this->createUser('admin@admin.com', ['ROLE_SUPER_ADMIN']); $this->client->loginUser($admin); $this->client->request('GET', '/user/new'); $this->client->followRedirect(); self::assertResponseIsSuccessful(); self::assertSelectorTextContains('body', 'Accès non autorisé.'); } #[Test] public function test_create_regular_user_forbidden(): void { // 1. Arrange $user = $this->createUser('user@email.com'); $this->client->loginUser($user); // 2. Act $this->client->request('GET', '/user/new'); // 3. Assert self::assertResponseStatusCodeSame(403); } #[Test] public function test_create_admin_forbidden(): void { // 1. Arrange $admin = $this->createUser('admin@email.com', ['ROLE_ADMIN']); $this->client->loginUser($admin); // 2. Act $this->client->request('GET', '/user/new'); // 3. Assert self::assertResponseRedirects('/user/'); $this->client->followRedirect(); self::assertResponseStatusCodeSame(403); } #[Test] public function test_create_super_admin_valid(): void { $admin = $this->createUser('admin@admin.com', ['ROLE_SUPER_ADMIN']); $this->client->loginUser($admin); $org = $this->createOrganization('Test Org'); $uo = $this->createUOLink($admin, $org); $app = $this->createApp('Test App'); $role = $this->createRole('ADMIN'); $this->createUOALink($uo, $app, $role); $this->client->request('GET', '/user/new?organizationId=' . $org->getId()); self::assertResponseIsSuccessful(); $this->client->submitForm('Enregistrer', [ 'user_form[email]' => 'email@email.com', 'user_form[name]' => 'name', 'user_form[surname]' => 'surname' ]); self::assertResponseRedirects('/organization/view/' . $org->getId()); $this->client->followRedirect(); self::assertCount(2, $this->entityManager->getRepository(User::class)->findAll()); self::assertCount(2, $this->entityManager->getRepository(UsersOrganizations::class)->findAll()); } #[Test] public function test_create_admin_valid(): void { $admin = $this->createUser('admin@admin.com', ['ROLE_ADMIN']); $this->client->loginUser($admin); $org = $this->createOrganization('Test Org'); $uo = $this->createUOLink($admin, $org); $app = $this->createApp('Test App'); $role = $this->createRole('ADMIN'); $this->createUOALink($uo, $app, $role); $this->client->request('GET', '/user/new?organizationId=' . $org->getId()); self::assertResponseIsSuccessful(); $this->client->submitForm('Enregistrer', [ 'user_form[email]' => 'email@email.com', 'user_form[name]' => 'name', 'user_form[surname]' => 'surname' ]); self::assertResponseRedirects('/organization/view/' . $org->getId()); $this->client->followRedirect(); self::assertCount(2, $this->entityManager->getRepository(User::class)->findAll()); self::assertCount(2, $this->entityManager->getRepository(UsersOrganizations::class)->findAll()); } #[Test] public function test_create_admin_no_organization_forbidden(): void { $admin = $this->createUser('user@email.com', ['ROLE_ADMIN']); $this->client->loginUser($admin); $this->client->request('GET', '/user/new'); self::assertResponseRedirects('/user/'); $this->client->followRedirect(); self::assertResponseStatusCodeSame(403); } //endregion //region Delete Tests #[Test] public function test_delete_super_admin_success(): void { $admin = $this->createUser('admin@admin.com', ['ROLE_SUPER_ADMIN']); $user = $this->createUser('user@emai.com'); $this->client->loginUser($admin); $org = $this->createOrganization('Test Org'); $app = $this->createApp('Test App'); $role = $this->createRole('USER'); $uoUser = $this->createUOLink($user, $org); $this->createUOALink($uoUser, $app, $role); $this->client->request('POST', '/user/delete/' . $user->getId()); self::assertResponseRedirects('/user/'); $this->client->followRedirect(); self::assertCount(2, $this->entityManager->getRepository(User::class)->findAll()); self::assertCount(1, $this->entityManager->getRepository(UsersOrganizations::class)->findAll()); self::assertCount(1, $this->entityManager->getRepository(UserOrganizationApp::class)->findAll()); } #[Test] public function test_delete_admin_forbidden(): void { $admin = $this->createUser('admin@email.com', ['ROLE_ADMIN']); $user = $this->createUser('user@email.com'); $this->client->loginUser($admin); $this->client->request('POST', '/user/delete/' . $user->getId()); self::assertResponseStatusCodeSame(403); } #[Test] public function test_delete_not_found(): void { $admin = $this->createUser('admin@eamil.com', ['ROLE_SUPER_ADMIN']); $this->client->loginUser($admin); $this->client->request('POST', '/user/delete/999999'); self::assertResponseStatusCodeSame(404); } //endregion // même erreur que pour la sécurité. Problème lié au SSO. //region activate/deactivate tests // #[Test] // public function test_deactivate_super_admin_success(): void // { // $admin = $this->createUser('admin@email.com', ['ROLE_SUPER_ADMIN']); // $user = $this->createUser('user@email.com'); // $this->client->loginUser($admin); // $org = $this->createOrganization('Test Org'); // $app = $this->createApp('Test App'); // $role = $this->createRole('USER'); // $uoUser = $this->createUOLink($user, $org); // $this->createUOALink($uoUser, $app, $role); // $this->client->request('POST', '/user/activeStatus/' . $user->getId(), ['status' => 'deactivate']); // self::assertResponseRedirects('/user/'); // $this->client->followRedirect(); // // } //endregion // même erreur que pour la sécurité. Problème lié au SSO. //region tabulator tests // #[Test] // public function test_tabulator_super_admin_success(): void{ // $admin = $this->createUser('admin@email.com', ['ROLE_SUPER_ADMIN']); // $this->client->loginUser($admin); // $this->client->request('GET', '/user/data'); // self::assertResponseIsSuccessful(); // self::assertResponseHeaderSame('Content-Type', 'application/json'); // // $response = $this->client->getResponse(); // $data = json_decode($response->getContent(), true); // self::assertArrayHasKey('data', $data); // } //endregion }