diff --git a/backend/tests/Feature/Element/EloquentElementRepositoryTest.php b/backend/tests/Feature/Element/EloquentElementRepositoryTest.php index 76766c5..9cc6020 100644 --- a/backend/tests/Feature/Element/EloquentElementRepositoryTest.php +++ b/backend/tests/Feature/Element/EloquentElementRepositoryTest.php @@ -5,7 +5,10 @@ namespace Tests\Feature\Element; use App\Element\CreateElementDto; use App\Element\ElementRepository; use App\Set\CreateSetDto; +use App\Set\CreateSetLevelDto; use App\Set\Set; +use App\Set\SetLevel; +use App\Set\SetLevelRepository; use App\Set\SetRepository; use App\Shared\ValueObject\EmailAddress; use App\User\CreateUserDto; @@ -22,28 +25,26 @@ class EloquentElementRepositoryTest extends TestCase { $set = $this->createSet('Bible'); $repository = app(ElementRepository::class); + $bookLevel = $this->createLevel($set, 'book'); + $portionLevel = $this->createLevel($set, 'portion'); $genesisBook = $repository->create(new CreateElementDto( - set: $set, name: 'Genesis', - kind: 'book', + level: $bookLevel, parentElement: null, )); $exodusBook = $repository->create(new CreateElementDto( - set: $set, name: 'Exodus', - kind: 'book', + level: $bookLevel, parentElement: null, )); $genesisPortion = $repository->create(new CreateElementDto( - set: $set, name: 'Genesis', - kind: 'portion', + level: $portionLevel, parentElement: $genesisBook, )); $noahPortion = $repository->create(new CreateElementDto( - set: $set, name: 'Noah', - kind: 'portion', + level: $portionLevel, parentElement: $genesisBook, )); @@ -53,9 +54,8 @@ class EloquentElementRepositoryTest extends TestCase $this->assertSame(2, $noahPortion->getPosition()); $this->assertDatabaseHas('elements', [ 'id' => $genesisPortion->getId(), - 'set_id' => $set->getId(), + 'set_level_id' => $portionLevel->getId(), 'name' => 'Genesis', - 'kind' => 'portion', 'parent_element_id' => $genesisBook->getId(), 'position' => 1, ]); @@ -65,6 +65,10 @@ class EloquentElementRepositoryTest extends TestCase $this->assertNotNull($foundElement); $this->assertSame('Noah', $foundElement->getName()); $this->assertSame('portion', $foundElement->getKind()); + $this->assertSame( + $portionLevel->getId(), + $foundElement->getLevel()->getId(), + ); $this->assertSame($set->getId(), $foundElement->getSet()->getId()); $this->assertSame( $genesisBook->getId(), @@ -77,10 +81,11 @@ class EloquentElementRepositoryTest extends TestCase $bible = $this->createSet('Bible'); $course = $this->createSet('Course'); $repository = app(ElementRepository::class); + $bookLevel = $this->createLevel($bible, 'book'); + $moduleLevel = $this->createLevel($course, 'module'); $book = $repository->create(new CreateElementDto( - set: $bible, name: 'Genesis', - kind: 'book', + level: $bookLevel, parentElement: null, )); @@ -90,9 +95,51 @@ class EloquentElementRepositoryTest extends TestCase ); $repository->create(new CreateElementDto( - set: $course, name: 'Invalid lesson', - kind: 'lesson', + level: $moduleLevel, + parentElement: $book, + )); + } + + public function testItRejectsARootOutsideTheFirstLevel(): void + { + $set = $this->createSet('Bible'); + $this->createLevel($set, 'book'); + $portionLevel = $this->createLevel($set, 'portion'); + + $this->expectException(DomainException::class); + $this->expectExceptionMessage( + 'root element must use the first set level', + ); + + app(ElementRepository::class)->create(new CreateElementDto( + name: 'Creation', + level: $portionLevel, + parentElement: null, + )); + } + + public function testItRejectsAChildOutsideTheNextLevel(): void + { + $set = $this->createSet('Bible'); + $bookLevel = $this->createLevel($set, 'book'); + $this->createLevel($set, 'portion'); + $chapterLevel = $this->createLevel($set, 'chapter'); + $repository = app(ElementRepository::class); + $book = $repository->create(new CreateElementDto( + name: 'Genesis', + level: $bookLevel, + parentElement: null, + )); + + $this->expectException(DomainException::class); + $this->expectExceptionMessage( + 'child element must use the next set level', + ); + + $repository->create(new CreateElementDto( + name: 'Chapter 1', + level: $chapterLevel, parentElement: $book, )); } @@ -102,40 +149,37 @@ class EloquentElementRepositoryTest extends TestCase $bible = $this->createSet('Bible'); $course = $this->createSet('Course'); $repository = app(ElementRepository::class); + $bookLevel = $this->createLevel($bible, 'book'); + $portionLevel = $this->createLevel($bible, 'portion'); + $moduleLevel = $this->createLevel($course, 'module'); $genesisBook = $repository->create(new CreateElementDto( - set: $bible, name: 'Genesis', - kind: 'book', + level: $bookLevel, parentElement: null, )); $exodusBook = $repository->create(new CreateElementDto( - set: $bible, name: 'Exodus', - kind: 'book', + level: $bookLevel, parentElement: null, )); $repository->create(new CreateElementDto( - set: $course, name: 'Module 1', - kind: 'module', + level: $moduleLevel, parentElement: null, )); $repository->create(new CreateElementDto( - set: $bible, name: 'Genesis', - kind: 'portion', + level: $portionLevel, parentElement: $genesisBook, )); $repository->create(new CreateElementDto( - set: $bible, name: 'Noah', - kind: 'portion', + level: $portionLevel, parentElement: $genesisBook, )); $repository->create(new CreateElementDto( - set: $bible, name: 'Shemot', - kind: 'portion', + level: $portionLevel, parentElement: $exodusBook, )); @@ -161,22 +205,22 @@ class EloquentElementRepositoryTest extends TestCase $bible = $this->createSet('Bible'); $course = $this->createSet('Course'); $repository = app(ElementRepository::class); + $bookLevel = $this->createLevel($bible, 'book'); + $portionLevel = $this->createLevel($bible, 'portion'); + $moduleLevel = $this->createLevel($course, 'module'); $genesis = $repository->create(new CreateElementDto( - set: $bible, name: 'Genesis', - kind: 'book', + level: $bookLevel, parentElement: null, )); $repository->create(new CreateElementDto( - set: $bible, name: 'Creation', - kind: 'portion', + level: $portionLevel, parentElement: $genesis, )); $repository->create(new CreateElementDto( - set: $course, name: 'Foundations', - kind: 'module', + level: $moduleLevel, parentElement: null, )); @@ -207,4 +251,12 @@ class EloquentElementRepositoryTest extends TestCase creator: $creator, )); } + + private function createLevel(Set $set, string $kind): SetLevel + { + return app(SetLevelRepository::class)->create(new CreateSetLevelDto( + set: $set, + kind: $kind, + )); + } } diff --git a/backend/tests/Unit/Element/ElementTest.php b/backend/tests/Unit/Element/ElementTest.php index 1a99b31..3acd12d 100644 --- a/backend/tests/Unit/Element/ElementTest.php +++ b/backend/tests/Unit/Element/ElementTest.php @@ -4,6 +4,7 @@ namespace Tests\Unit\Element; use App\Element\Element; use App\Set\Set; +use App\Set\SetLevel; use App\Shared\ValueObject\EmailAddress; use App\User\User; use PHPUnit\Framework\TestCase; @@ -22,19 +23,29 @@ class ElementTest extends TestCase name: 'Bible', creator: $creator, ); + $bookLevel = new SetLevel( + id: 31, + set: $set, + kind: 'book', + depth: 0, + ); + $portionLevel = new SetLevel( + id: 32, + set: $set, + kind: 'portion', + depth: 1, + ); $parentElement = new Element( id: 21, name: 'Genesis', - kind: 'book', - set: $set, + level: $bookLevel, parentElement: null, position: 1, ); $element = new Element( id: 22, name: 'Genesis', - kind: 'portion', - set: $set, + level: $portionLevel, parentElement: $parentElement, position: 2, ); @@ -42,6 +53,7 @@ class ElementTest extends TestCase $this->assertSame(22, $element->getId()); $this->assertSame('Genesis', $element->getName()); $this->assertSame('portion', $element->getKind()); + $this->assertSame($portionLevel, $element->getLevel()); $this->assertSame($set, $element->getSet()); $this->assertSame($parentElement, $element->getParentElement()); $this->assertSame(2, $element->getPosition());