Prepare for tests.

This doesn't add any actual tests but it should pave the way for that.  Tests
may be run like so:

.. code-block:: sh

   python setup.py nosetests --with-coverage
This commit is contained in:
Lance Edgar 2013-06-18 22:19:52 -07:00
parent 25611f1e68
commit 4fe5ad9bf0
7 changed files with 68 additions and 30 deletions

View file

@ -28,11 +28,19 @@
import sys import sys
import os.path import os.path
import pyinotify
import threading import threading
import Queue import Queue
import logging import logging
try:
import pyinotify
except ImportError:
# Mock out for testing on Windows.
class Dummy(object):
pass
pyinotify = Dummy()
pyinotify.ProcessEvent = Dummy
import edbob import edbob
from edbob import filemon from edbob import filemon
from edbob.daemon import Daemon from edbob.daemon import Daemon

View file

@ -33,37 +33,38 @@ from sqlalchemy import and_
# from formalchemy import Field # from formalchemy import Field
import edbob
# from edbob.pyramid import filters # from edbob.pyramid import filters
# from edbob.pyramid import forms # from edbob.pyramid import forms
# from edbob.pyramid import grids # from edbob.pyramid import grids
# from edbob.pyramid import Session # from edbob.pyramid import Session
from edbob.pyramid.views import SearchableAlchemyGridView, CrudView from edbob.pyramid.views import SearchableAlchemyGridView, CrudView
from edbob.db.extensions.contact.model import (
Person, PersonEmailAddress, PersonPhoneNumber)
class PeopleGrid(SearchableAlchemyGridView): class PeopleGrid(SearchableAlchemyGridView):
mapped_class = edbob.Person mapped_class = Person
config_prefix = 'people' config_prefix = 'people'
sort = 'first_name' sort = 'first_name'
def join_map(self): def join_map(self):
return { return {
'email': 'email':
lambda q: q.outerjoin(edbob.PersonEmailAddress, and_( lambda q: q.outerjoin(PersonEmailAddress, and_(
edbob.PersonEmailAddress.parent_uuid == edbob.Person.uuid, PersonEmailAddress.parent_uuid == Person.uuid,
edbob.PersonEmailAddress.preference == 1)), PersonEmailAddress.preference == 1)),
'phone': 'phone':
lambda q: q.outerjoin(edbob.PersonPhoneNumber, and_( lambda q: q.outerjoin(PersonPhoneNumber, and_(
edbob.PersonPhoneNumber.parent_uuid == edbob.Person.uuid, PersonPhoneNumber.parent_uuid == Person.uuid,
edbob.PersonPhoneNumber.preference == 1)), PersonPhoneNumber.preference == 1)),
} }
def filter_map(self): def filter_map(self):
return self.make_filter_map( return self.make_filter_map(
ilike=['first_name', 'last_name'], ilike=['first_name', 'last_name'],
email=self.filter_ilike(edbob.PersonEmailAddress.address), email=self.filter_ilike(PersonEmailAddress.address),
phone=self.filter_ilike(edbob.PersonPhoneNumber.number)) phone=self.filter_ilike(PersonPhoneNumber.number))
def filter_config(self): def filter_config(self):
return self.make_filter_config( return self.make_filter_config(
@ -77,8 +78,8 @@ class PeopleGrid(SearchableAlchemyGridView):
def sort_map(self): def sort_map(self):
return self.make_sort_map( return self.make_sort_map(
'first_name', 'last_name', 'first_name', 'last_name',
email=self.sorter(edbob.PersonEmailAddress.address), email=self.sorter(PersonEmailAddress.address),
phone=self.sorter(edbob.PersonPhoneNumber.number)) phone=self.sorter(PersonPhoneNumber.number))
def grid(self): def grid(self):
g = self.make_grid() g = self.make_grid()
@ -97,7 +98,7 @@ class PeopleGrid(SearchableAlchemyGridView):
class PersonCrud(CrudView): class PersonCrud(CrudView):
mapped_class = edbob.Person mapped_class = Person
home_route = 'people' home_route = 'people'
def fieldset(self, model): def fieldset(self, model):

View file

@ -32,10 +32,10 @@ import formalchemy
from webhelpers.html import tags from webhelpers.html import tags
from webhelpers.html.builder import HTML from webhelpers.html.builder import HTML
import edbob
from edbob.db import auth from edbob.db import auth
from edbob.pyramid import Session from edbob.pyramid import Session
from edbob.pyramid.views import SearchableAlchemyGridView, CrudView from edbob.pyramid.views import SearchableAlchemyGridView, CrudView
from edbob.db.extensions.auth.model import Role
default_permissions = [ default_permissions = [
@ -68,7 +68,7 @@ default_permissions = [
class RolesGrid(SearchableAlchemyGridView): class RolesGrid(SearchableAlchemyGridView):
mapped_class = edbob.Role mapped_class = Role
config_prefix = 'roles' config_prefix = 'roles'
sort = 'name' sort = 'name'
@ -161,7 +161,7 @@ def PermissionsFieldRenderer(permissions, *args, **kwargs):
class RoleCrud(CrudView): class RoleCrud(CrudView):
mapped_class = edbob.Role mapped_class = Role
home_route = 'roles' home_route = 'roles'
permissions = default_permissions permissions = default_permissions

View file

@ -32,28 +32,29 @@ from webhelpers.html.builder import HTML
import formalchemy import formalchemy
from formalchemy.fields import SelectFieldRenderer from formalchemy.fields import SelectFieldRenderer
import edbob
from edbob.db import auth from edbob.db import auth
from edbob.pyramid import Session from edbob.pyramid import Session
from edbob.pyramid.views import SearchableAlchemyGridView, CrudView from edbob.pyramid.views import SearchableAlchemyGridView, CrudView
from edbob.db.extensions.auth.model import User, Role
from edbob.db.extensions.contact.model import Person
class UsersGrid(SearchableAlchemyGridView): class UsersGrid(SearchableAlchemyGridView):
mapped_class = edbob.User mapped_class = User
config_prefix = 'users' config_prefix = 'users'
sort = 'username' sort = 'username'
def join_map(self): def join_map(self):
return { return {
'person': 'person':
lambda q: q.outerjoin(edbob.Person), lambda q: q.outerjoin(Person),
} }
def filter_map(self): def filter_map(self):
return self.make_filter_map( return self.make_filter_map(
ilike=['username'], ilike=['username'],
person=self.filter_ilike(edbob.Person.display_name)) person=self.filter_ilike(Person.display_name))
def filter_config(self): def filter_config(self):
return self.make_filter_config( return self.make_filter_config(
@ -65,7 +66,7 @@ class UsersGrid(SearchableAlchemyGridView):
def sort_map(self): def sort_map(self):
return self.make_sort_map( return self.make_sort_map(
'username', 'username',
person=self.sorter(edbob.Person.display_name)) person=self.sorter(Person.display_name))
def grid(self): def grid(self):
g = self.make_grid() g = self.make_grid()
@ -92,7 +93,7 @@ def RolesFieldRenderer(request):
class RolesFieldRenderer(SelectFieldRenderer): class RolesFieldRenderer(SelectFieldRenderer):
def render_readonly(self, **kwargs): def render_readonly(self, **kwargs):
roles = Session.query(edbob.Role) roles = Session.query(Role)
html = '' html = ''
for uuid in self.value: for uuid in self.value:
role = roles.get(uuid) role = roles.get(uuid)
@ -117,15 +118,15 @@ class RolesField(formalchemy.Field):
return [x.uuid for x in user.roles] return [x.uuid for x in user.roles]
def get_options(self): def get_options(self):
q = Session.query(edbob.Role.name, edbob.Role.uuid) q = Session.query(Role.name, Role.uuid)
q = q.filter(edbob.Role.uuid != auth.guest_role(Session()).uuid) q = q.filter(Role.uuid != auth.guest_role(Session()).uuid)
q = q.order_by(edbob.Role.name) q = q.order_by(Role.name)
return q.all() return q.all()
def sync(self): def sync(self):
if not self.is_readonly(): if not self.is_readonly():
user = self.model user = self.model
roles = Session.query(edbob.Role) roles = Session.query(Role)
data = self.renderer.deserialize() data = self.renderer.deserialize()
user.roles = [roles.get(x) for x in data] user.roles = [roles.get(x) for x in data]
@ -140,7 +141,7 @@ class _ProtectedPersonRenderer(formalchemy.FieldRenderer):
def ProtectedPersonRenderer(uuid): def ProtectedPersonRenderer(uuid):
person = Session.query(edbob.Person).get(uuid) person = Session.query(Person).get(uuid)
assert person assert person
return type('ProtectedPersonRenderer', (_ProtectedPersonRenderer,), return type('ProtectedPersonRenderer', (_ProtectedPersonRenderer,),
{'person': person}) {'person': person})
@ -187,7 +188,7 @@ class PasswordField(formalchemy.Field):
class UserCrud(CrudView): class UserCrud(CrudView):
mapped_class = edbob.User mapped_class = User
home_route = 'users' home_route = 'users'
def fieldset(self, user): def fieldset(self, user):
@ -213,7 +214,7 @@ class UserCrud(CrudView):
del fs.confirm_password del fs.confirm_password
# if fs.edit and user.person: # if fs.edit and user.person:
if isinstance(user, edbob.User) and user.person: if isinstance(user, User) and user.person:
fs.person.set(readonly=True, fs.person.set(readonly=True,
renderer=LinkedPersonRenderer(self.request)) renderer=LinkedPersonRenderer(self.request))

19
edbob/tests/__init__.py Normal file
View file

@ -0,0 +1,19 @@
import unittest
from pyramid import testing
class TestCase(unittest.TestCase):
"""
Base class for all test suites.
"""
def setUp(self):
self.config = testing.setUp()
def tearDown(self):
testing.tearDown()
def test_something(self):
self.assertTrue(1)

7
setup.cfg Normal file
View file

@ -0,0 +1,7 @@
[nosetests]
nocapture = 1
cover-package = edbob
cover-erase = 1
cover-inclusive = 1
cover-html = 1
cover-html-dir = htmlcov

View file

@ -209,6 +209,8 @@ setup(
install_requires = requires, install_requires = requires,
extras_require = extras, extras_require = extras,
tests_require = requires + ['nose'],
test_suite = 'nose.collector',
packages = find_packages(), packages = find_packages(),
include_package_data = True, include_package_data = True,