ipLocationResolver = $this->createMock(IpLocationResolverInterface::class); $this->helper = new VisitToLocationHelper($this->ipLocationResolver); } #[Test, DataProvider('provideNonLocatableVisits')] public function throwsExpectedErrorForNonLocatableVisit( Visit $visit, IpCannotBeLocatedException $expectedException, ): void { $this->expectExceptionObject($expectedException); $this->ipLocationResolver->expects($this->never())->method('resolveIpLocation'); $this->helper->resolveVisitLocation($visit); } public static function provideNonLocatableVisits(): iterable { yield [Visit::forBasePath(Visitor::empty()), IpCannotBeLocatedException::forEmptyAddress()]; yield [ Visit::forBasePath(Visitor::fromParams('foo', 'bar', IpAddress::LOCALHOST)), IpCannotBeLocatedException::forLocalhost(), ]; } #[Test] public function throwsGenericErrorWhenResolvingIpFails(): void { $e = new WrongIpException(''); $this->expectExceptionObject(IpCannotBeLocatedException::forError($e)); $this->ipLocationResolver->expects($this->once())->method('resolveIpLocation')->willThrowException($e); $this->helper->resolveVisitLocation(Visit::forBasePath(Visitor::fromParams('foo', 'bar', '1.2.3.4'))); } }