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:
parent
25611f1e68
commit
4fe5ad9bf0
7 changed files with 68 additions and 30 deletions
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
19
edbob/tests/__init__.py
Normal 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
7
setup.cfg
Normal file
|
@ -0,0 +1,7 @@
|
|||
[nosetests]
|
||||
nocapture = 1
|
||||
cover-package = edbob
|
||||
cover-erase = 1
|
||||
cover-inclusive = 1
|
||||
cover-html = 1
|
||||
cover-html-dir = htmlcov
|
2
setup.py
2
setup.py
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue