create(new CreateSetDto( name: 'Bible', creator: $creator, )); $course = $setRepository->create(new CreateSetDto( name: 'Course', creator: $creator, )); $bookLevel = $setLevelRepository->create(new CreateSetLevelDto( set: $bible, 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( name: 'Exodus', level: $bookLevel, parentElement: null, )); $creation = $elementRepository->create(new CreateElementDto( name: 'Creation', level: $portionLevel, parentElement: $genesis, )); $elementRepository->create(new CreateElementDto( name: 'Noah', level: $portionLevel, parentElement: $genesis, )); $elementRepository->create(new CreateElementDto( name: 'Chapter 1', level: $chapterLevel, parentElement: $creation, )); $elementRepository->create(new CreateElementDto( name: 'Foundations', 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()), ); $genesisNode = $layout->getElements()[0]; $this->assertSame( ['Creation', 'Noah'], $this->nodeNames($genesisNode->getChildren()), ); $this->assertSame( ['Chapter 1'], $this->nodeNames( $genesisNode->getChildren()[0]->getChildren(), ), ); } public function test_it_returns_an_empty_layout(): void { $creator = new User( id: 7, email: new EmailAddress('creator@example.com'), 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 { $this->expectException(NotFoundException::class); $this->expectExceptionMessage('set not found'); (new GetSetLayout( new FakeSetRepository, new FakeSetLevelRepository, new FakeElementRepository, ))->execute(new GetSetLayoutRequest( setId: 999, )); } /** * @param list $nodes * @return list */ private function nodeNames(array $nodes): array { return array_map(function ($node): string { return $node->getElement()->getName(); }, $nodes); } }