baseUrl); self::assertSame('http://x', (new Client(baseUrl: 'http://x///'))->baseUrl); } public function testDefaults(): void { $client = new Client(); self::assertSame(Client::DEFAULT_URL, $client->baseUrl); self::assertSame(3, $client->maxAttempts); self::assertSame(0.5, $client->backoffBase); self::assertSame(8.0, $client->backoffMax); self::assertNull($client->totalTimeout); } public function testUserAgentIdentifiesTheLibrary(): void { self::assertStringContainsString( 'cepis-php/' . Client::VERSION, (new Client())->userAgent, ); self::assertSame('myapp/1.0', (new Client(userAgent: 'myapp/1.0'))->userAgent); } public function testInvalidParameters(): void { foreach ([['maxAttempts' => 0], ['timeout' => 0.0], ['backoffBase' => -1.0]] as $bad) { try { new Client(...$bad); self::fail('expected InvalidArgumentException for ' . json_encode($bad)); } catch (\InvalidArgumentException) { self::assertTrue(true); } } } public function testDefaultClientIsShared(): void { self::assertSame(Client::default(), Client::default()); self::assertSame(Client::DEFAULT_URL, Client::default()->baseUrl); } public function testMaxBatchMatchesTheApiLimit(): void { self::assertSame(500, Client::MAX_BATCH); } }