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 os.path
import pyinotify
import threading
import Queue
import logging
try:
import pyinotify
except ImportError:
# Mock out for testing on Windows.
class Dummy(object):
pass
pyinotify = Dummy()
pyinotify.ProcessEvent = Dummy
import edbob
from edbob import filemon
from edbob.daemon import Daemon

View file

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

View file

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

View file

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