From cc7a62919338617a6833f98c91aba360946ee8fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Thu, 13 Aug 2026 12:47:39 +0200 Subject: [PATCH] test(UsecaseBuilder): add unit tests for UsecaseBuilder functionality This commit introduces unit tests for the UsecaseBuilder and UsecaseExecutionBuilder, ensuring proper behavior when building and executing use cases. --- .../Usecase/Builder/UsecaseBuilderTest.php | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 tests/Unit/Shared/DDD/Usecase/Builder/UsecaseBuilderTest.php diff --git a/tests/Unit/Shared/DDD/Usecase/Builder/UsecaseBuilderTest.php b/tests/Unit/Shared/DDD/Usecase/Builder/UsecaseBuilderTest.php new file mode 100644 index 0000000..9fcf848 --- /dev/null +++ b/tests/Unit/Shared/DDD/Usecase/Builder/UsecaseBuilderTest.php @@ -0,0 +1,144 @@ +success = true; + + $usecaseMock = new class ($outputMock) implements Usecase + { + public function __construct(private readonly Output $output) + { + } + + public function execute(Input $input): Output + { + return $this->output; + } + }; + + $presenterMock = new class ($viewResult) implements Presenter + { + public function __construct(private readonly object $view) + { + } + + public function present(Output $output): object + { + return $this->view; + } + }; + + $executorMock = new class ($viewResult) implements UsecaseExecutor + { + public function __construct(private readonly object $view) + { + } + + public function execute(Usecase $usecase, Input $input, Presenter $presenter): object + { + $output = $usecase->execute($input); + + return $presenter->present($output); + } + }; + + // WHEN + $result = UsecaseBuilder::using($executorMock) + ->do($usecaseMock) + ->from($inputMock) + ->with($presenterMock) + ->run(); + + // THEN + expect($result)->toBe($viewResult); + }); + + it('throws LogicException when setting input before usecase', function (): void { + // GIVEN + $executorMock = new class () implements UsecaseExecutor + { + public function execute(Usecase $usecase, Input $input, Presenter $presenter): object + { + return new \stdClass(); + } + }; + + $inputMock = new class () implements Input + { + }; + + // WHEN & THEN + $builder = new UsecaseExecutionBuilder($executorMock); + + expect(fn () => $builder->from($inputMock)) + ->toThrow(LogicException::class, 'Usecase must be set before input.'); + }); + + it('throws LogicException when setting presenter before input or usecase', function (): void { + // GIVEN + $executorMock = new class () implements UsecaseExecutor + { + public function execute(Usecase $usecase, Input $input, Presenter $presenter): object + { + return new \stdClass(); + } + }; + + $presenterMock = new class () implements Presenter + { + public function present(Output $output): object + { + return new \stdClass(); + } + }; + + // WHEN & THEN + $builder = new UsecaseExecutionBuilder($executorMock); + + expect(fn () => $builder->with($presenterMock)) + ->toThrow(LogicException::class, 'Usecase and input must be set before presenter.'); + }); + + it('throws LogicException when running uncompleted builder', function (): void { + // GIVEN + $executorMock = new class () implements UsecaseExecutor + { + public function execute(Usecase $usecase, Input $input, Presenter $presenter): object + { + return new \stdClass(); + } + }; + + // WHEN & THEN + $builder = new UsecaseExecutionBuilder($executorMock); + + expect(fn () => $builder->run()) + ->toThrow(LogicException::class, 'Usecase, input and presenter are all required.'); + }); +});