client = $this::getClientAuthenticated(); } /** * * @param Form $creationForm */ private function fillAValidCreationForm(Form &$creationForm, $firstname = 'God', $lastname = 'Jesus') { self::bootKernel(); $em = self::$kernel->getContainer()->get('doctrine.orm.entity_manager'); //remove two people created during test $jesus = $em->getRepository('ChillPersonBundle:Person') ->findOneBy(['firstName' => 'God']); if (null !== $jesus) { $em->remove($jesus); } $jesus2 = $em->getRepository('ChillPersonBundle:Person') ->findOneBy(['firstName' => 'roger']); if (null !== $jesus2) { $em->remove($jesus2); } $em->flush(); } /** * Test the "add a person" page : test that required elements are present. * * see https://redmine.champs-libres.coop/projects/chillperson/wiki/Test_plan_for_page_%22add_a_person%22 */ public function testAddAPersonPage() { $client = $this->client; $crawler = $client->request('GET', '/fr/person/new'); self::assertTrue( $client->getResponse()->isSuccessful(), 'The page is accessible at the URL /{_locale}/person/new' ); $form = $crawler->selectButton('Ajouter la personne')->form(); self::assertInstanceOf( 'Symfony\Component\DomCrawler\Form', $form, 'The page contains a butto ' ); self::assertTrue( $form->has(self::FIRSTNAME_INPUT), 'The page contains a "firstname" input' ); self::assertTrue( $form->has(self::LASTNAME_INPUT), 'The page contains a "lastname" input' ); self::assertTrue( $form->has(self::GENDER_INPUT), 'The page contains a "gender" input' ); self::assertTrue( $form->has(self::BIRTHDATE_INPUT), 'The page has a "date of birth" input' ); self::assertTrue( $form->has(self::CREATEDATE_INPUT), 'The page contains a "creation date" input' ); $genderType = $form->get(self::GENDER_INPUT); $this->assertEquals('radio', $genderType->getType(), 'The gender input has radio buttons'); $this->assertEquals(3, count($genderType->availableOptionValues()), 'The gender input has three options: man, women and undefined'); $this->assertTrue(in_array('man', $genderType->availableOptionValues()), 'gender has "homme" option'); $this->assertTrue(in_array('woman', $genderType->availableOptionValues()), 'gender has "femme" option'); $this->assertFalse($genderType->hasValue(), 'The gender input is not checked'); $today = new \DateTime(); $this->assertEquals($today->format('d-m-Y'), $form->get(self::CREATEDATE_INPUT) ->getValue(), 'The creation date input has the current date by default'); return $form; } /** * @depends testAddAPersonPage */ public function testForgedNullGender(Form $form) { $form->get(self::FIRSTNAME_INPUT)->setValue('john'); $form->get(self::LASTNAME_INPUT)->setValue('doe'); $date = new \DateTime('1947-02-01'); $form->get(self::BIRTHDATE_INPUT)->setValue($date->format('d-m-Y')); $this->client->submit($form); $this->assertResponseStatusCodeSame(500); } /** * Test if, for a given person if its person view page (at the url * fr/person/$personID/general) is accessible. * * @param int|string $personId The is of the person * @depends testValidForm */ public function testPersonViewAccessible($personId) { $client = $this->getAuthenticatedClient(); $client->request('GET', '/fr/person/' . $personId . '/general'); self::assertTrue( $client->getResponse()->isSuccessful(), 'The person view page is accessible at the URL' . '/{_locale}/person/{personID}/general' ); } public function testReviewExistingDetectionInversedLastNameWithFirstName() { $client = $this->getAuthenticatedClient(); $crawler = $client->request('GET', '/fr/person/new'); //test the page is loaded before continuing self::assertTrue($client->getResponse()->isSuccessful()); $form = $crawler->selectButton('Ajouter la personne')->form(); $form = $this->fillAValidCreationForm($form, 'Charline', 'dd'); $client->submit($form); self::assertContains( 'Depardieu', $client->getCrawler()->text(), 'check that the page has detected the lastname of a person existing in database' ); //inversion $form = $crawler->selectButton('Ajouter la personne')->form(); $form = $this->fillAValidCreationForm($form, 'dd', 'Charline'); $client->submit($form); self::assertContains( 'Depardieu', $client->getCrawler()->text(), 'check that the page has detected the lastname of a person existing in database' ); } /** * Test the creation of a valid person. * * @return string The id of the created person * @depends testAddAPersonPage */ public function testValidForm(Form $form) { $this->fillAValidCreationForm($form); $client = $this->client; $client->submit($form); $this->assertTrue((bool)$client->getResponse()->isRedirect(), "a valid form redirect to url /{_locale}/person/{personId}/general/edit"); $client->followRedirect(); // visualize regexp here : http://jex.im/regulex/#!embed=false&flags=&re=%2Ffr%2Fperson%2F[1-9][0-9]*%2Fgeneral%2Fedit%24 self::assertRegExp( '|/fr/person/[1-9][0-9]*/general/edit$|', $client->getHistory()->current()->getUri(), 'a valid form redirect to url /{_locale}/person/{personId}/general/edit' ); $regexPersonId = null; preg_match( '/person\\/([1-9][0-9]*)\\/general\\/edit$/', $client->getHistory()->current()->getUri(), $regexPersonId ); return $regexPersonId[1]; } /** * Test if, for a given person if its person view page (at the url * fr/person/$personID/general) is accessible * * @param string|int $personId The is of the person * @depends testValidForm */ public function testPersonViewAccessible($personId) { $client = $this->client; $client->request('GET', '/fr/person/'.$personId.'/general'); $this->assertTrue($client->getResponse()->isSuccessful(), "The person view page is accessible at the URL" . "/{_locale}/person/{personID}/general"); } /** * test adding a person with a user with multi center * is valid. */ public function testValidFormWithMultiCenterUser() { $client = $this->getClientAuthenticated('multi_center'); $crawler = $client->request('GET', '/fr/person/new'); self::assertTrue( $client->getResponse()->isSuccessful(), 'The page is accessible at the URL /{_locale}/person/new' ); $form = $crawler->selectButton('Ajouter la personne')->form(); $this->fillAValidCreationForm($form, 'roger', 'rabbit'); self::assertTrue( $form->has(self::CENTER_INPUT), 'The page contains a "center" input' ); $centerInput = $form->get(self::CENTER_INPUT); $availableValues = $centerInput->availableOptionValues(); $lastCenterInputValue = end($availableValues); $centerInput->setValue($lastCenterInputValue); $client->submit($form); self::assertTrue( $client->getResponse()->isRedirect(), 'a valid form redirect to url /{_locale}/person/{personId}/general/edit' ); $client->followRedirect(); self::assertRegExp( '|/fr/person/[1-9][0-9]*/general/edit$|', $client->getHistory()->current()->getUri(), 'a valid form redirect to url /{_locale}/person/{personId}/general/edit' ); } public function testReviewExistingDetectionInversedLastNameWithFirstName() { $client = $this->client; $crawler = $client->request('GET', '/fr/person/new'); //test the page is loaded before continuing $this->assertTrue($client->getResponse()->isSuccessful()); $form = $crawler->selectButton("Ajouter la personne")->form(); $form = $this->fillAValidCreationForm($form, 'Charline', 'dd'); $client->submit($form); $this->assertContains('Depardieu', $client->getCrawler()->text(), "check that the page has detected the lastname of a person existing in database"); //inversion $form = $crawler->selectButton("Ajouter la personne")->form(); $form = $this->fillAValidCreationForm($form, 'dd', 'Charline'); $client->submit($form); $this->assertContains('Depardieu', $client->getCrawler()->text(), "check that the page has detected the lastname of a person existing in database"); } /** * return an authenticated client, useful for submitting form. * * @param mixed $username * * @return \Symfony\Component\BrowserKit\Client */ private function getAuthenticatedClient($username = 'center a_social') { return self::createClient([], [ 'PHP_AUTH_USER' => $username, 'PHP_AUTH_PW' => 'password', ]); } }