pypsyc/mjacob2/tests/test_server/test_webif/test_webif.py

140 lines
4.9 KiB
Python

"""
:copyright: 2010 by Manuel Jacob
:license: MIT
"""
from mock import Mock, sentinel
from nose.tools import assert_raises
from tests.constants import USER1, USER1_NICK, PASSWORD
from tests.helpers import mockified, PlaceHolder
from pypsyc.server import webif
from pypsyc.server.db import Database
from pypsyc.server.webif import app, PersistentStore, run_webif
class TestViews(object):
@classmethod
def setup_class(cls):
app.secret_key = 'testing key'
def setup(self):
self.server = webif.server = Mock()
self.server.root.children = {}
self.client = app.test_client()
def test_index(self):
rv = self.client.get('/')
assert 'register' in rv.data
def _register(self, username, password, password2):
return self.client.post('/register', data=dict(
username=username, password=password, password2=password2
), follow_redirects=True)
def test_register_get(self):
rv = self.client.get('/register')
assert 'Username' in rv.data
assert 'Register' in rv.data
def test_register_post(self):
rv = self._register(USER1_NICK, PASSWORD, PASSWORD)
assert 'you were registered' in rv.data
assert self.server.method_calls == [
('register_person', (USER1_NICK, PASSWORD))]
def test_register_nousername(self):
rv = self._register('', '', '')
assert 'please specify a valid username' in rv.data
def test_register_username_inuse(self):
self.server.root.children = {USER1: True}
rv = self._register(USER1_NICK, '', '')
assert 'username already in use' in rv.data
def test_register_nopassword(self):
rv = self._register(USER1_NICK, '', '')
assert 'your password must have at least 6 characters' in rv.data
def test_register_shortpassword(self):
rv = self._register(USER1_NICK, 'passw', 'passw')
assert 'your password must have at least 6 characters' in rv.data
def test_register_unmatching_passwords(self):
rv = self._register(USER1_NICK, PASSWORD, 'password2')
assert 'the two passwords do not match' in rv.data
def test_persistent_store():
webif.server = Mock()
webif.server.database = Database(':memory:')
store = PersistentStore()
assert_raises(KeyError, store.__getitem__, 'key')
assert dict(store) == {}
assert len(store) == 0
store['key'] = 'value'
assert store['key'] == 'value'
assert len(store) == 1
store['key'] = 'value2'
assert dict(store) == {'key': 'value2'}
assert len(store) == 1
del store['key']
assert dict(store) == {}
assert len(store) == 0
@mockified('pypsyc.server.webif', ['PersistentStore', 'urandom',
'WSGIResource', 'Site', 'reactor',
'greenlet'])
def test_run_webif_ssl(PersistentStore, urandom, WSGIResource, Site, reactor,
greenlet):
store = PersistentStore.return_value = {'secret_key': 'key1'*5}
reactor_ph = PlaceHolder()
threadpool_ph = PlaceHolder()
wsgi_resource = WSGIResource.return_value
site = Site.return_value
run_webif(sentinel.server, sentinel.interface, sentinel.port,
sentinel.context_factory)
assert webif.server == sentinel.server
assert PersistentStore.call_args_list == [()]
assert webif.store == store
assert app.secret_key == 'key1'*5
assert not urandom.called
assert WSGIResource.call_args_list == [
((reactor_ph, threadpool_ph, app.wsgi_app),)]
assert Site.call_args_list == [((wsgi_resource,),)]
assert reactor.method_calls == [
('listenSSL', (sentinel.port, site, sentinel.context_factory),
{'interface': sentinel.interface})]
func = Mock()
reactor_ph.obj.callFromThread(func, sentinel.a, b=sentinel.b)
assert func.call_args_list == [((sentinel.a,), {'b': sentinel.b})]
threadpool_ph.obj.callInThread(sentinel.func, sentinel.a, b=sentinel.b)
assert greenlet.call_args_list == [((sentinel.func,),)]
assert greenlet.return_value.method_calls == [
('switch', (sentinel.a,), {'b': sentinel.b})]
@mockified('pypsyc.server.webif', ['PersistentStore', 'urandom',
'WSGIResource', 'Site', 'reactor'])
def test_run_webif_tcp(PersistentStore, urandom, WSGIResource, Site, reactor):
store = PersistentStore.return_value = {}
rand = urandom.return_value = 'key2'*5
wsgi_resource = WSGIResource.return_value
site = Site.return_value
run_webif(sentinel.server, sentinel.interface, sentinel.port, None)
assert urandom.call_args_list == [((20,),)]
assert app.secret_key == rand
assert store['secret_key'] == rand
assert Site.call_args_list == [((wsgi_resource,),)]
assert reactor.method_calls == [
('listenTCP', (sentinel.port, site), {'interface': 'localhost'})]