aboutsummaryrefslogtreecommitdiff
path: root/factory/test_containers.py
diff options
context:
space:
mode:
Diffstat (limited to 'factory/test_containers.py')
-rw-r--r--factory/test_containers.py212
1 files changed, 212 insertions, 0 deletions
diff --git a/factory/test_containers.py b/factory/test_containers.py
new file mode 100644
index 0000000..3cc61e1
--- /dev/null
+++ b/factory/test_containers.py
@@ -0,0 +1,212 @@
+# Copyright (c) 2010 Mark Sandstrom
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+import unittest
+
+from containers import DeclarationsHolder, OrderedDeclarationDict, ObjectParamsWrapper
+import base
+import declarations
+
+class ObjectParamsWrapperTestCase(unittest.TestCase):
+ def test_read(self):
+ vals = {'one': 1, 'two': 2}
+ wrapper = ObjectParamsWrapper(vals)
+
+ self.assertEqual(1, wrapper.one)
+ self.assertEqual(2, wrapper.two)
+ self.assertRaises(AttributeError, getattr, wrapper, 'three')
+ self.assertRaises(AttributeError, setattr, wrapper, 'one', 1)
+
+ def test_standard_attributes(self):
+ wrapper = ObjectParamsWrapper({})
+ self.assertEqual(ObjectParamsWrapper, wrapper.__class__)
+
+
+class OrderedDeclarationMock(object):
+ def __init__(self, order):
+ self.order = order
+
+
+class OrderedDeclarationDictTestCase(unittest.TestCase):
+ def test_basics(self):
+ one = OrderedDeclarationMock(1)
+ two = OrderedDeclarationMock(2)
+ three = OrderedDeclarationMock(3)
+ d = OrderedDeclarationDict(one=one, two=two, three=three)
+ self.assertEqual(one, d['one'])
+ self.assertEqual(two, d['two'])
+ self.assertEqual(three, d['three'])
+
+ self.assertTrue('one' in d)
+ self.assertTrue('two' in d)
+ self.assertTrue('three' in d)
+
+ self.assertEqual(one, d.pop('one'))
+ self.assertFalse('one' in d)
+
+ d['one'] = one
+ self.assertTrue('one' in d)
+ self.assertEqual(one, d['one'])
+
+ self.assertEqual(set(['one', 'two', 'three']),
+ set(d))
+
+ def test_order(self):
+ one = OrderedDeclarationMock(1)
+ two = OrderedDeclarationMock(2)
+ ten = OrderedDeclarationMock(10)
+ d = OrderedDeclarationDict(one=one, two=two, ten=ten)
+
+ self.assertEqual(['one', 'two', 'ten'], list(d))
+ self.assertEqual([('one', one), ('two', two), ('ten', ten)],
+ d.items())
+ self.assertEqual([('one', one), ('two', two), ('ten', ten)],
+ list(d.iteritems()))
+
+ def test_insert(self):
+ one = OrderedDeclarationMock(1)
+ two = OrderedDeclarationMock(2)
+ four = OrderedDeclarationMock(4)
+ ten = OrderedDeclarationMock(10)
+ d = OrderedDeclarationDict(one=one, two=two, ten=ten)
+
+ self.assertEqual(['one', 'two', 'ten'], list(d))
+ d['four'] = four
+ self.assertEqual(['one', 'two', 'four', 'ten'], list(d))
+
+ def test_replace(self):
+ one = OrderedDeclarationMock(1)
+ two = OrderedDeclarationMock(2)
+ three = OrderedDeclarationMock(3)
+ ten = OrderedDeclarationMock(10)
+ d = OrderedDeclarationDict(one=one, two=two, ten=ten)
+
+ self.assertEqual(['one', 'two', 'ten'], list(d))
+ d['one'] = three
+
+ self.assertEqual(three, d['one'])
+ self.assertEqual(['two', 'one', 'ten'], list(d))
+
+
+class DeclarationsHolderTestCase(unittest.TestCase):
+ def test_empty(self):
+ holder = DeclarationsHolder()
+ self.assertRaises(KeyError, holder.__getitem__, 'one')
+ holder.update_base({'one': 1})
+ self.assertEqual(1, holder['one'])
+
+ def test_simple(self):
+ """Tests a simple use case without OrderedDeclaration."""
+ holder = DeclarationsHolder({'one': 1, 'two': 2})
+ self.assertTrue('one' in holder)
+ self.assertTrue('two' in holder)
+ holder.update_base({'two': 3, 'three': 3})
+ self.assertEqual(1, holder['one'])
+ self.assertEqual(3, holder['two'])
+ self.assertEqual(3, holder['three'])
+
+ attrs = holder.build_attributes(None)
+ self.assertEqual(1, attrs['one'])
+ self.assertEqual(3, attrs['two'])
+ self.assertEqual(3, attrs['three'])
+
+ self.assertEqual(set([('one', 1), ('two', 3), ('three', 3)]),
+ set(holder.items()))
+
+ attrs = holder.build_attributes(None, False, {'two': 2})
+ self.assertEqual(1, attrs['one'])
+ self.assertEqual(2, attrs['two'])
+ self.assertEqual(3, attrs['three'])
+
+ def test_skip_specials(self):
+ """Makes sure that attributes starting with _ are skipped."""
+ holder = DeclarationsHolder({'one': 1, '_two': 2})
+ self.assertTrue('one' in holder)
+ self.assertFalse('_two' in holder)
+
+ remains = holder.update_base({'_two': 2, 'three': 3})
+ self.assertTrue('three' in holder)
+ self.assertFalse('_two' in holder)
+ self.assertEqual({'_two': 2}, remains)
+
+ def test_ordered(self):
+ """Tests the handling of OrderedDeclaration."""
+ two = declarations.LazyAttribute(lambda o: 2 * o.one)
+ three = declarations.LazyAttribute(lambda o: o.one + o.two)
+ holder = DeclarationsHolder({'one': 1, 'two': two, 'three': three})
+
+ self.assertEqual([('one', 1), ('two', two), ('three', three)],
+ holder.items())
+
+ self.assertEqual(two, holder['two'])
+
+ attrs = holder.build_attributes(None)
+ self.assertEqual(1, attrs['one'])
+ self.assertEqual(2, attrs['two'])
+ self.assertEqual(3, attrs['three'])
+
+ attrs = holder.build_attributes(None, False, {'one': 4})
+ self.assertEqual(4, attrs['one'])
+ self.assertEqual(8, attrs['two'])
+ self.assertEqual(12, attrs['three'])
+
+ attrs = holder.build_attributes(None, False, {'one': 4, 'two': 2})
+ self.assertEqual(4, attrs['one'])
+ self.assertEqual(2, attrs['two'])
+ self.assertEqual(6, attrs['three'])
+
+ def test_sub_factory(self):
+ """Tests the behaviour of sub-factories."""
+ class TestObject(object):
+ def __init__(self, one=None, two=None, three=None, four=None):
+ self.one = one
+ self.two = two
+ self.three = three
+ self.four = four
+
+ class TestObjectFactory(base.Factory):
+ FACTORY_FOR = TestObject
+ two = 2
+
+ sub = declarations.SubFactory(TestObjectFactory,
+ three=3,
+ four=declarations.LazyAttribute(
+ lambda o: 2 * o.two))
+
+ holder = DeclarationsHolder(defaults={'sub': sub, 'one': 1})
+ self.assertEqual(sub, holder['sub'])
+ self.assertTrue('sub' in holder)
+
+ attrs = holder.build_attributes(None)
+ self.assertEqual(1, attrs['one'])
+ self.assertEqual(2, attrs['sub'].two)
+ self.assertEqual(3, attrs['sub'].three)
+ self.assertEqual(4, attrs['sub'].four)
+
+ attrs = holder.build_attributes(None, False, {'sub__two': 8, 'three__four': 4})
+ self.assertEqual(1, attrs['one'])
+ self.assertEqual(4, attrs['three__four'])
+ self.assertEqual(8, attrs['sub'].two)
+ self.assertEqual(3, attrs['sub'].three)
+ self.assertEqual(16, attrs['sub'].four)
+
+
+if __name__ == '__main__':
+ unittest.main()