Rabbi_Gerzi/backend/tests/Unit/Element/UseCases/GetElementTest.php

136 lines
3.9 KiB
PHP

<?php
namespace Tests\Unit\Element\UseCases;
use App\Element\CreateElementDto;
use App\Element\Element;
use App\Element\UseCases\GetElement\GetElement;
use App\Element\UseCases\GetElement\GetElementRequest;
use App\Exceptions\BadRequestException;
use App\Exceptions\NotFoundException;
use App\Set\Set as DomainSet;
use Tests\Fakes\FakeElementRepository;
use Tests\TestCase;
class GetElementTest extends TestCase
{
private FakeElementRepository $elementRepo;
private GetElement $getElement;
protected function setUp(): void
{
$this->elementRepo = new FakeElementRepository();
$this->getElement = new GetElement($this->elementRepo);
}
public function testReturnsElementWhenFound(): void
{
$set = $this->createSet(1, 'Baderech');
$element = $this->createElement(
$set,
'Baderech HaAvodah',
null,
);
$result = $this->getElement->execute(new GetElementRequest(
id: $element->getId(),
));
$foundElement = $result->getElement();
$this->assertInstanceOf(Element::class, $foundElement);
$this->assertSame($element->getId(), $foundElement->getId());
$this->assertSame('Baderech HaAvodah', $foundElement->getTitle());
}
public function testReturnsDirectChildElements(): void
{
$set = $this->createSet(1, 'Baderech');
$parentElement = $this->createElement(
$set,
'Baderech HaAvodah',
null,
);
$firstChildElement = $this->createElement(
$set,
'Avodah Foundations',
$parentElement,
);
$secondChildElement = $this->createElement(
$set,
'Daily Practice',
$parentElement,
);
$this->createElement(
$set,
'Nested Practice',
$firstChildElement,
);
$otherSet = $this->createSet(2, 'Daily Learning');
$otherParentElement = $this->createElement(
$otherSet,
'Other Parent',
null,
);
$this->createElement(
$otherSet,
'Other Child',
$otherParentElement,
);
$result = $this->getElement->execute(new GetElementRequest(
id: $parentElement->getId(),
));
$childElements = $result->getChildElements();
$this->assertCount(2, $childElements);
$this->assertSame(
$firstChildElement->getId(),
$childElements[0]->getId(),
);
$this->assertSame('Avodah Foundations', $childElements[0]->getTitle());
$this->assertSame(
$secondChildElement->getId(),
$childElements[1]->getId(),
);
$this->assertSame('Daily Practice', $childElements[1]->getTitle());
}
public function testThrowsWhenIdMissing(): void
{
$this->expectException(BadRequestException::class);
$this->expectExceptionMessage('id is required');
$this->getElement->execute(new GetElementRequest(id: null));
}
public function testThrowsWhenElementDoesNotExist(): void
{
$this->expectException(NotFoundException::class);
$this->expectExceptionMessage('Element not found');
$this->getElement->execute(new GetElementRequest(id: 999));
}
private function createSet(int $id, string $name): DomainSet
{
return new DomainSet(
id: $id,
name: $name,
description: "$name description",
iconImageUrl: '/assets/baderech-icon.png',
);
}
private function createElement(
DomainSet $set,
string $title,
?Element $parentElement,
): Element {
return $this->elementRepo->create(new CreateElementDto(
set: $set,
title: $title,
parentElement: $parentElement,
));
}
}