feat: all-season assignments
This commit is contained in:
1 parent
675cec1b69
commit
cf876ed224
119 files changed
+6194
-294
No files matched your search
@@ -0,0 +1,103 @@
|
||||
<?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());
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user