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

@ -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');