Forcing every call site to be explicit about admin status and password eliminates a class of bugs where an unintended isAdmin=false or empty passwordHash could silently slip through. The CreateUserTest case that asserted the isAdmin default is dropped since the default no longer exists.
109 lines
3.1 KiB
PHP
109 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit\ScheduledNode\UseCases;
|
|
|
|
use App\Exceptions\BadRequestException;
|
|
use App\Plan\CreatePlanDto;
|
|
use App\Plan\Plan;
|
|
use App\ScheduledNode\ScheduledNode;
|
|
use App\ScheduledNode\ScheduledNodeRepository;
|
|
use App\ScheduledNode\UseCases\CreateScheduledNode;
|
|
use App\ScheduledNode\UseCases\CreateScheduledNodeRequest;
|
|
use App\User\User;
|
|
use App\ValueObjects\EmailAddress;
|
|
use DomainException;
|
|
use Tests\Fakes\FakePlanRepository;
|
|
use Tests\Fakes\FakeScheduledNodeRepository;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
class CreateScheduledNodeTest extends TestCase
|
|
{
|
|
private FakeScheduledNodeRepository $scheduledNodeRepo;
|
|
|
|
private FakePlanRepository $planRepo;
|
|
|
|
private CreateScheduledNode $useCase;
|
|
|
|
public function setUp(): void
|
|
{
|
|
$this->scheduledNodeRepo = new FakeScheduledNodeRepository();
|
|
$this->planRepo = new FakePlanRepository();
|
|
$this->planRepo->create(new CreatePlanDto(
|
|
name: 'testplan',
|
|
user: new User(
|
|
id: 0,
|
|
email: new EmailAddress('test@test.com'),
|
|
passwordHash: 'hashed:password1',
|
|
isAdmin: false,
|
|
),
|
|
));
|
|
$this->useCase = new CreateScheduledNode(
|
|
$this->scheduledNodeRepo,
|
|
$this->planRepo,
|
|
);
|
|
}
|
|
|
|
public function test_create_scheduled_node(): void
|
|
{
|
|
$scheduledNode = $this->useCase->execute(
|
|
new CreateScheduledNodeRequest(
|
|
date: '2025-01-01',
|
|
planId: 0,
|
|
)
|
|
);
|
|
$this->assertInstanceOf(ScheduledNode::class, $scheduledNode);
|
|
$this->assertInstanceOf(
|
|
ScheduledNodeRepository::class,
|
|
$this->scheduledNodeRepo
|
|
);
|
|
}
|
|
|
|
public function test_scheduled_node_belongs_to_plan(): void
|
|
{
|
|
$scheduledNode = $this->useCase->execute(
|
|
new CreateScheduledNodeRequest(
|
|
date: '2025-01-01',
|
|
planId: 0,
|
|
)
|
|
);
|
|
$this->assertInstanceOf(Plan::class, $scheduledNode->getPlan());
|
|
}
|
|
|
|
public function test_nonexistant_plan_throws(): void
|
|
{
|
|
$this->expectException(DomainException::class);
|
|
$this->expectExceptionMessage('Plan with id: 1 doesnt exist');
|
|
$this->useCase->execute(
|
|
new CreateScheduledNodeRequest(
|
|
date: '2025-01-01',
|
|
planId: 1,
|
|
)
|
|
);
|
|
}
|
|
|
|
public function test_throws_if_date_is_null(): void
|
|
{
|
|
$this->expectException(BadRequestException::class);
|
|
$this->expectExceptionMessage('date is required');
|
|
|
|
$this->useCase->execute(
|
|
new CreateScheduledNodeRequest(
|
|
date: null,
|
|
planId: 0,
|
|
)
|
|
);
|
|
}
|
|
|
|
public function test_throws_if_plan_id_is_null(): void
|
|
{
|
|
$this->expectException(BadRequestException::class);
|
|
$this->expectExceptionMessage('planId is required');
|
|
|
|
$this->useCase->execute(
|
|
new CreateScheduledNodeRequest(
|
|
date: '2025-01-01',
|
|
planId: null,
|
|
)
|
|
);
|
|
}
|
|
}
|