Testes de Django Middleware
Publicado em 18 de March de 2009
Ainda não consegui parar e escrever sobre Rails aqui no blog, mas tenho descoberto coisas interessantes de Django. O novo desafio, aqui no trabalho, foi criar e testar um Middleware que tinha a função de identificar o User-Agent de um request e setar alguns parâmetros para que a aplicação pudesse se desenvolver a partir daí. É mais ou menos parecido com o que já foi mencionado aqui, anteriormente.
from django.conf import settings from app.pub.structure import * from django import http import re class IdentifyMiddleware(object): def process_request(self, request): # LIST PERFIS perfil = Perfil() perfis = perfil.all() for p in perfis: if p.regular_expression: logging.info("Identify User: regexp [%s]" % p.regular_expression) r = re.compile(p.regular_expression, re.IGNORECASE) if r.search(request.META['HTTP_USER_AGENT']): request.perfil = p return # SET PERFIL NONE perfil.name = "none" request.perfil = perfil
Esse Middleware lista expressões regulares guardadas em um banco de dados e compara com o User-Agent do request. Uma vez encontrada, é setado uma propriedade no request chamada perfil, identificando assim o tipo de request que estamos trabalhando. O teste realizado no Middleware era verificar se o request realmente trazia o parâmetro perfil setado.
#!/usr/bin/python # vim: ai ts=4 sts=4 et sw=4 import unittest import os os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' #from django.test import TestCase from django.http import HttpRequest from app.handset.identify import IdentifyMiddleware from django.conf import settings class TestIdentify(unittest.TestCase): def _get_request(self, path): request = HttpRequest() request.META = { 'SERVER_NAME': settings.CDA_URL } request.path = path_info = "/%s" % path return request def testPerfilIphone(self): request = self._get_request('identify') request.META = { 'HTTP_USER_AGENT':'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A538a Safari/419.3' } IdentifyMiddleware().process_request(request) self.assertEquals(request.perfil.name, 'IPhone') def testPerfilStandard(self): request = self._get_request('identify') request.META = { 'HTTP_USER_AGENT':'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.10 (intrepid) Firefox/3.0.7' } IdentifyMiddleware().process_request(request) self.assertEquals(request.perfil.name, 'standard') if __name__ == '__main__': suite = unittest.TestLoader().loadTestsFromTestCase(TestIdentify) unittest.TextTestRunner(verbosity=2).run(suite)
O teste por si só se explica, mas vale salientar o ponto onde foi utilizado a biblioteca HttpRequest do próprio Django para montar o request. Outro ponto é quando o teste instancia o método IdentifyMiddleware().process_request(request) do Middleware, o parâmetro request se mantem por referência, não necessitando de um retorno (return alguma coisa) do Middleware para continuar a testar o parâmetro perfil adicionado ao request.
Com certeza o próximo texto será sobre Rails, que é um framework que voltei a estudar muito para desenvolver projetos pessoais. Até lá.
Leia também
Este artigo foi arquivado como Desenvolvimento e classificado como Django, Middleware, Python, Testes.