Changes to get user management screens started. Updated UserStore to add all expected functions. Added tests for these functions.

This commit is contained in:
Tom Galloway 2013-01-21 10:30:52 +00:00
parent a312b6d288
commit c4cddbfc0e
6 changed files with 148 additions and 18 deletions

View File

@ -1,14 +1,15 @@
class User(dict): class User(dict):
""" Every user must have keys for a username, name, password (this """ Every user must have keys for a username, name, passphrase (this
is a md5 hash of the password), groups, and an email address. They can be is a md5 hash of the password), groups, and an email address. They can be
blank or None, but the keys must exist. """ blank or None, but the keys must exist. """
def __init__(self, dict=None): def __init__(self, dict=None):
for key in ['username', 'name', 'password', 'email']: for key in ['username', 'name', 'passphrase', 'email']:
self[key] = '' self[key] = ''
for key in ['groups']: for key in ['groups']:
self[key] = [] self[key] = []
for key in dict: if dict:
self[key] = dict[key] for key in dict:
self[key] = dict[key]
def __getattr__(self, attr): def __getattr__(self, attr):
return None return None

View File

@ -12,10 +12,42 @@ class UserStore(UserStoreModule, sqlite_db):
self.db_file = cfg.user_db self.db_file = cfg.user_db
sqlite_db.__init__(self, self.db_file, autocommit=True) sqlite_db.__init__(self, self.db_file, autocommit=True)
self.__enter__() self.__enter__()
def close(self): def close(self):
self.__exit__() self.__exit__(None,None,None)
def expert(self):
return False def expert(self, username=None):
groups = self.attr(username,"groups")
if not groups:
return False
return 'expert' in groups
def attr(self, username=None, field=None):
return self.get(username)[field]
def get(self,username=None):
return User(sqlite_db.get(self,username))
def exists(self, username=None):
try:
user = self.get(username)
if not user:
return False
elif user["username"]=='':
return False
return True
except TypeError:
return False
def remove(self,username=None):
self.__delitem__(username)
self.commit()
def get_all(self):
return self.items()
def set(self,username=None,user=None):
sqlite_db.__setitem__(self,username, user)
class UserStoreOld(): class UserStoreOld():
#class UserStore(UserStoreModule): #class UserStore(UserStoreModule):

View File

@ -47,23 +47,25 @@ class add(FormPlugin, PagePlugin):
return form.render() return form.render()
def process_form(self, username=None, name=None, email=None, md5_password=None, **kwargs): def process_form(self, username=None, name=None, email=None, md5_password=None, **kwargs):
msg = '' msg = Message()
if not username: msg = add_message(msg, _("Must specify a username!")) if not username: msg.add = _("Must specify a username!")
if not md5_password: msg = add_message(msg, _("Must specify a password!")) if not md5_password: msg.add = _("Must specify a password!")
if username in cfg.users: if username in cfg.users.keys():
msg = add_message(msg, _("User already exists!")) msg.add = _("User already exists!")
else: else:
try: try:
cfg.users[username]= User(dict={'username':username, 'name':name, 'email':email, 'password':md5_password}) di = {'username':username, 'name':name, 'email':email, 'passphrase':md5_password}
new_user = User(dict=di)
cfg.users.set(username,new_user)
except: except:
msg = add_message(msg, _("Error storing user!")) msg.add = _("Error storing user!")
if not msg: if not msg:
msg = add_message(msg, "%s saved." % username) msg.add = _("%s saved." % username)
cfg.log(msg.text)
main = self.make_form(username, name, email, message=msg) #main = self.make_form(username, name, email, msg=msg.text)
return self.fill_template(title="Manage Users and Groups", main=main, sidebar_left=self.sidebar_left, sidebar_right=self.sidebar_right) return self.fill_template(title="Manage Users and Groups", main=main, sidebar_left=self.sidebar_left, sidebar_right=self.sidebar_right)
class edit(FormPlugin, PagePlugin): class edit(FormPlugin, PagePlugin):
@ -114,7 +116,7 @@ class edit(FormPlugin, PagePlugin):
msg.add(_("User %s does not exist." % username)) msg.add(_("User %s does not exist." % username))
else: else:
msg.add = _("Must specify at least one valid, existing user.") msg.add = _("Must specify at least one valid, existing user.")
main = self.make_form(msg=msg.text) #main = self.make_form(msg=msg.text)
return self.fill_template(title="Manage Users and Groups", main=main, sidebar_left=self.sidebar_left, sidebar_right=self.sidebar_right) return self.fill_template(title="Manage Users and Groups", main=main, sidebar_left=self.sidebar_left, sidebar_right=self.sidebar_right)
sidebar_right = '' sidebar_right = ''

