urlShortener = $this->prophesize(UrlShortener::class); $this->action = new CreateShortUrlAction($this->urlShortener->reveal(), [ 'schema' => 'http', 'hostname' => 'foo.com', ]); } /** * @test */ public function missingLongUrlParamReturnsError() { $response = $this->action->handle(ServerRequestFactory::fromGlobals()); $this->assertEquals(400, $response->getStatusCode()); } /** * @test */ public function properShortcodeConversionReturnsData() { $this->urlShortener->urlToShortCode(Argument::type(Uri::class), Argument::type('array'), Argument::cetera()) ->willReturn( (new ShortUrl(''))->setShortCode('abc123') ) ->shouldBeCalledOnce(); $request = ServerRequestFactory::fromGlobals()->withParsedBody([ 'longUrl' => 'http://www.domain.com/foo/bar', ]); $response = $this->action->handle($request); $this->assertEquals(200, $response->getStatusCode()); $this->assertTrue(strpos($response->getBody()->getContents(), 'http://foo.com/abc123') > 0); } /** * @test */ public function anInvalidUrlReturnsError() { $this->urlShortener->urlToShortCode(Argument::type(Uri::class), Argument::type('array'), Argument::cetera()) ->willThrow(InvalidUrlException::class) ->shouldBeCalledOnce(); $request = ServerRequestFactory::fromGlobals()->withParsedBody([ 'longUrl' => 'http://www.domain.com/foo/bar', ]); $response = $this->action->handle($request); $this->assertEquals(400, $response->getStatusCode()); $this->assertTrue(strpos($response->getBody()->getContents(), RestUtils::INVALID_URL_ERROR) > 0); } /** * @test */ public function nonUniqueSlugReturnsError() { $this->urlShortener->urlToShortCode( Argument::type(Uri::class), Argument::type('array'), null, null, 'foo', Argument::cetera() )->willThrow(NonUniqueSlugException::class)->shouldBeCalledOnce(); $request = ServerRequestFactory::fromGlobals()->withParsedBody([ 'longUrl' => 'http://www.domain.com/foo/bar', 'customSlug' => 'foo', ]); $response = $this->action->handle($request); $this->assertEquals(400, $response->getStatusCode()); $this->assertContains(RestUtils::INVALID_SLUG_ERROR, (string) $response->getBody()); } /** * @test */ public function aGenericExceptionWillReturnError() { $this->urlShortener->urlToShortCode(Argument::type(Uri::class), Argument::type('array'), Argument::cetera()) ->willThrow(Exception::class) ->shouldBeCalledOnce(); $request = ServerRequestFactory::fromGlobals()->withParsedBody([ 'longUrl' => 'http://www.domain.com/foo/bar', ]); $response = $this->action->handle($request); $this->assertEquals(500, $response->getStatusCode()); $this->assertTrue(strpos($response->getBody()->getContents(), RestUtils::UNKNOWN_ERROR) > 0); } }