Skip to content

Commit 59d491b

Browse files
Adiciona testes para o método get_address_from_cep (#532)
* feat(tests): add tests for get_address_from_cep function handling invalid and valid CEPs * refactor(tests): clean up whitespace and improve test method formatting in TestGetAddressFromCEP_MC_DC
1 parent ae4104b commit 59d491b

1 file changed

Lines changed: 67 additions & 0 deletions

File tree

tests/test_cep.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,72 @@ def test_get_cep_information_from_address_invalid_cep_raise_exception_cep_not_fo
169169
)
170170

171171

172+
@patch("brutils.cep.urlopen")
173+
class TestGetAddressFromCEP_MC_DC(TestCase):
174+
def test_ct1_cep_invalido_com_excecao(self, mock_urlopen):
175+
"""CT1: cep inválido e raise_exceptions=True → lança InvalidCEP"""
176+
with self.assertRaises(InvalidCEP):
177+
get_address_from_cep("abcdefg", raise_exceptions=True)
178+
179+
def test_ct2_cep_invalido_sem_excecao(self, mock_urlopen):
180+
"""CT2: cep inválido e raise_exceptions=False → retorna None"""
181+
result = get_address_from_cep("abcdefg", raise_exceptions=False)
182+
self.assertIsNone(result)
183+
184+
@patch("brutils.cep.loads")
185+
def test_ct3_cep_valido(self, mock_loads, mock_urlopen):
186+
"""CT3: cep válido → retorna dicionário com endereço"""
187+
188+
# A função get_address_from_cep faz dois loads() no mesmo JSON
189+
mock_loads.side_effect = [
190+
{"cep": "01001-000"}, # Primeiro loads para verificar "erro"
191+
{"cep": "01001-000"}, # Segundo loads para retornar Address
192+
]
193+
194+
# Simula a resposta da API ViaCEP
195+
mock_response = MagicMock()
196+
mock_response.read.return_value = b'{"cep": "01001-000"}'
197+
198+
# Corrige o mock para suportar o contexto "with urlopen(...) as f"
199+
mock_urlopen.return_value.__enter__.return_value = mock_response
200+
201+
# Executa a chamada
202+
result = get_address_from_cep("01001000", raise_exceptions=False)
203+
204+
# Valida o resultado
205+
self.assertIsInstance(result, dict)
206+
self.assertEqual(result.get("cep"), "01001-000")
207+
208+
def test_ct4_erro_na_api_com_excecao(self, mock_urlopen):
209+
"""CT4: cep válido mas inexistente + raise_exceptions=True → lança CEPNotFound"""
210+
mock_response = MagicMock()
211+
mock_response.read.return_value = b'{"erro": true}'
212+
mock_urlopen.return_value = mock_response
213+
214+
with self.assertRaises(CEPNotFound):
215+
get_address_from_cep("99999999", raise_exceptions=True)
216+
217+
def test_ct5_erro_na_api_sem_excecao(self, mock_urlopen):
218+
"""CT5: cep válido mas inexistente + raise_exceptions=False → retorna None"""
219+
mock_response = mock_urlopen.return_value
220+
mock_response.read.return_value = b'{"erro": true}'
221+
222+
result = get_address_from_cep("99999999", raise_exceptions=False)
223+
self.assertIsNone(result)
224+
225+
def test_ct6_viacep_responde_com_erro_e_raise_exceptions_true(
226+
self, mock_urlopen
227+
):
228+
"""
229+
CT6: cobre a linha 172 e a decisão CD2 (data.get("erro", True))
230+
"""
231+
mock_response = MagicMock()
232+
mock_response.read.return_value = b'{"erro": true}'
233+
mock_urlopen.return_value = mock_response
234+
235+
with self.assertRaises(CEPNotFound):
236+
get_address_from_cep("01001000", raise_exceptions=True)
237+
238+
172239
if __name__ == "__main__":
173240
main()

0 commit comments

Comments
 (0)