diff options
author | Jason Gerard DeRose <jderose@redhat.com> | 2008-09-25 01:44:53 +0000 |
---|---|---|
committer | Jason Gerard DeRose <jderose@redhat.com> | 2008-09-25 01:44:53 +0000 |
commit | 54c97b494880a3d276e2da69ffde55a3ee475616 (patch) | |
tree | aaa9202745eba74e9950c5142d8998d0fd978642 /ipalib | |
parent | 426742279348765d27ad66c69bea874398ed0ef4 (diff) | |
download | freeipa-54c97b494880a3d276e2da69ffde55a3ee475616.tar.gz freeipa-54c97b494880a3d276e2da69ffde55a3ee475616.tar.xz freeipa-54c97b494880a3d276e2da69ffde55a3ee475616.zip |
359: Added Object.primary_key instance attribute; added corresponding unit tests
Diffstat (limited to 'ipalib')
-rw-r--r-- | ipalib/frontend.py | 12 | ||||
-rw-r--r-- | ipalib/tests/test_frontend.py | 51 |
2 files changed, 63 insertions, 0 deletions
diff --git a/ipalib/frontend.py b/ipalib/frontend.py index 948b047dd..40220074e 100644 --- a/ipalib/frontend.py +++ b/ipalib/frontend.py @@ -514,10 +514,12 @@ class Object(plugable.Plugin): 'methods', 'properties', 'params' + 'primary_key', )) methods = None properties = None params = None + primary_key = None takes_params = tuple() def set_api(self, api): @@ -531,6 +533,16 @@ class Object(plugable.Plugin): self.params = plugable.NameSpace( self.__get_params(), sort=False ) + pkeys = filter(lambda p: p.primary_key, self.params()) + if len(pkeys) > 1: + raise ValueError( + '%s (Object) has multiple primary keys: %s' % ( + self.name, + ', '.join(p.name for p in pkeys), + ) + ) + if len(pkeys) == 1: + self.primary_key = pkeys[0] def __get_attrs(self, name): namespace = getattr(self.api, name) diff --git a/ipalib/tests/test_frontend.py b/ipalib/tests/test_frontend.py index e78aeeb26..38c35506b 100644 --- a/ipalib/tests/test_frontend.py +++ b/ipalib/tests/test_frontend.py @@ -858,6 +858,57 @@ class test_Object(ClassChecker): assert p.required is True assert p.multivalue is False + def test_primary_key(self): + """ + Test the `frontend.Object.primary_key` attribute. + """ + api = plugable.API( + frontend.Method, + frontend.Property, + ) + api.finalize() + + # Test with no primary keys: + class example1(self.cls): + takes_params = ( + 'one', + 'two', + ) + o = example1() + o.set_api(api) + assert o.primary_key is None + + # Test with 1 primary key: + class example2(self.cls): + takes_params = ( + 'one', + 'two', + frontend.Param('three', + primary_key=True, + ), + 'four', + ) + o = example2() + o.set_api(api) + pk = o.primary_key + assert isinstance(pk, frontend.Param) + assert pk.name == 'three' + assert pk.primary_key is True + assert o.params[2] is o.primary_key + + # Test with multiple primary_key: + class example3(self.cls): + takes_params = ( + frontend.Param('one', primary_key=True), + frontend.Param('two', primary_key=True), + 'three', + frontend.Param('four', primary_key=True), + ) + o = example3() + e = raises(ValueError, o.set_api, api) + assert str(e) == \ + 'example3 (Object) has multiple primary keys: one, two, four' + class test_Attribute(ClassChecker): """ |