assertUrlIsSecured('/api/activities'); } protected function loadActivityTestData(Client $client) { $em = $client->getContainer()->get('doctrine.orm.entity_manager'); $project = $em->getRepository(Project::class)->find(1); $customer = $em->getRepository(Customer::class)->find(1); $project2 = new Project(); $project2->setName('Activity Test'); $project2->setCustomer($customer); $em->persist($project2); $activity = (new Activity())->setName('first one')->setComment('1')->setProject($project2); $em->persist($activity); $activity = (new Activity())->setName('second one')->setComment('2'); $em->persist($activity); $activity = (new Activity())->setName('third one')->setComment('3')->setProject($project); $em->persist($activity); $activity = (new Activity())->setName('fourth one')->setComment('4')->setProject($project2)->setVisible(false); $em->persist($activity); $activity = (new Activity())->setName('fifth one')->setComment('5')->setProject($project2); $em->persist($activity); $activity = (new Activity())->setName('sixth one')->setComment('6')->setVisible(false); $em->persist($activity); $em->flush(); } /** * @dataProvider getCollectionTestData */ public function testGetCollection($url, $parameters, $expected) { $client = $this->getClientForAuthenticatedUser(User::ROLE_USER); $this->loadActivityTestData($client); $this->assertAccessIsGranted($client, $url, 'GET', $parameters); $result = json_decode($client->getResponse()->getContent(), true); $this->assertIsArray($result); $this->assertNotEmpty($result); $this->assertEquals(count($expected), count($result)); for ($i = 0; $i < count($result); $i++) { $activity = $result[$i]; $hasProject = $expected[$i][0]; $this->assertStructure($activity, false); if ($hasProject) { $this->assertEquals($expected[$i][0], $activity['project']); } } } public function getCollectionTestData() { yield ['/api/activities', [], [[false], [false], [true, 2], [true, 1], [true, 2]]]; yield ['/api/activities', ['globals' => 'true'], [[false], [false]]]; yield ['/api/activities', ['globals' => 'true', 'visible' => 3], [[false], [false], [false]]]; yield ['/api/activities', ['globals' => 'true', 'visible' => '2'], [[false]]]; yield ['/api/activities', ['globals' => 'true', 'visible' => 1], [[false], [false]]]; yield ['/api/activities', ['project' => '1'], [[false], [false], [true, 1]]]; yield ['/api/activities', ['project' => '2', 'visible' => 1], [[false], [false], [true, 2], [true, 2]]]; yield ['/api/activities', ['project' => '2', 'visible' => '3'], [[false], [false], [false], [true, 2], [true, 2], [true, 2]]]; yield ['/api/activities', ['project' => '2', 'visible' => 2], [[false], [true, 2]]]; } public function testGetCollectionWithQuery() { $client = $this->getClientForAuthenticatedUser(User::ROLE_USER); $this->loadActivityTestData($client); $query = ['order' => 'ASC', 'orderBy' => 'project', 'globalsFirst' => 'false']; $client = $this->getClientForAuthenticatedUser(User::ROLE_USER); $this->assertAccessIsGranted($client, '/api/activities', 'GET', $query); $result = json_decode($client->getResponse()->getContent(), true); $this->assertIsArray($result); $this->assertNotEmpty($result); $this->assertEquals(5, count($result)); $this->assertStructure($result[0], false); $this->assertEquals(1, $result[2]['project']); $this->assertEquals(2, $result[3]['project']); $this->assertEquals(2, $result[4]['project']); } public function testGetEntity() { $client = $this->getClientForAuthenticatedUser(User::ROLE_USER); $this->assertAccessIsGranted($client, '/api/activities/1'); $result = json_decode($client->getResponse()->getContent(), true); $this->assertIsArray($result); $this->assertStructure($result, true); } public function testNotFound() { $this->assertEntityNotFound(User::ROLE_USER, '/api/activities/2'); } public function testPostAction() { $client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN); $data = [ 'name' => 'foo', 'project' => 1, 'visible' => true ]; $this->request($client, '/api/activities', 'POST', [], json_encode($data)); $this->assertTrue($client->getResponse()->isSuccessful()); $result = json_decode($client->getResponse()->getContent(), true); $this->assertIsArray($result); $this->assertStructure($result); $this->assertNotEmpty($result['id']); } public function testPostActionWithInvalidUser() { $client = $this->getClientForAuthenticatedUser(User::ROLE_USER); $data = [ 'name' => 'foo', 'project' => 1, 'visible' => true ]; $this->request($client, '/api/activities', 'POST', [], json_encode($data)); $response = $client->getResponse(); $this->assertFalse($response->isSuccessful()); $this->assertEquals(Response::HTTP_FORBIDDEN, $response->getStatusCode()); $json = json_decode($response->getContent(), true); $this->assertEquals('User cannot create activities', $json['message']); } public function testPatchAction() { $client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN); $data = [ 'name' => 'foo', 'comment' => '', 'project' => 1, 'visible' => true ]; $this->request($client, '/api/activities/1', 'PATCH', [], json_encode($data)); $this->assertTrue($client->getResponse()->isSuccessful()); $result = json_decode($client->getResponse()->getContent(), true); $this->assertIsArray($result); $this->assertStructure($result); $this->assertNotEmpty($result['id']); } public function testPatchActionWithInvalidUser() { $client = $this->getClientForAuthenticatedUser(User::ROLE_USER); $data = [ 'name' => 'foo', 'comment' => '', 'project' => 1, 'visible' => true ]; $this->request($client, '/api/activities/1', 'PATCH', [], json_encode($data)); $response = $client->getResponse(); $this->assertFalse($response->isSuccessful()); $this->assertEquals(Response::HTTP_FORBIDDEN, $response->getStatusCode()); $json = json_decode($response->getContent(), true); $this->assertEquals('User cannot update activity', $json['message']); } public function testPatchActionWithUnknownActivity() { $this->assertEntityNotFoundForPatch(User::ROLE_USER, '/api/activities/255', []); } public function testInvalidPatchAction() { $client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN); $data = [ 'name' => 'foo', 'project' => 255, 'visible' => true ]; $this->request($client, '/api/activities/1', 'PATCH', [], json_encode($data)); $response = $client->getResponse(); $this->assertEquals(400, $response->getStatusCode()); $this->assertApiCallValidationError($response, ['project']); } protected function assertStructure(array $result, $full = true) { $expectedKeys = ['id', 'name', 'visible', 'project', 'hourlyRate', 'fixedRate', 'color']; if ($full) { $expectedKeys = array_merge($expectedKeys, ['comment', 'budget', 'timeBudget']); } $actual = array_keys($result); sort($actual); sort($expectedKeys); $this->assertEquals($expectedKeys, $actual, 'Activity structure does not match'); } }