summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipalib/tests/test_tstutil.py148
-rw-r--r--ipalib/tests/tstutil.py46
2 files changed, 178 insertions, 16 deletions
diff --git a/ipalib/tests/test_tstutil.py b/ipalib/tests/test_tstutil.py
new file mode 100644
index 00000000..73713d51
--- /dev/null
+++ b/ipalib/tests/test_tstutil.py
@@ -0,0 +1,148 @@
+# Authors:
+# Jason Gerard DeRose <jderose@redhat.com>
+#
+# Copyright (C) 2008 Red Hat
+# see file 'COPYING' for use and warranty information
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; version 2 only
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+"""
+Unit tests for test-helper `tests.tstutil` module.
+"""
+
+import tstutil
+
+
+class Prop(object):
+ def __init__(self, *ops):
+ self.__ops = frozenset(ops)
+ self.__prop = 'prop value'
+
+ def __get_prop(self):
+ if 'get' not in self.__ops:
+ raise AttributeError('get prop')
+ return self.__prop
+
+ def __set_prop(self, value):
+ if 'set' not in self.__ops:
+ raise AttributeError('set prop')
+ self.__prop = value
+
+ def __del_prop(self):
+ if 'del' not in self.__ops:
+ raise AttributeError('del prop')
+ self.__prop = None
+
+ prop = property(__get_prop, __set_prop, __del_prop)
+
+
+def test_yes_raised():
+ f = tstutil.yes_raises
+
+ class SomeError(Exception):
+ pass
+
+ class AnotherError(Exception):
+ pass
+
+ def callback1():
+ 'raises correct exception'
+ raise SomeError()
+
+ def callback2():
+ 'raises wrong exception'
+ raise AnotherError()
+
+ def callback3():
+ 'raises no exception'
+
+ f(SomeError, callback1)
+
+ raised = False
+ try:
+ f(SomeError, callback2)
+ except AnotherError:
+ raised = True
+ assert raised
+
+ raised = False
+ try:
+ f(SomeError, callback3)
+ except tstutil.ExceptionNotRaised:
+ raised = True
+ assert raised
+
+
+def test_no_set():
+ # Tests that it works when prop cannot be set:
+ tstutil.no_set(Prop('get', 'del'), 'prop')
+
+ # Tests that ExceptionNotRaised is raised when prop *can* be set:
+ raised = False
+ try:
+ tstutil.no_set(Prop('set'), 'prop')
+ except tstutil.ExceptionNotRaised:
+ raised = True
+ assert raised
+
+
+def test_no_del():
+ # Tests that it works when prop cannot be deleted:
+ tstutil.no_del(Prop('get', 'set'), 'prop')
+
+ # Tests that ExceptionNotRaised is raised when prop *can* be set:
+ raised = False
+ try:
+ tstutil.no_del(Prop('del'), 'prop')
+ except tstutil.ExceptionNotRaised:
+ raised = True
+ assert raised
+
+
+def test_read_only():
+ # Test that it works when prop is read only:
+ assert tstutil.read_only(Prop('get'), 'prop') == 'prop value'
+
+ # Test that ExceptionNotRaised is raised when prop can be set:
+ raised = False
+ try:
+ tstutil.read_only(Prop('get', 'set'), 'prop')
+ except tstutil.ExceptionNotRaised:
+ raised = True
+ assert raised
+
+ # Test that ExceptionNotRaised is raised when prop can be deleted:
+ raised = False
+ try:
+ tstutil.read_only(Prop('get', 'del'), 'prop')
+ except tstutil.ExceptionNotRaised:
+ raised = True
+ assert raised
+
+ # Test that ExceptionNotRaised is raised when prop can be both set and
+ # deleted:
+ raised = False
+ try:
+ tstutil.read_only(Prop('get', 'del'), 'prop')
+ except tstutil.ExceptionNotRaised:
+ raised = True
+ assert raised
+
+ # Test that AttributeError is raised when prop can't be read:
+ raised = False
+ try:
+ tstutil.read_only(Prop(), 'prop')
+ except AttributeError:
+ raised = True
+ assert raised
diff --git a/ipalib/tests/tstutil.py b/ipalib/tests/tstutil.py
index 1c93f138..b9c6e15d 100644
--- a/ipalib/tests/tstutil.py
+++ b/ipalib/tests/tstutil.py
@@ -21,40 +21,54 @@
Utility functions for the unit tests.
"""
+class ExceptionNotRaised(Exception):
+ """
+ Exception raised when an *expected* exception is *not* raised during a
+ unit test.
+ """
+ msg = 'expected %s'
+
+ def __init__(self, expected):
+ self.expected = expected
+
+ def __str__(self):
+ return self.msg % self.expected.__name__
-def no_set(obj, name):
+
+def yes_raises(exception, callback, *args, **kw):
"""
- Tests that attribute cannot be set.
+ Tests that the expected exception is raised; raises ExceptionNotRaised
+ if test fails.
"""
raised = False
try:
- setattr(obj, name, 'some_new_obj')
- except AttributeError:
+ callback(*args, **kw)
+ except exception:
raised = True
- assert raised
+ if not raised:
+ raise ExceptionNotRaised(exception)
+
+
+def no_set(obj, name, value='some_new_obj'):
+ """
+ Tests that attribute cannot be set.
+ """
+ yes_raises(AttributeError, setattr, obj, name, value)
def no_del(obj, name):
"""
Tests that attribute cannot be deleted.
"""
- raised = False
- try:
- delattr(obj, name)
- except AttributeError:
- raised = True
- assert raised
+ yes_raises(AttributeError, delattr, obj, name)
-def read_only(obj, name):
+def read_only(obj, name, value='some_new_obj'):
"""
Tests that attribute is read-only. Returns attribute.
"""
- assert isinstance(obj, object)
- assert hasattr(obj, name)
-
# Test that it cannot be set:
- no_set(obj, name)
+ no_set(obj, name, value)
# Test that it cannot be deleted:
no_del(obj, name)