@@ -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+
172239if __name__ == "__main__" :
173240 main ()
0 commit comments