--- a
+++ b/Allura/allura/tests/test_validators.py
@@ -0,0 +1,104 @@
+import unittest
+import formencode as fe
+
+from allura import model as M
+from allura.lib import validators as v
+from allura.lib.decorators import task
+from alluratest.controller import setup_basic_test
+
+
+def setUp():
+ setup_basic_test()
+
+
+@task
+def dummy_task(*args, **kw):
+ pass
+
+
+class TestJsonConverter(unittest.TestCase):
+ val = v.JsonConverter
+
+ def test_valid(self):
+ self.assertEqual({}, self.val.to_python('{}'))
+
+ def test_invalid(self):
+ with self.assertRaises(fe.Invalid):
+ self.val.to_python('{')
+
+
+class TestUserValidator(unittest.TestCase):
+ val = v.UserValidator
+
+ def test_valid(self):
+ self.assertEqual(M.User.by_username('root'), self.val.to_python('root'))
+
+ def test_invalid(self):
+ with self.assertRaises(fe.Invalid) as cm:
+ self.val.to_python('fakeuser')
+ self.assertEqual(str(cm.exception), "Invalid username")
+
+
+class TestTaskValidator(unittest.TestCase):
+ val = v.TaskValidator
+
+ def test_valid(self):
+ self.assertEqual(dummy_task, self.val.to_python('allura.tests.test_validators.dummy_task'))
+
+ def test_invalid_name(self):
+ with self.assertRaises(fe.Invalid) as cm:
+ self.val.to_python('badname')
+ self.assertTrue(str(cm.exception).startswith('Invalid task name'))
+
+ def test_import_failure(self):
+ with self.assertRaises(fe.Invalid) as cm:
+ self.val.to_python('allura.does.not.exist')
+ self.assertEqual(str(cm.exception), 'Could not import "allura.does.not.exist"')
+
+ def test_attr_lookup_failure(self):
+ with self.assertRaises(fe.Invalid) as cm:
+ self.val.to_python('allura.tests.test_validators.typo')
+ self.assertEqual(str(cm.exception), 'Module has no attribute "typo"')
+
+ def test_not_a_task(self):
+ with self.assertRaises(fe.Invalid) as cm:
+ self.val.to_python('allura.tests.test_validators.setUp')
+ self.assertEqual(str(cm.exception), '"allura.tests.test_validators.setUp" is not a task.')
+
+
+class TestPathValidator(unittest.TestCase):
+ val = v.PathValidator
+
+ def test_valid_project(self):
+ project = M.Project.query.get(shortname='test')
+ d = self.val.to_python('/p/test')
+ self.assertEqual(d['project'], project)
+ self.assertTrue('app' not in d)
+
+ def test_valid_app(self):
+ project = M.Project.query.get(shortname='test')
+ app = project.app_instance('admin')
+ d = self.val.to_python('/p/test/admin/')
+ self.assertEqual(d['project'], project)
+ self.assertEqual(d['app'].config._id, app.config._id)
+
+ def test_invalid_format(self):
+ with self.assertRaises(fe.Invalid) as cm:
+ self.val.to_python('test')
+ self.assertTrue(str(cm.exception).startswith(
+ 'You must specify at least a neighborhood and project'))
+
+ def test_invalid_neighborhood(self):
+ with self.assertRaises(fe.Invalid) as cm:
+ self.val.to_python('/q/test')
+ self.assertEqual(str(cm.exception), 'Invalid neighborhood: /q/')
+
+ def test_invalid_project(self):
+ with self.assertRaises(fe.Invalid) as cm:
+ self.val.to_python('/p/badproject')
+ self.assertEqual(str(cm.exception), 'Invalid project: badproject')
+
+ def test_invalid_app_mount_point(self):
+ with self.assertRaises(fe.Invalid) as cm:
+ self.val.to_python('/p/test/badapp')
+ self.assertEqual(str(cm.exception), 'Invalid app mount point: badapp')