test stable schedule snapshots

This commit is contained in:
Yisroel Baum 2026-08-10 22:33:44 +03:00
parent 92905c981b
commit 14fe2fcb46
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
3 changed files with 91 additions and 17 deletions

View file

@ -23,7 +23,9 @@ class FakeScheduleRepository implements ScheduleRepository
foreach ($dto->assignments as $assignmentDto) { foreach ($dto->assignments as $assignmentDto) {
$assignments[] = new ScheduleAssignment( $assignments[] = new ScheduleAssignment(
id: count($assignments) + 1, id: count($assignments) + 1,
element: $assignmentDto->element, name: $assignmentDto->name,
kind: $assignmentDto->kind,
path: $assignmentDto->path,
scheduledDate: $assignmentDto->scheduledDate, scheduledDate: $assignmentDto->scheduledDate,
position: $assignmentDto->position, position: $assignmentDto->position,
); );
@ -32,7 +34,7 @@ class FakeScheduleRepository implements ScheduleRepository
$schedule = new Schedule( $schedule = new Schedule(
id: $id, id: $id,
user: $dto->user, user: $dto->user,
set: $dto->set, setName: $dto->setName,
elementKind: $dto->elementKind, elementKind: $dto->elementKind,
startDate: $dto->startDate, startDate: $dto->startDate,
targetDate: $dto->targetDate, targetDate: $dto->targetDate,
@ -76,7 +78,9 @@ class FakeScheduleRepository implements ScheduleRepository
function (ScheduleAssignment $assignment): ScheduleAssignment { function (ScheduleAssignment $assignment): ScheduleAssignment {
return new ScheduleAssignment( return new ScheduleAssignment(
id: $assignment->getId(), id: $assignment->getId(),
element: $assignment->getElement(), name: $assignment->getName(),
kind: $assignment->getKind(),
path: $assignment->getPath(),
scheduledDate: $assignment->getScheduledDate(), scheduledDate: $assignment->getScheduledDate(),
position: $assignment->getPosition(), position: $assignment->getPosition(),
); );
@ -87,7 +91,7 @@ class FakeScheduleRepository implements ScheduleRepository
return new Schedule( return new Schedule(
id: $schedule->getId(), id: $schedule->getId(),
user: $schedule->getUser(), user: $schedule->getUser(),
set: $schedule->getSet(), setName: $schedule->getSetName(),
elementKind: $schedule->getElementKind(), elementKind: $schedule->getElementKind(),
startDate: $schedule->getStartDate(), startDate: $schedule->getStartDate(),
targetDate: $schedule->getTargetDate(), targetDate: $schedule->getTargetDate(),

View file

@ -5,10 +5,12 @@ namespace Tests\Feature\Schedule;
use App\Auth\CreateSessionDto; use App\Auth\CreateSessionDto;
use App\Auth\SessionRepository; use App\Auth\SessionRepository;
use App\Element\CreateElementDto; use App\Element\CreateElementDto;
use App\Element\ElementModel;
use App\Element\ElementRepository; use App\Element\ElementRepository;
use App\Http\Middleware\AuthMiddleware; use App\Http\Middleware\AuthMiddleware;
use App\Set\CreateSetDto; use App\Set\CreateSetDto;
use App\Set\Set; use App\Set\Set;
use App\Set\SetModel;
use App\Set\SetRepository; use App\Set\SetRepository;
use App\Shared\ValueObject\EmailAddress; use App\Shared\ValueObject\EmailAddress;
use App\User\CreateUserDto; use App\User\CreateUserDto;
@ -17,6 +19,7 @@ use App\User\UserRepository;
use DateTimeImmutable; use DateTimeImmutable;
use DateTimeZone; use DateTimeZone;
use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Schema;
use Illuminate\Testing\TestResponse; use Illuminate\Testing\TestResponse;
use Tests\TestCase; use Tests\TestCase;
@ -73,7 +76,6 @@ class ScheduleEndpointTest extends TestCase
'schedule' => [ 'schedule' => [
'id' => 1, 'id' => 1,
'set' => [ 'set' => [
'id' => $set->getId(),
'name' => 'Bible', 'name' => 'Bible',
], ],
'elementKind' => 'chapter', 'elementKind' => 'chapter',
@ -85,8 +87,8 @@ class ScheduleEndpointTest extends TestCase
'date' => '2026-08-10', 'date' => '2026-08-10',
'assignments' => [ 'assignments' => [
[ [
'id' => 1,
'element' => [ 'element' => [
'id' => $chapterOne->getId(),
'name' => 'Chapter 1', 'name' => 'Chapter 1',
'kind' => 'chapter', 'kind' => 'chapter',
'path' => [ 'path' => [
@ -106,8 +108,8 @@ class ScheduleEndpointTest extends TestCase
'date' => '2026-08-12', 'date' => '2026-08-12',
'assignments' => [ 'assignments' => [
[ [
'id' => 2,
'element' => [ 'element' => [
'id' => $chapterTwo->getId(),
'name' => 'Chapter 1', 'name' => 'Chapter 1',
'kind' => 'chapter', 'kind' => 'chapter',
'path' => [ 'path' => [
@ -123,12 +125,29 @@ class ScheduleEndpointTest extends TestCase
]); ]);
$this->assertDatabaseHas('schedules', [ $this->assertDatabaseHas('schedules', [
'user_id' => $user->getId(), 'user_id' => $user->getId(),
'set_id' => $set->getId(), 'set_name' => 'Bible',
'element_kind' => 'chapter', 'element_kind' => 'chapter',
'start_date' => '2026-08-10', 'start_date' => '2026-08-10',
'target_date' => '2026-08-12', 'target_date' => '2026-08-12',
]); ]);
$this->assertDatabaseHas('schedule_assignments', [
'schedule_id' => 1,
'element_name' => 'Chapter 1',
'element_kind' => 'chapter',
'element_path' => json_encode([
'Genesis',
'Creation',
'Chapter 1',
]),
'scheduled_date' => '2026-08-10',
'position' => 1,
]);
$this->assertDatabaseCount('schedule_assignments', 2); $this->assertDatabaseCount('schedule_assignments', 2);
$this->assertFalse(Schema::hasColumn('schedules', 'set_id'));
$this->assertFalse(Schema::hasColumn(
'schedule_assignments',
'element_id',
));
$this->credentialedGet('/api/schedules/1') $this->credentialedGet('/api/schedules/1')
->assertOk() ->assertOk()
@ -179,7 +198,6 @@ class ScheduleEndpointTest extends TestCase
[ [
'id' => 2, 'id' => 2,
'set' => [ 'set' => [
'id' => $set->getId(),
'name' => 'Course', 'name' => 'Course',
], ],
'elementKind' => 'lesson', 'elementKind' => 'lesson',
@ -190,7 +208,6 @@ class ScheduleEndpointTest extends TestCase
[ [
'id' => 1, 'id' => 1,
'set' => [ 'set' => [
'id' => $set->getId(),
'name' => 'Course', 'name' => 'Course',
], ],
'elementKind' => 'lesson', 'elementKind' => 'lesson',
@ -202,6 +219,55 @@ class ScheduleEndpointTest extends TestCase
]); ]);
} }
public function test_it_is_stable_after_sources_change_or_are_deleted(): void
{
$user = $this->createUser('reader@example.com');
$set = $this->createSet($user, 'Original set');
$repository = app(ElementRepository::class);
$parent = $repository->create(new CreateElementDto(
set: $set,
name: 'Original parent',
kind: 'group',
parentElement: null,
));
$element = $repository->create(new CreateElementDto(
set: $set,
name: 'Original item',
kind: 'task',
parentElement: $parent,
));
$this->createSession($user, 'valid-token');
$createdResponse = $this->credentialedPost('/api/schedules', [
'setId' => $set->getId(),
'elementKind' => 'task',
'startDate' => '2026-08-10',
'targetDate' => '2026-08-10',
])->assertCreated();
SetModel::query()->whereKey($set->getId())->update([
'name' => 'Changed set',
]);
ElementModel::query()->whereKey($parent->getId())->update([
'name' => 'Changed parent',
]);
ElementModel::query()->whereKey($element->getId())->update([
'name' => 'Changed item',
'kind' => 'changed-kind',
]);
$this->credentialedGet('/api/schedules/1')
->assertOk()
->assertExactJson($createdResponse->json());
ElementModel::query()->whereKey($element->getId())->delete();
ElementModel::query()->whereKey($parent->getId())->delete();
SetModel::query()->whereKey($set->getId())->delete();
$this->credentialedGet('/api/schedules/1')
->assertOk()
->assertExactJson($createdResponse->json());
}
public function test_it_hides_another_users_schedule(): void public function test_it_hides_another_users_schedule(): void
{ {
$owner = $this->createUser('owner@example.com'); $owner = $this->createUser('owner@example.com');

View file

@ -107,16 +107,20 @@ class CreateScheduleTest extends TestCase
)); ));
$this->assertSame( $this->assertSame(
[ [
$genesisChapterOne->getId(), $genesisChapterOne->getName(),
$genesisChapterTwo->getId(), $genesisChapterTwo->getName(),
$genesisChapterThree->getId(), $genesisChapterThree->getName(),
$exodusChapterOne->getId(), $exodusChapterOne->getName(),
$exodusChapterTwo->getId(), $exodusChapterTwo->getName(),
], ],
array_map(function ($assignment): int { array_map(function ($assignment): string {
return $assignment->getElement()->getId(); return $assignment->getName();
}, $schedule->getAssignments()), }, $schedule->getAssignments()),
); );
$this->assertSame(
['Genesis', 'Creation', 'Genesis 1'],
$schedule->getAssignments()[0]->getPath(),
);
$this->assertSame( $this->assertSame(
[ [
'2026-08-10', '2026-08-10',