entityManager = static::getContainer()->get(EntityManagerInterface::class); } // Auxiliary functions private function createTestUser() { return UserFactory::createOne([ 'email' => self::USER_EMAIL, 'password' => self::USER_PASSWORD, ]); } private function createTestProjectOptimized(int $count, array $attributes = []) { $owner = $this->createTestUser(); $territory = new ProjectTerritory('ES'); $mergedAttributes = array_merge([ 'owner' => $owner, 'territory' => $territory, ], $attributes); ProjectFactory::createMany($count, $mergedAttributes); } private function getHeaders(Client $client) { // Responsability 1: Get Token $client->request( 'POST', '/v4/user_tokens', [ 'json' => [ 'identifier' => self::USER_EMAIL, 'password' => self::USER_PASSWORD, ], ] ); $token = json_decode($client->getResponse()->getContent(), true)['token']; // Responsability 2 : Return headers return ['headers' => ['Authorization' => "Bearer $token"]]; } // Runable Tests public function testGetAllSuccessful(): void { $owner = $this->createTestUser(); $numberOfProjects = 2; ProjectFactory::createMany($numberOfProjects, ['owner' => $owner]); $client = static::createClient(); $client->request(self::METHOD, self::BASE_URI, $this->getHeaders($client)); $this->assertResponseIsSuccessful(); $responseData = json_decode($client->getResponse()->getContent(), true); $this->assertCount($numberOfProjects, $responseData['member']); } private function getMinNumInPage($page = 1, $pageSize = self::PAGE_SIZE) { return $pageSize * ($page - 1); } public function testGetAllOnPage(): void { $page = 2; $numberOfProjectsInPage = 1; $itemsPerPage = 2; $minCountInPage = $this->getMinNumInPage($page, $itemsPerPage); $totalNumberOfProjects = $minCountInPage + $numberOfProjectsInPage; $this->createTestProjectOptimized($totalNumberOfProjects); $client = static::createClient(); $client->request( self::METHOD, self::BASE_URI."?page=$page&itemsPerPage=$itemsPerPage", $this->getHeaders($client) ); $this->assertResponseIsSuccessful(); $responseData = json_decode($client->getResponse()->getContent(), true); $this->assertSame($totalNumberOfProjects, $responseData['totalItems']); $this->assertCount(max($numberOfProjectsInPage, 0), $responseData['member']); $this->entityManager->clear(); } public function testGetAllDefaultsFirstPage(): void { $itemsPerPage = 2; $totalNumberOfProjects = $itemsPerPage + 1; $this->createTestProjectOptimized($totalNumberOfProjects); $client = static::createClient(); $client->request( self::METHOD, self::BASE_URI."?itemsPerPage=$itemsPerPage", $this->getHeaders($client) ); $this->assertResponseIsSuccessful(); $responseData = json_decode($client->getResponse()->getContent(), true); $this->assertSame($totalNumberOfProjects, $responseData['totalItems']); $this->assertCount($itemsPerPage, $responseData['member']); $this->entityManager->clear(); } public function testGetAllByTitle() { $title = 'Free Software Project'; $owner = $this->createTestUser(); $territory = new ProjectTerritory('ES'); $baseAttributes = [ 'owner' => $owner, 'territory' => $territory, ]; $searchCount = 2; ProjectFactory::createMany($searchCount, array_merge(['title' => $title], $baseAttributes)); ProjectFactory::createOne(array_merge(['title' => 'Educational Project'], $baseAttributes)); $client = static::createClient(); $client->request(self::METHOD, self::BASE_URI."?title=$title", $this->getHeaders($client)); $this->assertResponseIsSuccessful(); $responseData = json_decode($client->getResponse()->getContent(), true); $this->assertCount($searchCount, $responseData['member']); } public function testGetAllUnauthorized(): void { static::createClient()->request(self::METHOD, self::BASE_URI); $this->assertResponseIsSuccessful(); } public function testGetAllWithInvalidToken(): void { static::createClient()->request( self::METHOD, self::BASE_URI, ['headers' => ['Authorization' => 'Bearer 123']] ); $this->assertResponseStatusCodeSame(Response::HTTP_UNAUTHORIZED); } }