mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
299 lines
9.1 KiB
PHP
299 lines
9.1 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Chill is a software for social workers
|
|
*
|
|
* For the full copyright and license information, please view
|
|
* the LICENSE file that was distributed with this source code.
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Bundle\ChillPersonBundle\Tests\Controller;
|
|
|
|
use Chill\MainBundle\Test\PrepareClientTrait;
|
|
use Chill\PersonBundle\Entity\Household\Household;
|
|
use Chill\PersonBundle\Entity\Household\HouseholdMember;
|
|
use Chill\PersonBundle\Entity\Household\Position;
|
|
use Chill\PersonBundle\Entity\Person;
|
|
use DateTimeImmutable;
|
|
use DateTimeInterface;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
use Iterator;
|
|
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use function array_pop;
|
|
use function count;
|
|
use function json_decode;
|
|
use function json_encode;
|
|
use function random_int;
|
|
use function shuffle;
|
|
|
|
/**
|
|
* @internal
|
|
* @coversNothing
|
|
*/
|
|
final class HouseholdMemberControllerTest extends WebTestCase
|
|
{
|
|
use PrepareClientTrait;
|
|
|
|
public function provideValidDataEditMember(): Iterator
|
|
{
|
|
self::bootKernel();
|
|
$em = self::$container->get(EntityManagerInterface::class);
|
|
|
|
$membershipIds = $em->createQuery('SELECT m.id FROM ' . HouseholdMember::class . ' m ' .
|
|
'JOIN m.person p ' .
|
|
'JOIN p.center c ' .
|
|
'WHERE c.name = :center AND m.endDate IS NULL')
|
|
->setParameter('center', 'Center A')
|
|
->getScalarResult();
|
|
|
|
shuffle($membershipIds);
|
|
|
|
yield [array_pop($membershipIds)['id']];
|
|
}
|
|
|
|
public function provideValidDataMove(): Iterator
|
|
{
|
|
self::bootKernel();
|
|
$em = self::$container->get(EntityManagerInterface::class);
|
|
$yesterday = new DateTimeImmutable('yesterday');
|
|
|
|
$personIds = $em->createQuery(
|
|
'SELECT p.id FROM ' . Person::class . ' p ' .
|
|
'JOIN p.center c ' .
|
|
'WHERE ' .
|
|
'c.name = :center '
|
|
)
|
|
->setParameter('center', 'Center A')
|
|
->setMaxResults(100)
|
|
->getScalarResult();
|
|
|
|
shuffle($personIds);
|
|
|
|
$household = new Household();
|
|
$em->persist($household);
|
|
$em->flush();
|
|
|
|
$positions = $em->createQuery('SELECT pos.id FROM ' . Position::class . ' pos ' .
|
|
'WHERE pos.shareHouseHold = TRUE')
|
|
->getResult();
|
|
|
|
$i = 0;
|
|
|
|
do {
|
|
$id = array_pop($personIds)['id'];
|
|
$person = self::$container->get(EntityManagerInterface::class)
|
|
->getRepository(Person::class)
|
|
->find($id);
|
|
|
|
$participation = $person->getCurrentHouseholdParticipationShareHousehold();
|
|
|
|
if (null === $participation
|
|
|| (
|
|
null === $participation->getEndDate()
|
|
&& $participation->getStartDate() <= $yesterday
|
|
)) {
|
|
++$i;
|
|
|
|
yield [
|
|
$id,
|
|
$household->getId(),
|
|
$positions[random_int(0, count($positions) - 1)]['id'],
|
|
new DateTimeImmutable('tomorrow'),
|
|
];
|
|
}
|
|
} while (1 >= $i);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideValidDataEditMember
|
|
*
|
|
* @param mixed $memberId
|
|
*/
|
|
public function testEditMember($memberId)
|
|
{
|
|
$client = $this->getClientAuthenticated();
|
|
|
|
$crawler = $client->request(
|
|
Request::METHOD_GET,
|
|
"/fr/person/household/member/{$memberId}/edit"
|
|
);
|
|
|
|
$this->assertResponseIsSuccessful();
|
|
|
|
$form = $crawler->selectButton('Enregistrer')
|
|
->form();
|
|
|
|
$crawler = $client->submit($form);
|
|
|
|
$this->assertEquals(302, $client->getResponse()->getStatusCode());
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideValidDataMove
|
|
*
|
|
* @param mixed $personId
|
|
* @param mixed $householdId
|
|
* @param mixed $positionId
|
|
*/
|
|
public function testLeaveWithoutHousehold($personId, $householdId, $positionId, DateTimeInterface $date)
|
|
{
|
|
$client = $this->getClientAuthenticated();
|
|
|
|
$client->request(
|
|
Request::METHOD_POST,
|
|
'/api/1.0/person/household/members/move.json',
|
|
[], // parameters
|
|
[], // files
|
|
[], // server
|
|
json_encode(
|
|
[
|
|
'concerned' => [
|
|
[
|
|
'person' => [
|
|
'type' => 'person',
|
|
'id' => $personId,
|
|
],
|
|
'start_date' => [
|
|
'datetime' => $date->format(DateTimeInterface::RFC3339),
|
|
],
|
|
'position' => [
|
|
'type' => 'household_position',
|
|
'id' => $positionId,
|
|
],
|
|
'holder' => false,
|
|
'comment' => 'Introduced by automated test',
|
|
],
|
|
],
|
|
'destination' => null,
|
|
]
|
|
)
|
|
);
|
|
|
|
$this->assertEquals(
|
|
Response::HTTP_OK,
|
|
$client->getResponse()->getStatusCode()
|
|
);
|
|
|
|
$data = json_decode($client->getResponse()->getContent(), true);
|
|
|
|
$this->assertEquals(null, $data);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideValidDataMove
|
|
*
|
|
* @param mixed $personId
|
|
* @param mixed $householdId
|
|
* @param mixed $positionId
|
|
*/
|
|
public function testMoveMember($personId, $householdId, $positionId, DateTimeInterface $date)
|
|
{
|
|
$client = $this->getClientAuthenticated();
|
|
|
|
$client->request(
|
|
Request::METHOD_POST,
|
|
'/api/1.0/person/household/members/move.json',
|
|
[], // parameters
|
|
[], // files
|
|
[], // server
|
|
json_encode(
|
|
[
|
|
'concerned' => [
|
|
[
|
|
'person' => [
|
|
'type' => 'person',
|
|
'id' => $personId,
|
|
],
|
|
'start_date' => [
|
|
'datetime' => $date->format(DateTimeInterface::RFC3339),
|
|
],
|
|
'position' => [
|
|
'type' => 'household_position',
|
|
'id' => $positionId,
|
|
],
|
|
'holder' => false,
|
|
'comment' => 'Introduced by automated test',
|
|
],
|
|
],
|
|
'destination' => [
|
|
'type' => 'household',
|
|
'id' => $householdId,
|
|
],
|
|
]
|
|
)
|
|
);
|
|
|
|
$this->assertEquals(
|
|
Response::HTTP_OK,
|
|
$client->getResponse()->getStatusCode()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideValidDataMove
|
|
*
|
|
* @param mixed $personId
|
|
* @param mixed $householdId
|
|
* @param mixed $positionId
|
|
*/
|
|
public function testMoveMemberToNewHousehold($personId, $householdId, $positionId, DateTimeInterface $date)
|
|
{
|
|
$client = $this->getClientAuthenticated();
|
|
|
|
$client->request(
|
|
Request::METHOD_POST,
|
|
'/api/1.0/person/household/members/move.json',
|
|
[], // parameters
|
|
[], // files
|
|
[], // server
|
|
json_encode(
|
|
[
|
|
'concerned' => [
|
|
[
|
|
'person' => [
|
|
'type' => 'person',
|
|
'id' => $personId,
|
|
],
|
|
'start_date' => [
|
|
'datetime' => $date->format(DateTimeInterface::RFC3339),
|
|
],
|
|
'position' => [
|
|
'type' => 'household_position',
|
|
'id' => $positionId,
|
|
],
|
|
'holder' => false,
|
|
'comment' => 'Introduced by automated test',
|
|
],
|
|
],
|
|
'destination' => [
|
|
'type' => 'household',
|
|
],
|
|
]
|
|
)
|
|
);
|
|
|
|
$this->assertEquals(
|
|
Response::HTTP_OK,
|
|
$client->getResponse()->getStatusCode()
|
|
);
|
|
|
|
$data = json_decode($client->getResponse()->getContent(), true);
|
|
|
|
$this->assertIsArray($data);
|
|
$this->assertArrayHasKey('members', $data);
|
|
$this->assertIsArray($data['members']);
|
|
$this->assertEquals(
|
|
1,
|
|
count($data['members']),
|
|
'assert new household count one member'
|
|
);
|
|
$this->assertArrayHasKey('person', $data['members'][0]);
|
|
$this->assertArrayHasKey('id', $data['members'][0]['person']);
|
|
$this->assertEquals($personId, $data['members'][0]['person']['id']);
|
|
}
|
|
}
|