test level based scheduling

This commit is contained in:
Yisroel Baum 2026-08-11 22:54:55 +03:00
parent 99e1ba051c
commit a64df64b76
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
7 changed files with 415 additions and 94 deletions

View file

@ -5,6 +5,7 @@ namespace Tests\Unit\Set\UseCases;
use App\Element\CreateElementDto;
use App\Exceptions\NotFoundException;
use App\Set\CreateSetDto;
use App\Set\CreateSetLevelDto;
use App\Set\UseCases\GetSetLayout\ElementLayoutNode;
use App\Set\UseCases\GetSetLayout\GetSetLayout;
use App\Set\UseCases\GetSetLayout\GetSetLayoutRequest;
@ -13,6 +14,7 @@ use App\User\User;
use PHPUnit\Framework\TestCase;
use Tests\Fakes\FakeElementRepository;
use Tests\Fakes\FakeSetRepository;
use Tests\Fakes\FakeSetLevelRepository;
class GetSetLayoutTest extends TestCase
{
@ -24,6 +26,7 @@ class GetSetLayoutTest extends TestCase
passwordHash: 'hashed-password',
);
$setRepository = new FakeSetRepository;
$setLevelRepository = new FakeSetLevelRepository;
$elementRepository = new FakeElementRepository;
$bible = $setRepository->create(new CreateSetDto(
name: 'Bible',
@ -33,51 +36,69 @@ class GetSetLayoutTest extends TestCase
name: 'Course',
creator: $creator,
));
$genesis = $elementRepository->create(new CreateElementDto(
$bookLevel = $setLevelRepository->create(new CreateSetLevelDto(
set: $bible,
name: 'Genesis',
kind: 'book',
));
$portionLevel = $setLevelRepository->create(new CreateSetLevelDto(
set: $bible,
kind: 'portion',
));
$chapterLevel = $setLevelRepository->create(new CreateSetLevelDto(
set: $bible,
kind: 'chapter',
));
$moduleLevel = $setLevelRepository->create(new CreateSetLevelDto(
set: $course,
kind: 'module',
));
$genesis = $elementRepository->create(new CreateElementDto(
name: 'Genesis',
level: $bookLevel,
parentElement: null,
));
$elementRepository->create(new CreateElementDto(
set: $bible,
name: 'Exodus',
kind: 'book',
level: $bookLevel,
parentElement: null,
));
$creation = $elementRepository->create(new CreateElementDto(
set: $bible,
name: 'Creation',
kind: 'portion',
level: $portionLevel,
parentElement: $genesis,
));
$elementRepository->create(new CreateElementDto(
set: $bible,
name: 'Noah',
kind: 'portion',
level: $portionLevel,
parentElement: $genesis,
));
$elementRepository->create(new CreateElementDto(
set: $bible,
name: 'Chapter 1',
kind: 'chapter',
level: $chapterLevel,
parentElement: $creation,
));
$elementRepository->create(new CreateElementDto(
set: $course,
name: 'Foundations',
kind: 'module',
level: $moduleLevel,
parentElement: null,
));
$layout = (new GetSetLayout(
$setRepository,
$setLevelRepository,
$elementRepository,
))->execute(new GetSetLayoutRequest(
setId: $bible->getId(),
));
$this->assertSame('Bible', $layout->getSet()->getName());
$this->assertSame(
['book:2', 'portion:2', 'chapter:1'],
array_map(function ($level): string {
return $level->getLevel()->getKind()
. ":{$level->getElementCount()}";
}, $layout->getLevels()),
);
$this->assertSame(
['Genesis', 'Exodus'],
$this->nodeNames($layout->getElements()),
@ -103,19 +124,26 @@ class GetSetLayoutTest extends TestCase
passwordHash: 'hashed-password',
);
$setRepository = new FakeSetRepository;
$setLevelRepository = new FakeSetLevelRepository;
$set = $setRepository->create(new CreateSetDto(
name: 'Empty set',
creator: $creator,
));
$setLevelRepository->create(new CreateSetLevelDto(
set: $set,
kind: 'task',
));
$layout = (new GetSetLayout(
$setRepository,
$setLevelRepository,
new FakeElementRepository,
))->execute(new GetSetLayoutRequest(
setId: $set->getId(),
));
$this->assertSame([], $layout->getElements());
$this->assertSame(0, $layout->getLevels()[0]->getElementCount());
}
public function test_it_rejects_an_unknown_set(): void
@ -125,6 +153,7 @@ class GetSetLayoutTest extends TestCase
(new GetSetLayout(
new FakeSetRepository,
new FakeSetLevelRepository,
new FakeElementRepository,
))->execute(new GetSetLayoutRequest(
setId: 999,