Skip to content

Commit 993c176

Browse files
committed
Refatorando para conseguir testar o banco de dados.
Testando e resolvendo a #26.
1 parent 5e70b79 commit 993c176

File tree

3 files changed

+75
-9
lines changed

3 files changed

+75
-9
lines changed

PostmonServer.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from bottle import route, run, error, response
1+
from bottle import route, run, response
22
from CepTracker import CepTracker
33

4-
import pymongo, json, re
4+
from database import MongoDb as Database
55

66
def expired(record_date):
77
from datetime import datetime, timedelta
@@ -22,23 +22,22 @@ def _get_info_from_correios(cep):
2222

2323
return info
2424

25+
2526
@route('/cep/<cep:re:\d{5}-?\d{3}>')
2627
def verifica_cep(cep):
2728
cep = cep.replace('-','')
29+
db = Database()
2830

2931
response.headers['Access-Control-Allow-Origin'] = '*'
30-
32+
3133
try:
32-
con = pymongo.MongoClient('localhost')
33-
db = con.postmon
34-
ceps = db.ceps
35-
result = ceps.find_one({'cep':cep}, fields={'_id':False})
34+
result = db.get_one(cep, fields={ '_id': False })
3635

3736
if not result or not result.has_key('v_date') or expired(result):
3837
for item in _get_info_from_correios(cep):
39-
ceps.update({'cep': item['cep']}, {'$set': item}, upsert=True)
38+
db.insert_or_update(item)
4039

41-
result = ceps.find_one({'cep':cep}, fields={'_id':False,'v_date':False})
40+
result = db.get_one(cep, fields={ '_id': False, 'v_date': False })
4241

4342
response.headers['Cache-Control'] = 'public, max-age=2592000'
4443

database.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import pymongo
2+
3+
class MongoDb(object):
4+
5+
_fields = [
6+
'logradouro',
7+
'bairro',
8+
'cidade',
9+
'estado'
10+
]
11+
12+
def __init__(self, address='localhost'):
13+
self._client = pymongo.MongoClient(address)
14+
self._db = self._client.postmon
15+
16+
def get_one(self, cep, **kwargs):
17+
return self._db.ceps.find_one({ 'cep': cep }, **kwargs)
18+
19+
def insert_or_update(self, obj, **kwargs):
20+
21+
update = { '$set': obj }
22+
empty_fields = set(self._fields) - set(obj)
23+
update['$unset'] = dict((x, 1) for x in empty_fields)
24+
25+
self._db.ceps.update({ 'cep': obj['cep'] }, update, upsert=True)
26+
27+
def remove(self, cep):
28+
self._db.ceps.remove({ 'cep': cep })

test/database_test.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# encoding: utf-8
2+
import unittest
3+
4+
from database import MongoDb
5+
6+
class MongoDbTest(unittest.TestCase):
7+
8+
def setUp(self):
9+
self.db = MongoDb()
10+
11+
self.db.insert_or_update({
12+
'cep': 'UNIQUE_KEY',
13+
'logradouro': 'A',
14+
'bairro': 'A',
15+
'cidade': 'A',
16+
'estado': 'A'
17+
})
18+
19+
def test_remove_empty_fields(self):
20+
21+
'''
22+
Quando um registro é atualizado no banco de dados,
23+
as chaves inexistentes devem ser removidas.
24+
'''
25+
26+
self.db.insert_or_update({
27+
'cep': 'UNIQUE_KEY',
28+
'estado': 'B'
29+
})
30+
31+
result = self.db.get_one('UNIQUE_KEY')
32+
33+
self.assertEqual(result['estado'], 'B')
34+
self.assertNotIn('logradouro', result)
35+
self.assertNotIn('bairro', result)
36+
self.assertNotIn('cidade', result)
37+
38+
def tearDown(self):
39+
self.db.remove('UNIQUE_KEY')

0 commit comments

Comments
 (0)