104 lines
3.6 KiB
PHP
104 lines
3.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Entity;
|
|
|
|
use App\Entity\JobProfile;
|
|
use App\Entity\SeasonAssignment;
|
|
use App\Entity\Teamer;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
class SeasonAssignmentTest extends TestCase
|
|
{
|
|
public function testANewSeasonAssignmentCarriesItsOwnUuid(): void
|
|
{
|
|
$first = new SeasonAssignment();
|
|
$second = new SeasonAssignment();
|
|
|
|
$this->assertMatchesRegularExpression('/^[0-9a-f-]{36}$/', $first->getUuid());
|
|
$this->assertNotSame($first->getUuid(), $second->getUuid());
|
|
}
|
|
|
|
public function testANewSeasonAssignmentIsNotDeleted(): void
|
|
{
|
|
$this->assertFalse((new SeasonAssignment())->isDeleted());
|
|
}
|
|
|
|
/**
|
|
* The list only ever hides soft-deleted records, so deleting must not detach the teamer -
|
|
* the placement has to stay readable for whoever looks at it afterwards.
|
|
*/
|
|
public function testSoftDeletingKeepsTheRecordIntact(): void
|
|
{
|
|
$teamer = (new Teamer())->setFirstName('Ada')->setLastName('Musterfrau');
|
|
$seasonAssignment = (new SeasonAssignment())->setTeamer($teamer);
|
|
|
|
$seasonAssignment->setDeleted();
|
|
|
|
$this->assertTrue($seasonAssignment->isDeleted());
|
|
$this->assertSame($teamer, $seasonAssignment->getTeamer());
|
|
}
|
|
|
|
public function testTheInverseSideIsKeptInSync(): void
|
|
{
|
|
$teamer = new Teamer();
|
|
$seasonAssignment = new SeasonAssignment();
|
|
|
|
$teamer->addSeasonAssignment($seasonAssignment);
|
|
|
|
$this->assertCount(1, $teamer->getSeasonAssignments());
|
|
$this->assertSame($teamer, $seasonAssignment->getTeamer());
|
|
|
|
// adding the same one twice must not duplicate it
|
|
$teamer->addSeasonAssignment($seasonAssignment);
|
|
$this->assertCount(1, $teamer->getSeasonAssignments());
|
|
|
|
$teamer->removeSeasonAssignment($seasonAssignment);
|
|
$this->assertCount(0, $teamer->getSeasonAssignments());
|
|
$this->assertNull($seasonAssignment->getTeamer());
|
|
}
|
|
|
|
/**
|
|
* Administrative users lay the season's assignments out first and place teamers on them
|
|
* later, so an assignment without a teamer is a normal state rather than a half built one.
|
|
*/
|
|
public function testAnAssignmentStartsWithoutATeamer(): void
|
|
{
|
|
$seasonAssignment = new SeasonAssignment();
|
|
|
|
$this->assertNull($seasonAssignment->getTeamer());
|
|
}
|
|
|
|
public function testATeamerCanBePlacedAndRemovedAgain(): void
|
|
{
|
|
$teamer = (new Teamer())->setFirstName('Ada')->setLastName('Musterfrau');
|
|
$seasonAssignment = new SeasonAssignment();
|
|
|
|
$seasonAssignment->setTeamer($teamer);
|
|
$this->assertSame($teamer, $seasonAssignment->getTeamer());
|
|
|
|
$seasonAssignment->setTeamer(null);
|
|
$this->assertNull($seasonAssignment->getTeamer());
|
|
}
|
|
|
|
/**
|
|
* The period and the house live on the assignment itself - it is not cut from a travel, so
|
|
* there is no Destination to read them from.
|
|
*/
|
|
public function testItCarriesItsOwnPeriodAndHouse(): void
|
|
{
|
|
$seasonAssignment = (new SeasonAssignment())
|
|
->setTeamer((new Teamer())->setFirstName('Ada')->setLastName('Musterfrau'))
|
|
->setDateFrom(new \DateTimeImmutable('2026-11-01'))
|
|
->setDateTo(new \DateTimeImmutable('2027-04-30'))
|
|
->setHotelCode('AGR')
|
|
->setJobProfile((new JobProfile())->setName('Guide'))
|
|
;
|
|
|
|
$this->assertSame('2026-11-01', $seasonAssignment->getDateFrom()->format('Y-m-d'));
|
|
$this->assertSame('2027-04-30', $seasonAssignment->getDateTo()->format('Y-m-d'));
|
|
$this->assertSame('AGR', $seasonAssignment->getHotelCode());
|
|
}
|
|
}
|