service = $this->prophesize(DeleteShortUrlServiceInterface::class); $this->action = new DeleteShortUrlAction($this->service->reveal()); } /** @test */ public function emptyResponseIsReturnedIfProperlyDeleted(): void { $deleteByShortCode = $this->service->deleteByShortCode(Argument::any())->will(function () { }); $resp = $this->action->handle(new ServerRequest()); $this->assertEquals(204, $resp->getStatusCode()); $deleteByShortCode->shouldHaveBeenCalledOnce(); } /** * @test * @dataProvider provideExceptions */ public function returnsErrorResponseInCaseOfException(Throwable $e, string $error, int $statusCode): void { $deleteByShortCode = $this->service->deleteByShortCode(Argument::any())->willThrow($e); /** @var JsonResponse $resp */ $resp = $this->action->handle(new ServerRequest()); $payload = $resp->getPayload(); $this->assertEquals($statusCode, $resp->getStatusCode()); $this->assertEquals($error, $payload['error']); $deleteByShortCode->shouldHaveBeenCalledOnce(); } public function provideExceptions(): iterable { yield 'not found' => [new Exception\InvalidShortCodeException(), RestUtils::INVALID_SHORTCODE_ERROR, 404]; yield 'bad request' => [ new Exception\DeleteShortUrlException(5), RestUtils::INVALID_SHORTCODE_DELETION_ERROR, 400, ]; } }