9
test.sh Executable file
View File

@ -0,0 +1,9 @@
#! /bin/sh
PYTHONPATH=build/exmachina:$PYTHONPATH
PYTHONPATH=modules/installed/lib:$PYTHONPATH
PYTHONPATH=vendor:$PYTHONPATH
export PYTHONPATH
python tests/test_user_store.py

86
tests/test_user_store.py Normal file
View File

@ -0,0 +1,86 @@
#! /usr/bin/env python
# -*- mode: python; mode: auto-fill; fill-column: 80 -*-
import user_store
from logger import Logger
import cfg
import unittest
import cherrypy
import plugin_mount
import os
from model import User
cfg.log = Logger()
cherrypy.log.access_file = None
class UserStore(unittest.TestCase):
"""Test each function of user_store to confirm they work as expected"""
def setUp(self):
cfg.user_db = os.path.join(cfg.file_root, "tests/testdata/users");
self.userstore = plugin_mount.UserStoreModule.get_plugins()[0]
def tearDown(self):
for user in self.userstore.get_all():
self.userstore.remove(user[0])
self.userstore.close()
def test_user_does_not_exist(self):
self.assertEqual(self.userstore.exists("notausername"),False)
def test_user_does_exist(self):
self.add_user("isausername", False)
self.assertEqual(self.userstore.exists("isausername"),True)
def test_add_user(self):
self.assertEqual(len(self.userstore.items()),0)
self.add_user("test_user", False)
self.assertEqual(len(self.userstore.items()),1)
def test_user_is_in_expert_group(self):
self.add_user("test_user", True)
self.assertEqual(self.userstore.expert("test_user"),True)
def test_user_is_not_in_expert_group(self):
self.add_user("test_user", False)
self.assertEqual(self.userstore.expert("test_user"),False)
def test_user_removal(self):
self.assertEqual(len(self.userstore.items()),0)
self.add_user("test_user", False)
self.assertEqual(len(self.userstore.items()),1)
self.userstore.remove("test_user")
self.assertEqual(len(self.userstore.items()),0)
def test_get_user_email_attribute(self):
self.add_user("test_user", False,"test@home")
self.assertEqual(self.userstore.attr("test_user","email"),"test@home")
def test_get_user(self):
test_user = self.add_user("test_user", False)
self.assertEqual(self.userstore.get("test_user"),test_user)
def test_get_all_users(self):
self.add_user("test_user1", False)
self.add_user("test_user2", False)
self.assertEqual(len(self.userstore.get_all()),2)
def add_user(self, test_username, add_to_expert_group, email=''):
test_user = self.create_user(test_username, email)
if add_to_expert_group:
test_user = self.add_user_to_expert_group(test_user)
self.userstore.set(test_username,test_user)
return test_user
def create_user(self, username, email=''):
test_user = User()
test_user["username"] = username
test_user["email"] = email
return test_user
def add_user_to_expert_group(self, user):
user["groups"] = ["expert"]
return user
if __name__ == "__main__":
unittest.main()

BIN
tests/testdata/users.sqlite3 vendored Normal file

Binary file not shown.