summaryrefslogtreecommitdiffstats
path: root/ipalib
diff options
context:
space:
mode:
authorJason Gerard DeRose <jderose@redhat.com>2008-08-01 03:12:17 +0000
committerJason Gerard DeRose <jderose@redhat.com>2008-08-01 03:12:17 +0000
commit31fc955355ac8d873b82d129021f599f820c2694 (patch)
tree85e686aefaffeddd6307e4e0eeff4447c85727e3 /ipalib
parentf53dec2600f95246a72fa3c847a485d2a94edfa7 (diff)
downloadfreeipa-31fc955355ac8d873b82d129021f599f820c2694.tar.gz
freeipa-31fc955355ac8d873b82d129021f599f820c2694.tar.xz
freeipa-31fc955355ac8d873b82d129021f599f820c2694.zip
34: Added tests.unit_common with frequently used utility functions; split ro __setattr__, __delattr__ methods out of Proxy and into new ReadOnly base class; added corresponding unit tests
Diffstat (limited to 'ipalib')
-rw-r--r--ipalib/plugable.py45
-rw-r--r--ipalib/tests/test_plugable.py18
-rw-r--r--ipalib/tests/unit_common.py63
3 files changed, 107 insertions, 19 deletions
diff --git a/ipalib/plugable.py b/ipalib/plugable.py
index de5f3f8ff..e74809cd7 100644
--- a/ipalib/plugable.py
+++ b/ipalib/plugable.py
@@ -67,7 +67,32 @@ class Plugin(object):
)
-class Proxy(object):
+class ReadOnly(object):
+ """
+ Base class for classes with read-only attributes.
+ """
+ __slots__ = tuple()
+
+ def __setattr__(self, name, value):
+ """
+ This raises an AttributeError anytime an attempt is made to set an
+ attribute.
+ """
+ raise AttributeError('read-only: cannot set %s.%s' %
+ (self.__class__.__name__, name)
+ )
+
+ def __delattr__(self, name):
+ """
+ This raises an AttributeError anytime an attempt is made to delete an
+ attribute.
+ """
+ raise AttributeError('read-only: cannot del %s.%s' %
+ (self.__class__.__name__, name)
+ )
+
+
+class Proxy(ReadOnly):
"""
Used to only export certain attributes into the dynamic API.
@@ -92,24 +117,6 @@ class Proxy(object):
for name in self.__slots__:
object.__setattr__(self, name, getattr(obj, name))
- def __setattr__(self, name, value):
- """
- Proxy instances are read-only. This raises an AttributeError
- anytime an attempt is made to set an attribute.
- """
- raise AttributeError('cannot set %s.%s' %
- (self.__class__.__name__, name)
- )
-
- def __delattr__(self, name):
- """
- Proxy instances are read-only. This raises an AttributeError
- anytime an attempt is made to delete an attribute.
- """
- raise AttributeError('cannot del %s.%s' %
- (self.__class__.__name__, name)
- )
-
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.__obj)
diff --git a/ipalib/tests/test_plugable.py b/ipalib/tests/test_plugable.py
index 023bf45fa..e69060b3e 100644
--- a/ipalib/tests/test_plugable.py
+++ b/ipalib/tests/test_plugable.py
@@ -21,6 +21,7 @@
Unit tests for `ipalib.plugable` module.
"""
+import unit_common as uc
from ipalib import plugable, errors
@@ -52,6 +53,23 @@ def test_Plugin():
assert repr(p) == '%s.some_plugin()' % __name__
+def test_ReadOnly():
+ obj = plugable.ReadOnly()
+ names = ['not_an_attribute', 'an_attribute']
+ for name in names:
+ uc.no_set(obj, name)
+ uc.no_del(obj, name)
+
+ class some_ro_class(plugable.ReadOnly):
+ def __init__(self):
+ object.__setattr__(self, 'an_attribute', 'Hello world!')
+ obj = some_ro_class()
+ for name in names:
+ uc.no_set(obj, name)
+ uc.no_del(obj, name)
+ assert uc.read_only(obj, 'an_attribute') == 'Hello world!'
+
+
def test_Proxy():
class CommandProxy(plugable.Proxy):
__slots__ = (
diff --git a/ipalib/tests/unit_common.py b/ipalib/tests/unit_common.py
new file mode 100644
index 000000000..f5c7f0f91
--- /dev/null
+++ b/ipalib/tests/unit_common.py
@@ -0,0 +1,63 @@
+# 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
+
+"""
+Utility functions for unit tests.
+"""
+
+
+def no_set(obj, name):
+ """
+ Tests that attribute cannot be set.
+ """
+ raised = False
+ try:
+ setattr(obj, name, 'some_new_obj')
+ except AttributeError:
+ raised = True
+ assert raised
+
+
+def no_del(obj, name):
+ """
+ Tests that attribute cannot be deleted.
+ """
+ raised = False
+ try:
+ delattr(obj, name)
+ except AttributeError:
+ raised = True
+ assert raised
+
+
+def read_only(obj, name):
+ """
+ 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)
+
+ # Test that it cannot be deleted:
+ no_del(obj, name)
+
+ # Return the attribute
+ return getattr(obj, name)