# encoding: utf-8 import json import re import unittest import webtest import bottle import CepTracker import PostmonServer class PostmonBaseTest(object): expected = { '01330000': [{ 'logradouro': 'Rua Rocha', 'bairro': 'Bela Vista', 'cidade': u'São Paulo', 'estado': 'SP' }], '85100000': [{ 'cidade': u'Jordão (Guarapuava)', 'estado': 'PR' }], '75064590': [{ 'logradouro': 'Rua A', 'bairro': 'Vila Jaiara', 'cidade': u'Anápolis', 'estado': 'GO' }, { 'logradouro': 'Rua A', 'bairro': 'Vila Jaiara Setor Leste', 'cidade': u'Anápolis', 'estado': 'GO' }], '12245230': [{ 'logradouro': u'Avenida Tivoli', 'complemento': u'lado ímpar', 'bairro': u'Vila Betânia', 'cidade': u'São José dos Campos', 'estado': 'SP' }], '69908768': [{ 'logradouro': 'Rodovia BR-364 (Rio Branco-Porto Velho)', 'complemento': u'até 5014 - lado par', 'bairro': 'Loteamento Santa Helena', 'cidade': 'Rio Branco', 'estado': 'AC' }] } def test_cep_com_rua(self): self.assertCep('01330000') def test_cep_sem_rua(self): self.assertCep('85100000') def test_cep_inexistente(self): self.assertCep('99999999') def test_cep_com_mais_de_um_resultado(self): self.assertCep('75064590') def test_ceps_com_complemento(self): self.assertCep('12245230') self.assertCep('69908768') class CepTrackerTest(unittest.TestCase, PostmonBaseTest): def setUp(self): self.tracker = CepTracker.CepTracker() def get_cep(self, cep): return self.tracker.track(cep) def assertCep(self, cep): result = self.get_cep(cep) expected = self.expected.get(cep, []) self.assertEqual(len(expected), len(result)) for e, r in zip(expected, result): for key, value in e.items(): self.assertIn(key, r) self.assertEqual(value, r[key]) self.assertIn('v_date', r) class CepTrackerMockTest(CepTrackerTest): ''' O CepTrackerMockTest usa arquivos locais com os resultados obtidos nos Correios. Assim é possível saber se os testes do CepTrackerTest quebraram por problemas no código ou por alteração nos Correios. ''' def setUp(self): self.tracker = CepTracker.CepTracker() self.tracker._request = self._request_mock def _request_mock(self, cep): with open('test/assets/' + cep + '.html') as f: return f.read().decode('latin-1') class PostmonWebTest(unittest.TestCase, PostmonBaseTest): ''' Teste do servidor do Postmon ''' def setUp(self): self.app = webtest.TestApp(bottle.app()) def get_cep(self, cep): response = self.app.get('/cep/' + cep) return response.json def assertCep(self, cep): expected = self.expected.get(cep, None) try: result = self.get_cep(cep) except webtest.AppError as ex: if not expected and '404' in ex.message and cep in ex.message: return raise ex for k, v in expected[0].items(): self.assertEqual(v, result[k]) self.assertNotIn('v_date', result) class PostmonWebJSONPTest(PostmonWebTest): ''' Teste de requisições JSONP no servidor do Postmon ''' def setUp(self): self.jsonp_query_key = PostmonServer.jsonp_query_key self.jsonp_func_name = 'func_name' super(PostmonWebJSONPTest, self).setUp() def get_cep(self, cep): response = self.app.get('/cep/%s?%s=%s' % (cep, self.jsonp_query_key, self.jsonp_func_name)) regexp = re.compile('^%s\((.*)\);$' % self.jsonp_func_name) json_data = re.findall(regexp, response.body)[0] return json.loads(json_data) class PostmonV1WebTest(PostmonWebTest): ''' Teste do servidor do Postmon no /v1 ''' def get_cep(self, cep): response = self.app.get('/v1/cep/' + cep) return response.json