body($this->get('/', ['format' => 'geoip'])) ); } public function testInvalidDataReturnsError(): void { self::assertStringContainsString( "must be 'ip4', 'cidr4', 'ip6' or 'cidr6'", $this->body($this->get('/', ['format' => 'geoip', 'data' => 'domains'])) ); } public function testGeneratesDatFileWhenBinaryAvailable(): void { if ($this->geoipBinary() === null) { self::markTestSkipped('v2fly geoip binary not available — skipping integration test'); } $response = $this->get('/', ['format' => 'geoip', 'data' => 'cidr4']); self::assertSame(200, $response->getStatus()); self::assertStringContainsString('iplist.dat', $response->getHeader('content-disposition') ?? ''); self::assertNotSame('', $this->body($response)); } }