Pregunta

tengo una aplicación de Google App Engine y mi solicitud hadnler tiene un decorador que hace la autenticación. Con WebTest descubrí cómo puede establecer un usuario conectado y administrador.

Ahora, hoy mi decorador de autenticación tiene un poco más complejo. También está comprobando si un usuario tiene un perfil en la base de datos y si no lo hace él conseguirá redirigido a la 'nuevo usuario' página.

def authenticated(method):
    @functools.wraps(method)
    def wrapper(self, *args, **kwargs):
        user = users.get_current_user()
        if not user:
            self.redirect(users.create_login_url(self.request.uri))
            return

        profile = Profile.get_by_key_name(str(user.user_id))
        if not profile:
            self.redirect( '/newuser' )

        return method(self, *args, **kwargs)

    return wrapper

Ahora añadir la parte perfil rompe mi unidad de prueba que comprueba si un usuario está conectado y recibe un código de estado 200 (assertOK).

def user_ok(self):
    os.environ['USER_EMAIL'] = 'info@example.com'
    os.environ['USER_IS_ADMIN'] = ''
    response = self.get( '/appindex' )
    self.assertOK(response)

Así que ahora tengo que ser capaz de inyectar alguna manera la funcionalidad del perfil en el decorador para que pueda ponerlo en mis pruebas. ¿Alguien tiene una idea de cómo hacer esto que he estado tratando de pensar en una forma, pero no dejo de quedarse atascado.

¿Fue útil?

Solución

Se debe crear un perfil durante la prueba, para ser utilizado por el decorador:

def user_ok(self):
    key_name = 'info@example.com'
    new_user = Profile(key_name=key_name)
    new_user.put()

    os.environ['USER_EMAIL'] = key_name
    os.environ['USER_ID'] = key_name
    os.environ['USER_IS_ADMIN'] = ''
    response = self.get( '/appindex' )
    self.assertOK(response)

    # Now let's reset it to check that the user will be redirected.
    new_user.delete()
    response = self.get( '/appindex' )
    self.assertEqual(response.headers['Location'], 'http://localhost/newuser')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top