diff options
author | Jason Gerard DeRose <jderose@redhat.com> | 2008-08-01 03:12:17 +0000 |
---|---|---|
committer | Jason Gerard DeRose <jderose@redhat.com> | 2008-08-01 03:12:17 +0000 |
commit | 31fc955355ac8d873b82d129021f599f820c2694 (patch) | |
tree | 85e686aefaffeddd6307e4e0eeff4447c85727e3 /ipalib | |
parent | f53dec2600f95246a72fa3c847a485d2a94edfa7 (diff) | |
download | freeipa-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.py | 45 | ||||
-rw-r--r-- | ipalib/tests/test_plugable.py | 18 | ||||
-rw-r--r-- | ipalib/tests/unit_common.py | 63 |
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) |