diff --git a/tests/test_cep.py b/tests/test_cep.py index 2fc98818..e47b12d3 100644 --- a/tests/test_cep.py +++ b/tests/test_cep.py @@ -169,5 +169,72 @@ 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()