view test_server.py @ 0:47b666b85cac

origination
author Atul Varma <avarma@mozilla.com>
date Wed, 23 Jun 2010 17:05:18 -0700
parents
children ac7704e92b02
line wrap: on
line source

import simplejson as json
import datetime

from webtest import TestApp

from oauth2_server import Server, gentoken

server = None
app = None

def apptest(func):
    def wrapper():
        g = globals()

        EmailMachine.emails = []
        EntropyMachine.next = []
        TimeMachine.now = datetime.datetime(2010, 6, 17, 0, 32, 33, 985904)

        g['server'] = Server(['bob@foo.com', 'jane@bar.com'],
                             send_email=EmailMachine.send_email,
                             utcnow=TimeMachine.utcnow,
                             gentoken=EntropyMachine.gentoken)
        g['app'] = TestApp(server.wsgi_app)

        func()

    wrapper.__name__ = func.__name__
    return wrapper

class EmailMachine(object):
    emails = []

    @classmethod
    def send_email(klass, email, token):
        klass.emails.append((email, token))

class EntropyMachine(object):
    next = []

    @classmethod
    def gentoken(klass):
        if klass.next:
            return klass.next.pop()
        return gentoken()

class TimeMachine(object):
    now = None

    @classmethod
    def travel(klass, timedelta=None, *args, **kwargs):
        if timedelta is None:
            timedelta = datetime.timedelta(*args, **kwargs)

        klass.now += timedelta

    @classmethod
    def utcnow(klass):
        return klass.now

def post_json(url, obj, **kwargs):
    return app.post(url, json.dumps(obj),
                    {'Content-Type': 'application/json'},
                    **kwargs)

@apptest
def test_request_challenge():
    EntropyMachine.next.append('a token')
    resp = post_json(server.request_challenge_path,
                     {'email': 'bob@foo.com'})
    assert resp.json == {'success': True}
    assert EmailMachine.emails == [('bob@foo.com', 'a token')]

@apptest
def test_request_challenge_with_invalid_email():
    post_json(server.request_challenge_path,
              {'email': 'invalid@foo.com'},
              status=400)

@apptest
def test_request_challenge_with_invalid_body1():
    post_json(server.request_challenge_path,
              [],
              status=400)

@apptest
def test_request_challenge_with_invalid_body2():
    post_json(server.request_challenge_path,
              {'blah': 'narg'},
              status=400)

@apptest
def test_respond_to_challenge():
    token = server.new_challenge_token('bob@foo.com')
    EntropyMachine.next.append('my auth token')
    resp = post_json(server.respond_to_challenge_path,
                     {'token': token})
    assert resp.json == {'email': 'bob@foo.com',
                         'token': 'my auth token'}

@apptest
def test_respond_to_challenge_only_works_once():
    token = server.new_challenge_token('bob@foo.com')
    EntropyMachine.next.append('my auth token')
    resp = post_json(server.respond_to_challenge_path,
                     {'token': token})
    assert resp.json == {'email': 'bob@foo.com',
                         'token': 'my auth token'}
    post_json(server.respond_to_challenge_path,
              {'token': token},
              status=400)

@apptest
def test_respond_to_challenge_with_invalid_token():
    post_json(server.respond_to_challenge_path,
              {'token': 'hello there'},
              status=400)

@apptest
def test_respond_to_challenge_with_invalid_body():
    post_json(server.respond_to_challenge_path,
              [],
              status=400)

@apptest
def test_basic_404():
    app.get('/blarg', status=404)