test set scheduling flow

This commit is contained in:
Yisroel Baum 2026-08-10 20:01:28 +03:00
parent 0049248231
commit bdb266746d
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
3 changed files with 724 additions and 0 deletions

View file

@ -0,0 +1,97 @@
<?php
namespace Tests\Fakes;
use App\Schedule\CreateScheduleDto;
use App\Schedule\Schedule;
use App\Schedule\ScheduleAssignment;
use App\Schedule\ScheduleRepository;
use App\User\User;
class FakeScheduleRepository implements ScheduleRepository
{
/**
* @var array<int, Schedule>
*/
private array $schedules = [];
public function create(CreateScheduleDto $dto): Schedule
{
$id = count($this->schedules) + 1;
$assignments = [];
foreach ($dto->assignments as $assignmentDto) {
$assignments[] = new ScheduleAssignment(
id: count($assignments) + 1,
element: $assignmentDto->element,
scheduledDate: $assignmentDto->scheduledDate,
position: $assignmentDto->position,
);
}
$schedule = new Schedule(
id: $id,
user: $dto->user,
set: $dto->set,
elementKind: $dto->elementKind,
startDate: $dto->startDate,
targetDate: $dto->targetDate,
assignments: $assignments,
);
$this->schedules[$id] = $schedule;
return $this->copy($schedule);
}
public function findForUser(int $id, User $user): ?Schedule
{
$schedule = $this->schedules[$id] ?? null;
if ($schedule === null || $schedule->getUser()->getId()
!== $user->getId()
) {
return null;
}
return $this->copy($schedule);
}
public function findAllForUser(User $user): array
{
$schedules = array_filter(
$this->schedules,
function (Schedule $schedule) use ($user): bool {
return $schedule->getUser()->getId() === $user->getId();
},
);
krsort($schedules);
return array_map(function (Schedule $schedule): Schedule {
return $this->copy($schedule);
}, array_values($schedules));
}
private function copy(Schedule $schedule): Schedule
{
$assignments = array_map(
function (ScheduleAssignment $assignment): ScheduleAssignment {
return new ScheduleAssignment(
id: $assignment->getId(),
element: $assignment->getElement(),
scheduledDate: $assignment->getScheduledDate(),
position: $assignment->getPosition(),
);
},
$schedule->getAssignments(),
);
return new Schedule(
id: $schedule->getId(),
user: $schedule->getUser(),
set: $schedule->getSet(),
elementKind: $schedule->getElementKind(),
startDate: $schedule->getStartDate(),
targetDate: $schedule->getTargetDate(),
assignments: $assignments,
);
}
}