From cece152c0b39d78c62bfed59751bf614e77b4b28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 10 May 2021 17:04:34 +0200 Subject: [PATCH] fix test for api requestors --- .../AccompanyingCourseApiControllerTest.php | 118 +++++++++++++++++- 1 file changed, 115 insertions(+), 3 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingCourseApiControllerTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingCourseApiControllerTest.php index 61b5307a4..99eeb6246 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingCourseApiControllerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingCourseApiControllerTest.php @@ -27,6 +27,7 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Entity\AccompanyingPeriodParticipation; use Chill\PersonBundle\Entity\Person; +use Chill\ThirdPartyBundle\Entity\ThirdParty; use Chill\MainBundle\Entity\User; use Chill\MainBundle\Entity\Center; use Doctrine\Common\Collections\Criteria; @@ -85,6 +86,116 @@ class AccompanyingCourseApiControllerTest extends WebTestCase $this->assertEquals(404, $response->getStatusCode(), "Test that the response of rest api has a status code 'not found' (404)"); } + /** + * @dataProvider dataGenerateRandomRequestorValidData + */ + public function testRequestorWithValidData(AccompanyingPeriod $period, $personId, $thirdPartyId) + { + $em = self::$container->get(EntityManagerInterface::class); + + // post a person + $this->client->request( + Request::METHOD_POST, + sprintf('/api/1.0/person/accompanying-course/%d/requestor.json', $period->getId()), + [], // parameters + [], // files + [], // server parameters + \json_encode([ 'person_id' => $personId ]) + ); + $response = $this->client->getResponse(); + $data = \json_decode($response->getContent(), true); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertArrayHasKey('person_id', $data); + $this->assertEquals($personId, $data['person_id']); + + // check into database + $period = $em->getRepository(AccompanyingPeriod::class) + ->find($period->getId()); + $this->assertInstanceOf(Person::class, $period->getRequestor()); + $this->assertEquals($personId, $period->getRequestor()->getId()); + + // post a third party + $this->client->request( + Request::METHOD_POST, + sprintf('/api/1.0/person/accompanying-course/%d/requestor.json', $period->getId()), + [], // parameters + [], // files + [], // server parameters + \json_encode([ 'thirdparty_id' => $thirdPartyId ]) + ); + $response = $this->client->getResponse(); + $data = \json_decode($response->getContent(), true); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertArrayHasKey('thirdparty_id', $data); + $this->assertEquals($thirdPartyId, $data['thirdparty_id']); + + // check into database + $period = $em->getRepository(AccompanyingPeriod::class) + ->find($period->getId()); + $this->assertInstanceOf(ThirdParty::class, $period->getRequestor()); + $this->assertEquals($thirdPartyId, $period->getRequestor()->getId()); + + // remove the requestor + $this->client->request( + Request::METHOD_DELETE, + sprintf('/api/1.0/person/accompanying-course/%d/requestor.json', $period->getId()) + ); + $response = $this->client->getResponse(); + $this->assertEquals(200, $response->getStatusCode()); + + // check into database + $period = $em->getRepository(AccompanyingPeriod::class) + ->find($period->getId()); + $em->refresh($period); + $this->assertNull($period->getRequestor()); + } + + public function dataGenerateRandomRequestorValidData(): \Iterator + { + $dataLength = 2; + $maxResults = 100; + + static::bootKernel(); + $em = static::$container->get(EntityManagerInterface::class); + $center = $em->getRepository(Center::class) + ->findOneBy(array('name' => 'Center A')); + + $personIds = $em->createQuery("SELECT p.id FROM ". + Person::class." p ". + " WHERE p.center = :center") + ->setParameter('center', $center) + ->setMaxResults($maxResults) + ->getScalarResult(); + + // create a random order + shuffle($personIds); + + $thirdPartyIds = $em->createQuery("SELECT t.id FROM ". + ThirdParty::class." t ") + ->setMaxResults($maxResults) + ->getScalarResult(); + + // create a random order + shuffle($thirdPartyIds); + + $i = 0; + while ($i <= $dataLength) { + $person = $em->getRepository(Person::class) + ->find(\array_pop($personIds)['id']); + + if (count($person->getAccompanyingPeriods()) === 0) { + continue; + } + + $period = $person->getAccompanyingPeriods()[0]; + + yield [$period, \array_pop($personIds)['id'], \array_pop($thirdPartyIds)['id'] ]; + $i++; + } + } + /** * * @dataProvider dataGenerateRandomAccompanyingCourse @@ -97,7 +208,7 @@ class AccompanyingCourseApiControllerTest extends WebTestCase [], // parameters [], // files [], // server parameters - \json_encode([ 'id' => $personId ]) + \json_encode([ 'person_id' => $personId ]) ); $response = $this->client->getResponse(); $data = \json_decode($response->getContent(), true); @@ -116,7 +227,7 @@ class AccompanyingCourseApiControllerTest extends WebTestCase // check that the person id is contained $participationsPersonsIds = \array_map( - function($participation) { return $participation->person->id; }, + function($participation) { return $participation->person->person_id; }, $data->participations); $this->assertContains($personId, $participationsPersonsIds); @@ -128,7 +239,7 @@ class AccompanyingCourseApiControllerTest extends WebTestCase [], // parameters [], // files [], // server parameters - \json_encode([ 'id' => $personId ]) + \json_encode([ 'person_id' => $personId ]) ); $response = $this->client->getResponse(); $data = \json_decode($response->getContent(), true); @@ -211,4 +322,5 @@ class AccompanyingCourseApiControllerTest extends WebTestCase $nbGenerated++; } } + }