From fe064f7bc98a7adb49e71fdc230a6a5a17b06909 Mon Sep 17 00:00:00 2001 From: Gabriel Lima Date: Sun, 15 Jun 2025 18:23:03 -0300 Subject: [PATCH 1/2] feat(tests): add tests for get_address_from_cep function handling invalid and valid CEPs --- tests/test_cep.py | 68 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/tests/test_cep.py b/tests/test_cep.py index 2fc98818..cec884c3 100644 --- a/tests/test_cep.py +++ b/tests/test_cep.py @@ -169,5 +169,73 @@ def test_get_cep_information_from_address_invalid_cep_raise_exception_cep_not_fo ) +@patch("brutils.cep.urlopen") +class TestGetAddressFromCEP_MC_DC(TestCase): + + def test_ct1_cep_invalido_com_excecao(self, mock_urlopen): + """CT1: cep inválido e raise_exceptions=True → lança InvalidCEP""" + with self.assertRaises(InvalidCEP): + get_address_from_cep("abcdefg", raise_exceptions=True) + + def test_ct2_cep_invalido_sem_excecao(self, mock_urlopen): + """CT2: cep inválido e raise_exceptions=False → retorna None""" + result = get_address_from_cep("abcdefg", raise_exceptions=False) + self.assertIsNone(result) + + @patch("brutils.cep.loads") + def test_ct3_cep_valido(self, mock_loads, mock_urlopen): + """CT3: cep válido → retorna dicionário com endereço""" + + # A função get_address_from_cep faz dois loads() no mesmo JSON + mock_loads.side_effect = [ + {"cep": "01001-000"}, # Primeiro loads para verificar "erro" + {"cep": "01001-000"} # Segundo loads para retornar Address + ] + + # Simula a resposta da API ViaCEP + mock_response = MagicMock() + mock_response.read.return_value = b'{"cep": "01001-000"}' + + # Corrige o mock para suportar o contexto "with urlopen(...) as f" + mock_urlopen.return_value.__enter__.return_value = mock_response + + # Executa a chamada + result = get_address_from_cep("01001000", raise_exceptions=False) + + # Valida o resultado + self.assertIsInstance(result, dict) + self.assertEqual(result.get("cep"), "01001-000") + + + def test_ct4_erro_na_api_com_excecao(self, mock_urlopen): + """CT4: cep válido mas inexistente + raise_exceptions=True → lança CEPNotFound""" + mock_response = MagicMock() + mock_response.read.return_value = b'{"erro": true}' + mock_urlopen.return_value = mock_response + + with self.assertRaises(CEPNotFound): + get_address_from_cep("99999999", raise_exceptions=True) + + + def test_ct5_erro_na_api_sem_excecao(self, mock_urlopen): + """CT5: cep válido mas inexistente + raise_exceptions=False → retorna None""" + mock_response = mock_urlopen.return_value + mock_response.read.return_value = b'{"erro": true}' + + result = get_address_from_cep("99999999", raise_exceptions=False) + self.assertIsNone(result) + + def test_ct6_viacep_responde_com_erro_e_raise_exceptions_true(self, mock_urlopen): + """ + CT6: cobre a linha 172 e a decisão CD2 (data.get("erro", True)) + """ + mock_response = MagicMock() + mock_response.read.return_value = b'{"erro": true}' + mock_urlopen.return_value = mock_response + + with self.assertRaises(CEPNotFound): + get_address_from_cep("01001000", raise_exceptions=True) + + if __name__ == "__main__": main() From 0b94f64f73594b792b867b9bcfdbbaca232bcc0c Mon Sep 17 00:00:00 2001 From: Gabriel Lima Date: Sun, 15 Jun 2025 19:02:06 -0300 Subject: [PATCH 2/2] refactor(tests): clean up whitespace and improve test method formatting in TestGetAddressFromCEP_MC_DC --- tests/test_cep.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/test_cep.py b/tests/test_cep.py index cec884c3..e47b12d3 100644 --- a/tests/test_cep.py +++ b/tests/test_cep.py @@ -171,7 +171,6 @@ def test_get_cep_information_from_address_invalid_cep_raise_exception_cep_not_fo @patch("brutils.cep.urlopen") class TestGetAddressFromCEP_MC_DC(TestCase): - def test_ct1_cep_invalido_com_excecao(self, mock_urlopen): """CT1: cep inválido e raise_exceptions=True → lança InvalidCEP""" with self.assertRaises(InvalidCEP): @@ -189,13 +188,13 @@ def test_ct3_cep_valido(self, mock_loads, mock_urlopen): # A função get_address_from_cep faz dois loads() no mesmo JSON mock_loads.side_effect = [ {"cep": "01001-000"}, # Primeiro loads para verificar "erro" - {"cep": "01001-000"} # Segundo loads para retornar Address + {"cep": "01001-000"}, # Segundo loads para retornar Address ] # Simula a resposta da API ViaCEP mock_response = MagicMock() mock_response.read.return_value = b'{"cep": "01001-000"}' - + # Corrige o mock para suportar o contexto "with urlopen(...) as f" mock_urlopen.return_value.__enter__.return_value = mock_response @@ -206,7 +205,6 @@ def test_ct3_cep_valido(self, mock_loads, mock_urlopen): self.assertIsInstance(result, dict) self.assertEqual(result.get("cep"), "01001-000") - def test_ct4_erro_na_api_com_excecao(self, mock_urlopen): """CT4: cep válido mas inexistente + raise_exceptions=True → lança CEPNotFound""" mock_response = MagicMock() @@ -216,7 +214,6 @@ def test_ct4_erro_na_api_com_excecao(self, mock_urlopen): with self.assertRaises(CEPNotFound): get_address_from_cep("99999999", raise_exceptions=True) - def test_ct5_erro_na_api_sem_excecao(self, mock_urlopen): """CT5: cep válido mas inexistente + raise_exceptions=False → retorna None""" mock_response = mock_urlopen.return_value @@ -225,7 +222,9 @@ def test_ct5_erro_na_api_sem_excecao(self, mock_urlopen): result = get_address_from_cep("99999999", raise_exceptions=False) self.assertIsNone(result) - def test_ct6_viacep_responde_com_erro_e_raise_exceptions_true(self, mock_urlopen): + def test_ct6_viacep_responde_com_erro_e_raise_exceptions_true( + self, mock_urlopen + ): """ CT6: cobre a linha 172 e a decisão CD2 (data.get("erro", True)) """