test stable schedule snapshots
This commit is contained in:
parent
92905c981b
commit
14fe2fcb46
3 changed files with 91 additions and 17 deletions
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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');
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue