summaryrefslogtreecommitdiffstats
path: root/tests/LookupTest.php
diff options
context:
space:
mode:
authorMurilo Ijanc <[email protected]>2026-07-26 14:58:55 -0300
committerMurilo Ijanc <[email protected]>2026-07-26 14:58:55 -0300
commit64764fb9fac0227f8e0443e7c7519d73aec275b9 (patch)
treecb4fc56eeb6ecce53854f9c530609cf01ab3349f /tests/LookupTest.php
downloadphp-64764fb9fac0227f8e0443e7c7519d73aec275b9.tar.gz
Initial importv0.1.0
Diffstat (limited to 'tests/LookupTest.php')
-rw-r--r--tests/LookupTest.php154
1 files changed, 154 insertions, 0 deletions
diff --git a/tests/LookupTest.php b/tests/LookupTest.php
new file mode 100644
index 0000000..9483948
--- /dev/null
+++ b/tests/LookupTest.php
@@ -0,0 +1,154 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Cepis\Tests;
+
+use Cepis\CepNotFoundException;
+use Cepis\InvalidCepException;
+use Cepis\InvalidResponseException;
+
+final class LookupTest extends ServerTestCase
+{
+ public function testSuccessfulLookup(): void
+ {
+ $this->server->respond('/01001000', [self::json(self::SE_ADDRESS)]);
+ $address = $this->client->lookup('01001-000');
+
+ self::assertSame('Praça da Sé', $address->logradouro);
+ self::assertSame('São Paulo', $address->localidade);
+ self::assertSame('SP', $address->uf);
+ self::assertSame('01001000', $address->cep);
+ self::assertSame('01001-000', $address->formattedCep());
+ self::assertNull($address->geo);
+ }
+
+ public function testReadsTheCoordinateWhenPresent(): void
+ {
+ $body = self::SE_ADDRESS + [];
+ $body['geo'] = ['lat' => -23.567202, 'lon' => -46.649659, 'raio_m' => 1084, 'precisao' => 'logradouro'];
+ $this->server->respond('/01310100', [self::json($body)]);
+ $address = $this->client->lookup('01310100');
+
+ self::assertNotNull($address->geo);
+ self::assertEqualsWithDelta(-23.567202, $address->geo->lat, 1e-9);
+ self::assertEqualsWithDelta(-46.649659, $address->geo->lon, 1e-9);
+ self::assertSame(1084, $address->geo->raio_m);
+ self::assertSame('logradouro', $address->geo->precisao);
+ self::assertTrue($address->geo->isPrecise());
+ }
+
+ public function testMunicipalityCoordinateIsNotPrecise(): void
+ {
+ $body = self::SE_ADDRESS;
+ $body['geo'] = ['lat' => -23.5, 'lon' => -46.6, 'raio_m' => 22000, 'precisao' => 'localidade'];
+ $this->server->respond('/01001000', [self::json($body)]);
+
+ $geo = $this->client->lookup('01001000')->geo;
+ self::assertNotNull($geo);
+ self::assertFalse($geo->isPrecise());
+ }
+
+ public function testMalformedGeoDoesNotLoseTheAddress(): void
+ {
+ $body = self::SE_ADDRESS;
+ $body['geo'] = ['lat' => 'not a number'];
+ $this->server->respond('/01001000', [self::json($body)]);
+ $address = $this->client->lookup('01001000');
+
+ self::assertNull($address->geo);
+ self::assertSame('São Paulo', $address->localidade);
+ }
+
+ public function testNewApiFieldDoesNotBreak(): void
+ {
+ $body = self::SE_ADDRESS;
+ $body['campo_do_futuro'] = 'value';
+ $this->server->respond('/01001000', [self::json($body)]);
+ $address = $this->client->lookup('01001000');
+
+ self::assertSame('value', $address->raw['campo_do_futuro']);
+ self::assertSame('value', $address->field('campo_do_futuro'));
+ self::assertNull($address->field('nao_existe'));
+ self::assertSame('São Paulo', $address->localidade);
+ }
+
+ public function testMissingFieldsBecomeEmptyStringsNotNull(): void
+ {
+ $this->server->respond('/01001000', [self::json(['cep' => '01001000'])]);
+ $address = $this->client->lookup('01001000');
+
+ self::assertSame('', $address->logradouro);
+ self::assertSame('', $address->uf);
+ }
+
+ public function testNotFound(): void
+ {
+ $this->server->respond('/99999999', [self::json(
+ ['erro' => 'cep_nao_encontrado', 'mensagem' => 'CEP não existe na base do DNE'],
+ 404,
+ )]);
+
+ try {
+ $this->client->lookup('99999999');
+ self::fail('expected CepNotFoundException');
+ } catch (CepNotFoundException $exception) {
+ self::assertStringContainsString('99999999', $exception->getMessage());
+ }
+ }
+
+ public function testNotFoundIsNotRetried(): void
+ {
+ $this->server->respond('/99999999', [self::json(['erro' => 'cep_nao_encontrado'], 404)]);
+
+ $this->expectException(CepNotFoundException::class);
+
+ try {
+ $this->client->lookup('99999999');
+ } finally {
+ self::assertSame(1, $this->server->countCalls('/99999999'));
+ }
+ }
+
+ public function testInvalidCepNeverLeavesTheMachine(): void
+ {
+ try {
+ $this->client->lookup('123');
+ self::fail('expected InvalidCepException');
+ } catch (InvalidCepException) {
+ self::assertSame([], $this->server->calls());
+ }
+ }
+
+ public function testApi400BecomesInvalidCep(): void
+ {
+ $this->server->respond('/00000000', [self::json(
+ ['erro' => 'cep_invalido', 'mensagem' => 'rejected by the API'],
+ 400,
+ )]);
+
+ try {
+ $this->client->lookup('00000000');
+ self::fail('expected InvalidCepException');
+ } catch (InvalidCepException $exception) {
+ self::assertSame('rejected by the API', $exception->getMessage());
+ self::assertSame(1, $this->server->countCalls('/00000000'));
+ }
+ }
+
+ public function testResponseThatIsNotJson(): void
+ {
+ $this->server->respond('/01001000', [self::raw(200, '<html>captive portal</html>')]);
+
+ $this->expectException(InvalidResponseException::class);
+ $this->client->lookup('01001000');
+ }
+
+ public function testJsonArrayIsNotAnObject(): void
+ {
+ $this->server->respond('/01001000', [self::raw(200, '[1, 2, 3]')]);
+
+ $this->expectException(InvalidResponseException::class);
+ $this->client->lookup('01001000');
+ }
+}