disposition('2026-10-25', '2026-11-01'); $late = $this->disposition('2027-05-01', '2027-05-08'); $season = (new SeasonAssignment()) ->setDateFrom(new \DateTimeImmutable('2026-11-01')) ->setDateTo(new \DateTimeImmutable('2027-04-30')); $rows = $this->collector([$late, $early], [$season])->collect(new Teamer()); $this->assertSame([$early, null, $late], array_column($rows, 'disposition')); $this->assertSame([null, $season, null], array_column($rows, 'seasonAssignment')); $this->assertSame('2027-04-30', $rows[1]['dateTo']?->format('Y-m-d')); } /** * The season frames the dispositions inside it, so on the same first day it comes first. */ public function testASeasonStartingOnTheSameDayComesBeforeTheDisposition(): void { $disposition = $this->disposition('2026-11-01', '2026-11-08'); $season = (new SeasonAssignment()) ->setDateFrom(new \DateTimeImmutable('2026-11-01')) ->setDateTo(new \DateTimeImmutable('2027-04-30')); $rows = $this->collector([$disposition], [$season])->collect(new Teamer()); $this->assertSame($season, $rows[0]['seasonAssignment']); $this->assertSame($disposition, $rows[1]['disposition']); } public function testNothingUpcomingYieldsNoRows(): void { $this->assertSame([], $this->collector([], [])->collect(new Teamer())); } /** * @param Disposition[] $dispositions * @param SeasonAssignment[] $seasonAssignments */ private function collector(array $dispositions, array $seasonAssignments): UpcomingPlacementCollector { $dispositionRepository = $this->createStub(DispositionRepository::class); $dispositionRepository->method('findAllUpcomingByTeamer')->willReturn($dispositions); $seasonAssignmentRepository = $this->createStub(SeasonAssignmentRepository::class); $seasonAssignmentRepository->method('findUpcomingByTeamer')->willReturn($seasonAssignments); return new UpcomingPlacementCollector($dispositionRepository, $seasonAssignmentRepository); } private function disposition(string $dateFrom, string $dateTo): Disposition { $destination = (new Destination()) ->setDateFrom(new \DateTimeImmutable($dateFrom)) ->setDateTo(new \DateTimeImmutable($dateTo)); return new Disposition(new Application((new Assignment())->setDestination($destination), new Teamer())); } }