diff --git a/tests/Controller/ActionControllerTest.php b/tests/Controller/ActionControllerTest.php new file mode 100644 index 0000000..f320a2c --- /dev/null +++ b/tests/Controller/ActionControllerTest.php @@ -0,0 +1,106 @@ +client = static::createClient(); + + // Retrieve the EntityManager from the test container + $this->entityManager = static::getContainer()->get('doctrine')->getManager(); + } + + /** + * Helper to create a valid User entity with all required fields and log them in. + */ + private function authenticateUser(): User + { + $user = new User(); + $user->setEmail('test_' . uniqid() . '@example.com'); // Ensure uniqueness + $user->setPassword('secure_password'); + $user->setName('Test'); + $user->setSurname('User'); + $user->setRoles(['ROLE_USER']); + + // Defaults (isActive, isDeleted, dates) are handled by the User constructor + + $this->entityManager->persist($user); + $this->entityManager->flush(); + + $this->client->loginUser($user); + + return $user; + } + + #[Test] + public function fetch_activities_ajax_returns_json_response(): void + { + // 1. Arrange: Authenticate + $user = $this->authenticateUser(); + + // 2. Arrange: Create a valid Organization + $organization = new Organizations(); + $organization->setName('Test Corp'); + $organization->setEmail('contact@testcorp.com'); + $organization->setNumber(101); // Required int + $organization->setAddress('123 Main St'); // Required string + $organization->setLogoUrl('logo.png'); // Required string + // Defaults (isActive, isDeleted, collections) handled by Constructor + + $this->entityManager->persist($organization); + + // 3. Arrange: Create an Action linked to the Organization + $action = new Actions(); + $action->setOrganization($organization); // Link to the org + $action->setUsers($user); // Link to the user + $action->setActionType('UPDATE'); // Required string + $action->setDescription('Updated profile details'); + // Date is set automatically in __construct + + $this->entityManager->persist($action); + $this->entityManager->flush(); + + // 4. Act: Request the URL using the Organization ID + $url = sprintf('/actions/organization/%d/activities-ajax', $organization->getId()); + $this->client->request('GET', $url); + + // 5. Assert: Verify Success + $this->assertResponseIsSuccessful(); // Status 200 + $this->assertResponseHeaderSame('content-type', 'application/json'); + + // 6. Assert: Verify JSON Content + $responseContent = $this->client->getResponse()->getContent(); + $this->assertJson($responseContent); + + $data = json_decode($responseContent, true); + + // Since we created 1 action, we expect the array to be non-empty + $this->assertIsArray($data); + $this->assertNotEmpty($data); + } + + #[Test] + public function fetch_activities_returns_404_for_invalid_organization(): void + { + $this->authenticateUser(); + + // Act: Request with an ID that definitely doesn't exist (e.g., extremely high int) + $this->client->request('GET', '/actions/organization/99999999/activities-ajax'); + + // Assert: 404 Not Found (Standard Symfony ParamConverter behavior) + $this->assertResponseStatusCodeSame(404); + } +} \ No newline at end of file