Skip to content

Commit

Permalink
First couple of tests
Browse files Browse the repository at this point in the history
garbados committed Jun 26, 2012
1 parent f31ccd4 commit cee8235
Showing 2 changed files with 107 additions and 20 deletions.
65 changes: 45 additions & 20 deletions flaskext/browserid/__init__.py
Original file line number Diff line number Diff line change
@@ -5,28 +5,50 @@
import jinja2

class BrowserID(object):
def __init__(self, app=None, **kwargs):
def __init__(self, app=None):
self.views = flask.Blueprint('browserid', __name__, static_folder="static")
self.login_url = kwargs['login_url'] if kwargs.has_key('login_url') else '/api/login'
self.login_callback = kwargs['login_callback'] if kwargs.has_key('login_callback') else None
self.logout_url = kwargs['logout_url'] if kwargs.has_key('logout_url') else '/api/logout'
self.logout_callback = kwargs['logout_callback'] if kwargs.has_key('logout_callback') else None

self.views.add_url_rule(login_url, 'login', self._login)
self.views.add_url_rule(logout_url, 'logout', self._logout)
self.views.before_app_request(self._load_auth_script)

with views.open_resource('static/auth.js') as f:
if app:
self.init_app(app)

def init_app(self, app):
self.login_url = app.config.get('BROWSERID_LOGIN_URL', '/api/login')
self.logout_url = app.config.get('BROWSERID_LOGOUT_URL', '/api/logout')

if not hasattr(self, 'login_callback') and hasattr(app, 'login_manager'):
self.login_callback = app.login_manager.user_callback

with self.views.open_resource('static/auth.js') as f:
self.auth_script = jinja2.Template(f.read()).render(
login_url=login_url,
logout_url=logout_url)
login_url=self.login_url,
logout_url=self.logout_url)

views.before_app_request(self._load_auth_script)
self.views.add_url_rule(self.login_url,
'login',
self._login,
methods=['POST'])
self.views.add_url_rule(self.logout_url,
'logout',
self._logout,
methods=['POST'])

if app:
app.register_blueprint(self.views)
app.register_blueprint(self.views)

def set_login_callback(self, func):
"""
Registers a function that, given the response from the BrowserID servers,
either returns a user, if login is successful, or None, if it isn't.
"""
self.login_callback = func

def init_app(app, **kwargs):
super(BrowserID, self).__init__(app, **kwargs)
def set_logout_callback(self, func=None):
"""
An optional callback to perform after logout.
"""
if func:
self.logout_callback = func

def _load_auth_script(self):
flask._request_ctx_stack.top.auth_script = self.auth_script
@@ -38,15 +60,18 @@ def _login(self):
response = requests.post('https://browserid.org/verify', data=payload)
if response.status_code == 200:
user_data = json.loads(response.text)
if self.login_callback:
self.login_callback(user_data)
login_user(user)
return ''
user = self.login_callback(user_data)
if user:
login_user(user)
return ''
else:
if user_data.get('status') == "failure":
return flask.make_response(user_data['reason'], 400)
else:
return flask.make_response(response.text, response.status_code)

def _logout(self):
if self.logout_callback:
if hasattr(self,'logout_callback'):
self.logout_callback()
logout_user()
return ''
62 changes: 62 additions & 0 deletions tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import unittest
import flask
from flask.ext.login import LoginManager, UserMixin
from flaskext.browserid import BrowserID

class User(UserMixin):
def __init__(self, **kwargs):
self.id = kwargs.get('id')
self.email = kwargs.get('email')

USERS = (
User(email="[email protected]", id=1),
User(email="[email protected]", id=2)
)

def get_user(id):
for user in USERS:
if user.id == id:
return user
else:
return None

class BasicAppTestCase(unittest.TestCase):
def setUp(self):
app = flask.Flask(__name__)

app.config['BROWSERID_LOGIN_URL'] = login_url = "/login"
app.config['BROWSERID_LOGOUT_URL'] = logout_url = "/logout"
app.config['SECRET_KEY'] = "deterministic"
app.config['TESTING'] = True

login_manager = LoginManager()
login_manager.user_callback = get_user
browserid = BrowserID()
login_manager.init_app(app)
browserid.init_app(app)

self.app = app
self.client = app.test_client()
self.login_manager = login_manager
self.browserid = browserid
self.login_url = login_url
self.logout_url = logout_url

def test_login(self):
# bad login
res = self.client.post(self.login_url, data={'assertion' : 'ducks'})
assert res.status_code == 400
# todo: good login

def test_logout(self):
# good logout
res = self.client.post(self.logout_url)
assert res.status_code == 200

def test_static_file(self):
# todo: test that "auth.js" is compiled and
# available in the request context
pass

if __name__ == '__main__':
unittest.main()

0 comments on commit cee8235

Please sign in to comment.