pavão

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 , , , .

Comente este artigo:

Picture »

RSS »

Na rede »

Categorias »

Arquivos »

No Twitter »

Copyright © 2009-2010 Pavão Web - Todos os direitos reservados