diff --git a/backend/tests/Fakes/FakeScheduleRepository.php b/backend/tests/Fakes/FakeScheduleRepository.php index 06e281e..de1ae76 100644 --- a/backend/tests/Fakes/FakeScheduleRepository.php +++ b/backend/tests/Fakes/FakeScheduleRepository.php @@ -23,7 +23,9 @@ class FakeScheduleRepository implements ScheduleRepository foreach ($dto->assignments as $assignmentDto) { $assignments[] = new ScheduleAssignment( id: count($assignments) + 1, - element: $assignmentDto->element, + name: $assignmentDto->name, + kind: $assignmentDto->kind, + path: $assignmentDto->path, scheduledDate: $assignmentDto->scheduledDate, position: $assignmentDto->position, ); @@ -32,7 +34,7 @@ class FakeScheduleRepository implements ScheduleRepository $schedule = new Schedule( id: $id, user: $dto->user, - set: $dto->set, + setName: $dto->setName, elementKind: $dto->elementKind, startDate: $dto->startDate, targetDate: $dto->targetDate, @@ -76,7 +78,9 @@ class FakeScheduleRepository implements ScheduleRepository function (ScheduleAssignment $assignment): ScheduleAssignment { return new ScheduleAssignment( id: $assignment->getId(), - element: $assignment->getElement(), + name: $assignment->getName(), + kind: $assignment->getKind(), + path: $assignment->getPath(), scheduledDate: $assignment->getScheduledDate(), position: $assignment->getPosition(), ); @@ -87,7 +91,7 @@ class FakeScheduleRepository implements ScheduleRepository return new Schedule( id: $schedule->getId(), user: $schedule->getUser(), - set: $schedule->getSet(), + setName: $schedule->getSetName(), elementKind: $schedule->getElementKind(), startDate: $schedule->getStartDate(), targetDate: $schedule->getTargetDate(), diff --git a/backend/tests/Feature/Schedule/ScheduleEndpointTest.php b/backend/tests/Feature/Schedule/ScheduleEndpointTest.php index 6b9a679..1093de8 100644 --- a/backend/tests/Feature/Schedule/ScheduleEndpointTest.php +++ b/backend/tests/Feature/Schedule/ScheduleEndpointTest.php @@ -5,10 +5,12 @@ namespace Tests\Feature\Schedule; use App\Auth\CreateSessionDto; use App\Auth\SessionRepository; use App\Element\CreateElementDto; +use App\Element\ElementModel; use App\Element\ElementRepository; use App\Http\Middleware\AuthMiddleware; use App\Set\CreateSetDto; use App\Set\Set; +use App\Set\SetModel; use App\Set\SetRepository; use App\Shared\ValueObject\EmailAddress; use App\User\CreateUserDto; @@ -17,6 +19,7 @@ use App\User\UserRepository; use DateTimeImmutable; use DateTimeZone; use Illuminate\Foundation\Testing\RefreshDatabase; +use Illuminate\Support\Facades\Schema; use Illuminate\Testing\TestResponse; use Tests\TestCase; @@ -73,7 +76,6 @@ class ScheduleEndpointTest extends TestCase 'schedule' => [ 'id' => 1, 'set' => [ - 'id' => $set->getId(), 'name' => 'Bible', ], 'elementKind' => 'chapter', @@ -85,8 +87,8 @@ class ScheduleEndpointTest extends TestCase 'date' => '2026-08-10', 'assignments' => [ [ + 'id' => 1, 'element' => [ - 'id' => $chapterOne->getId(), 'name' => 'Chapter 1', 'kind' => 'chapter', 'path' => [ @@ -106,8 +108,8 @@ class ScheduleEndpointTest extends TestCase 'date' => '2026-08-12', 'assignments' => [ [ + 'id' => 2, 'element' => [ - 'id' => $chapterTwo->getId(), 'name' => 'Chapter 1', 'kind' => 'chapter', 'path' => [ @@ -123,12 +125,29 @@ class ScheduleEndpointTest extends TestCase ]); $this->assertDatabaseHas('schedules', [ 'user_id' => $user->getId(), - 'set_id' => $set->getId(), + 'set_name' => 'Bible', 'element_kind' => 'chapter', 'start_date' => '2026-08-10', '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->assertFalse(Schema::hasColumn('schedules', 'set_id')); + $this->assertFalse(Schema::hasColumn( + 'schedule_assignments', + 'element_id', + )); $this->credentialedGet('/api/schedules/1') ->assertOk() @@ -179,7 +198,6 @@ class ScheduleEndpointTest extends TestCase [ 'id' => 2, 'set' => [ - 'id' => $set->getId(), 'name' => 'Course', ], 'elementKind' => 'lesson', @@ -190,7 +208,6 @@ class ScheduleEndpointTest extends TestCase [ 'id' => 1, 'set' => [ - 'id' => $set->getId(), 'name' => 'Course', ], '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 { $owner = $this->createUser('owner@example.com'); diff --git a/backend/tests/Unit/Schedule/UseCases/CreateScheduleTest.php b/backend/tests/Unit/Schedule/UseCases/CreateScheduleTest.php index 3814a56..3a4e715 100644 --- a/backend/tests/Unit/Schedule/UseCases/CreateScheduleTest.php +++ b/backend/tests/Unit/Schedule/UseCases/CreateScheduleTest.php @@ -107,16 +107,20 @@ class CreateScheduleTest extends TestCase )); $this->assertSame( [ - $genesisChapterOne->getId(), - $genesisChapterTwo->getId(), - $genesisChapterThree->getId(), - $exodusChapterOne->getId(), - $exodusChapterTwo->getId(), + $genesisChapterOne->getName(), + $genesisChapterTwo->getName(), + $genesisChapterThree->getName(), + $exodusChapterOne->getName(), + $exodusChapterTwo->getName(), ], - array_map(function ($assignment): int { - return $assignment->getElement()->getId(); + array_map(function ($assignment): string { + return $assignment->getName(); }, $schedule->getAssignments()), ); + $this->assertSame( + ['Genesis', 'Creation', 'Genesis 1'], + $schedule->getAssignments()[0]->getPath(), + ); $this->assertSame( [ '2026-08-10',