client = $this->prophesize(Client::class); $this->ipResolver = new IpApiLocationResolver($this->client->reveal()); } /** @test */ public function correctIpReturnsDecodedInfo(): void { $actual = [ 'countryCode' => 'bar', 'lat' => 5, 'lon' => 10, ]; $expected = new Location('bar', '', '', '', 5, 10, ''); $response = new Response(); $response->getBody()->write(json_encode($actual)); $response->getBody()->rewind(); $this->client->get('http://ip-api.com/json/1.2.3.4')->willReturn($response) ->shouldBeCalledOnce(); $this->assertEquals($expected, $this->ipResolver->resolveIpLocation('1.2.3.4')); } /** @test */ public function guzzleExceptionThrowsShlinkException(): void { $this->client->get('http://ip-api.com/json/1.2.3.4')->willThrow(new TransferException()) ->shouldBeCalledOnce(); $this->expectException(WrongIpException::class); $this->ipResolver->resolveIpLocation('1.2.3.4'); } }