PersonAddressMove: fix tests, address history on household, and household::getMembersOnRange

This commit is contained in:
2022-02-21 00:12:57 +01:00
parent caa63ea97a
commit 4f4b1bfbaa
9 changed files with 288 additions and 210 deletions

View File

@@ -14,7 +14,7 @@ namespace AccompanyingPeriod\Events;
use Chill\MainBundle\Entity\Address;
use Chill\MainBundle\Entity\Notification;
use Chill\MainBundle\Entity\User;
use Chill\PersonBundle\AccompanyingPeriod\Events\PersonMoveEventSubscriber;
use Chill\PersonBundle\AccompanyingPeriod\Events\PersonAddressMoveEventSubscriber;
use Chill\PersonBundle\Entity\AccompanyingPeriod;
use Chill\PersonBundle\Entity\Household\Household;
use Chill\PersonBundle\Entity\Household\HouseholdMember;
@@ -80,51 +80,6 @@ final class PersonMoveEventSubscriberTest extends KernelTestCase
$eventSubscriber->resetPeriodLocation($event);
}
public function testEventChangeHouseholdNotificationForPeriodChangeLocationOfPersonAnteriorToCurrentLocationHistory()
{
$person = new Person();
$period = new AccompanyingPeriod();
$period
->setStep(AccompanyingPeriod::STEP_CONFIRMED)
->setPersonLocation($person)
->setUser(new User())
->addPerson($person);
$this->forceIdToPeriod($period);
$previousHousehold = (new Household())->addAddress(
($previousAddress = new Address())->setValidFrom(new DateTime('1 year ago'))
);
$previousMembership = new HouseholdMember();
$previousMembership
->setPerson($person)
->setHousehold($previousHousehold)
->setStartDate(new DateTimeImmutable('1 year ago'))
->setEndDate(new DateTimeImmutable('tomorrow'));
$nextHousehold = (new Household())->addAddress(
(new Address())->setValidFrom(new DateTime('1 month ago'))
);
$nextMembership = new HouseholdMember();
$nextMembership
->setPerson($person)
->setHousehold($nextHousehold)
->setStartDate(new DateTimeImmutable('1 month ago'));
$event = new PersonAddressMoveEvent($person);
$event
->setPreviousMembership($previousMembership)
->setNextMembership($nextMembership);
$em = $this->prophesize(EntityManagerInterface::class);
$em->persist(Argument::type(Notification::class))->shouldBeCalled(1);
$eventSubscriber = $this->buildSubscriber(null, $em->reveal(), null, null);
$eventSubscriber->resetPeriodLocation($event);
$this->assertNotNull($period->getAddressLocation());
$this->assertNull($period->getPersonLocation());
}
public function testEventChangeHouseholdNotification()
{
$person = new Person();
@@ -170,40 +125,43 @@ final class PersonMoveEventSubscriberTest extends KernelTestCase
$this->assertNull($period->getPersonLocation());
}
public function testEventPersonChangeAddressInThePast()
public function testEventChangeHouseholdNotificationForPeriodChangeLocationOfPersonAnteriorToCurrentLocationHistory()
{
$person = new Person();
$period = new AccompanyingPeriod();
$period
->setStep(AccompanyingPeriod::STEP_CONFIRMED)
->setPersonLocation($person)
->addPerson($person)
->setUser(new User());
->setUser(new User())
->addPerson($person);
$this->forceIdToPeriod($period);
$membership = new HouseholdMember();
$membership
$previousHousehold = (new Household())->addAddress(
($previousAddress = new Address())->setValidFrom(new DateTime('1 year ago'))
);
$previousMembership = new HouseholdMember();
$previousMembership
->setPerson($person)
->setHousehold($household = new Household())
->setHousehold($previousHousehold)
->setStartDate(new DateTimeImmutable('1 year ago'))
;
->setEndDate(new DateTimeImmutable('tomorrow'));
$previousAddress = new Address();
$previousAddress->setValidFrom(new DateTime('6 months ago'));
$household->addAddress($previousAddress);
$newAddress = new Address();
$newAddress->setValidFrom(new DateTime('tomorrow'));
$household->addAddress($newAddress);
$nextHousehold = (new Household())->addAddress(
(new Address())->setValidFrom(new DateTime('1 month ago'))
);
$nextMembership = new HouseholdMember();
$nextMembership
->setPerson($person)
->setHousehold($nextHousehold)
->setStartDate(new DateTimeImmutable('1 month ago'));
$event = new PersonAddressMoveEvent($person);
$event
->setPreviousAddress($household->getPreviousAddressOf($newAddress))
->setNextAddress($newAddress)
;
->setPreviousMembership($previousMembership)
->setNextMembership($nextMembership);
$em = $this->prophesize(EntityManagerInterface::class);
$em->persist(Argument::type(Notification::class))->shouldBeCalledTimes(1);
$em->persist(Argument::type(Notification::class))->shouldBeCalled(1);
$eventSubscriber = $this->buildSubscriber(null, $em->reveal(), null, null);
$eventSubscriber->resetPeriodLocation($event);
@@ -247,12 +205,52 @@ final class PersonMoveEventSubscriberTest extends KernelTestCase
$this->assertNull($period->getPersonLocation());
}
public function testEventPersonChangeAddressInThePast()
{
$person = new Person();
$period = new AccompanyingPeriod();
$period
->setStep(AccompanyingPeriod::STEP_CONFIRMED)
->setPersonLocation($person)
->addPerson($person)
->setUser(new User());
$this->forceIdToPeriod($period);
$membership = new HouseholdMember();
$membership
->setPerson($person)
->setHousehold($household = new Household())
->setStartDate(new DateTimeImmutable('1 year ago'));
$previousAddress = new Address();
$previousAddress->setValidFrom(new DateTime('6 months ago'));
$household->addAddress($previousAddress);
$newAddress = new Address();
$newAddress->setValidFrom(new DateTime('tomorrow'));
$household->addAddress($newAddress);
$event = new PersonAddressMoveEvent($person);
$event
->setPreviousAddress($household->getPreviousAddressOf($newAddress))
->setNextAddress($newAddress);
$em = $this->prophesize(EntityManagerInterface::class);
$em->persist(Argument::type(Notification::class))->shouldBeCalledTimes(1);
$eventSubscriber = $this->buildSubscriber(null, $em->reveal(), null, null);
$eventSubscriber->resetPeriodLocation($event);
$this->assertNotNull($period->getAddressLocation());
$this->assertNull($period->getPersonLocation());
}
private function buildSubscriber(
?EngineInterface $engine = null,
?EntityManagerInterface $entityManager = null,
?Security $security = null,
?TranslatorInterface $translator = null
): PersonMoveEventSubscriber {
): PersonAddressMoveEventSubscriber {
if (null === $translator) {
$double = $this->prophesize(TranslatorInterface::class);
$translator = $double->reveal();
@@ -274,7 +272,7 @@ final class PersonMoveEventSubscriberTest extends KernelTestCase
$entityManager = $double->reveal();
}
return new PersonMoveEventSubscriber(
return new PersonAddressMoveEventSubscriber(
$engine,
$entityManager,
$security,

View File

@@ -14,8 +14,10 @@ namespace Entity\Household;
use Chill\MainBundle\Entity\Address;
use Chill\PersonBundle\Entity\Household\Household;
use Chill\PersonBundle\Entity\Household\HouseholdComposition;
use DateTimeImmutable;
use Chill\PersonBundle\Entity\Household\HouseholdMember;
use Chill\PersonBundle\Entity\Person;
use DateTime;
use DateTimeImmutable;
use PHPUnit\Framework\TestCase;
/**
@@ -24,27 +26,47 @@ use PHPUnit\Framework\TestCase;
*/
final class HouseholdTest extends TestCase
{
public function testHouseholdComposition()
public function testGetMembersOnRange()
{
$household = new Household();
$household->addComposition(($first = new HouseholdComposition())
->setStartDate(new DateTimeImmutable('2021-12-01')));
$household->addMember($householdMemberA = (new HouseholdMember())
->setStartDate(new DateTimeImmutable('2020-01-01'))
->setEndDate(new DateTimeImmutable('2020-12-31'))
->setPerson(new Person()));
$household->addMember($householdMemberB = (new HouseholdMember())
->setStartDate(new DateTimeImmutable('2020-06-01'))
->setEndDate(new DateTimeImmutable('2021-06-31'))
->setPerson(new Person()));
$household->addMember($householdMemberC = (new HouseholdMember())
->setStartDate(new DateTimeImmutable('2021-01-01'))
->setEndDate(null)
->setPerson(new Person()));
$this->assertNull($first->getEndDate());
$members = $household->getMembersOnRange(new DateTimeImmutable('2019-01-01'), null);
$household->addComposition(($second = new HouseholdComposition())
->setStartDate(new DateTimeImmutable('2021-12-31')));
$this->assertCount(3, $members);
$this->assertContains($householdMemberA, $members);
$this->assertContains($householdMemberB, $members);
$this->assertContains($householdMemberC, $members);
$this->assertEquals(new DateTimeImmutable('2021-12-31'), $first->getEndDate());
$this->assertEquals(new DateTimeImmutable('2021-12-31'), $second->getStartDate());
$members = $household->getMembersOnRange(new DateTimeImmutable('2020-01-01'), new DateTimeImmutable('2020-07-01'));
$this->assertCount(2, $members);
$this->assertContains($householdMemberA, $members);
$this->assertContains($householdMemberB, $members);
$this->assertNotContains($householdMemberC, $members);
$household->addComposition(($inside = new HouseholdComposition())
->setStartDate(new DateTimeImmutable('2021-12-15')));
$members = $household->getMembersOnRange(new DateTimeImmutable('2020-01-01'), new DateTimeImmutable('2022-12-31'));
$this->assertCount(3, $members);
$this->assertContains($householdMemberA, $members);
$this->assertContains($householdMemberB, $members);
$this->assertContains($householdMemberC, $members);
$this->assertEquals(new DateTimeImmutable('2021-12-15'), $first->getEndDate());
$this->assertEquals(new DateTimeImmutable('2021-12-31'), $second->getStartDate());
$this->assertEquals(new DateTimeImmutable('2021-12-31'), $inside->getEndDate());
$members = $household->getMembersOnRange(new DateTimeImmutable('2021-01-01'), new DateTimeImmutable('2022-12-31'));
$this->assertCount(2, $members);
$this->assertNotContains($householdMemberA, $members);
$this->assertContains($householdMemberB, $members);
$this->assertContains($householdMemberC, $members);
}
public function testHouseholdAddressConsistent()
@@ -72,7 +94,7 @@ final class HouseholdTest extends TestCase
$this->assertNull($lastAddress->getValidTo());
$futureAddress = new Address();
$futureAddress->setValidFrom(new DateTime('tomorrow'));
$futureAddress->setValidFrom($tomorrow = new DateTime('tomorrow'));
$household->addAddress($futureAddress);
$addresses = $household->getAddressesOrdered();
@@ -83,6 +105,31 @@ final class HouseholdTest extends TestCase
$this->assertEquals($oneMonthAgo, $previousAddress->getValidFrom());
$this->assertEquals($yesterday, $previousAddress->getValidTo());
$this->assertEquals($yesterday, $lastAddress->getValidFrom());
$this->assertNull($lastAddress->getValidTo());
$this->assertEquals($tomorrow, $lastAddress->getValidTo());
$this->assertEquals($tomorrow, $futureAddress->getValidFrom());
$this->assertNull($futureAddress->getValidTo());
}
public function testHouseholdComposition()
{
$household = new Household();
$household->addComposition(($first = new HouseholdComposition())
->setStartDate(new DateTimeImmutable('2021-12-01')));
$this->assertNull($first->getEndDate());
$household->addComposition(($second = new HouseholdComposition())
->setStartDate(new DateTimeImmutable('2021-12-31')));
$this->assertEquals(new DateTimeImmutable('2021-12-31'), $first->getEndDate());
$this->assertEquals(new DateTimeImmutable('2021-12-31'), $second->getStartDate());
$household->addComposition(($inside = new HouseholdComposition())
->setStartDate(new DateTimeImmutable('2021-12-15')));
$this->assertEquals(new DateTimeImmutable('2021-12-15'), $first->getEndDate());
$this->assertEquals(new DateTimeImmutable('2021-12-31'), $second->getStartDate());
$this->assertEquals(new DateTimeImmutable('2021-12-31'), $inside->getEndDate());
}
}

View File

@@ -12,7 +12,6 @@ declare(strict_types=1);
namespace Event\Person;
use Chill\MainBundle\Entity\Address;
use Chill\PersonBundle\Entity\AccompanyingPeriod;
use Chill\PersonBundle\Entity\Household\Household;
use Chill\PersonBundle\Entity\Household\HouseholdMember;
use Chill\PersonBundle\Entity\Person;
@@ -27,6 +26,34 @@ use PHPUnit\Framework\TestCase;
*/
final class PersonAddressMoveEventTest extends TestCase
{
public function testPersonChangeAddress()
{
$person = new Person();
$household = (new Household())->addAddress(
($previousAddress = new Address())->setValidFrom(new DateTime('1 year ago'))
);
$household->addAddress(
($nextAddress = new Address())->setValidFrom(new DateTime('1 month ago'))
);
$member = new HouseholdMember();
$member
->setPerson($person)
->setHousehold($household)
->setStartDate(new DateTimeImmutable('1 year ago'))
->setEndDate(new DateTimeImmutable('tomorrow'));
$event = new PersonAddressMoveEvent($person);
$event
->setPreviousAddress($previousAddress)
->setNextAddress($nextAddress);
$this->assertSame($previousAddress, $event->getPreviousAddress());
$this->assertSame($nextAddress, $event->getNextAddress());
$this->assertEquals(new DateTime('tomorrow'), $nextAddress->getValidFrom());
$this->assertEquals(new DateTime('tomorrow'), $event->getMoveDate());
}
public function testPersonChangeHousehold()
{
$person = new Person();
@@ -88,32 +115,4 @@ final class PersonAddressMoveEventTest extends TestCase
$this->assertTrue($event->personLeaveWithoutHousehold());
$this->assertEquals(new DateTimeImmutable('tomorrow'), $event->getMoveDate());
}
public function testPersonChangeAddress()
{
$person = new Person();
$household = (new Household())->addAddress(
($previousAddress = new Address())->setValidFrom(new DateTime('1 year ago'))
);
$household = (new Household())->addAddress(
($nextAddress = new Address())->setValidFrom(new DateTime('1 month ago'))
);
$member = new HouseholdMember();
$member
->setPerson($person)
->setHousehold($household)
->setStartDate(new DateTimeImmutable('1 year ago'))
->setEndDate(new DateTimeImmutable('tomorrow'));
$event = new PersonAddressMoveEvent($person);
$event
->setPreviousAddress($previousAddress)
->setNextAddress($nextAddress);
$this->assertSame($previousAddress, $event->getPreviousAddress());
$this->assertSame($nextAddress, $event->getNextAddress());
$this->assertEquals(new DateTime('tomorrow'), $nextAddress->getValidFrom());
$this->assertEquals(new DateTime('tomorrow'), $event->getMoveDate());
}
}