def test_field_default_independence(self): # Ensure that fields using the default value aren't being assigned # shallow copies. class FauxDataManager(object): def setstate(self, obj): pass def oldstate(self, obj, tid): pass def register(self, obj): pass # Dummy instances foo = Item(id=u'foo') foo.portal_type = 'testtype' foo._p_jar = FauxDataManager() bar = Item(id=u'bar') bar.portal_type = 'testtype' bar._p_jar = FauxDataManager() baz = Container(id=u'baz') baz.portal_type = 'testtype' baz._p_jar = FauxDataManager() # Dummy schema class ISchema(Interface): listfield = zope.schema.List(title=u"listfield", default=[1, 2]) # FTI mock fti_mock = self.mocker.proxy(DexterityFTI(u"testtype")) self.expect(fti_mock.lookupSchema()).result(ISchema).count(1) self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype") self.replay() # Ensure that the field of foo is not the same field, also attached to # bar. self.assertTrue(foo.listfield is not bar.listfield) self.assertTrue(foo.listfield is not baz.listfield) # And just to reinforce why this is awful, we'll ensure that updating # the field's value on one object does not change the value on the # other. foo.listfield.append(3) self.assertEquals(bar.listfield, [1, 2]) self.assertEquals(baz.listfield, [1, 2])
def test_field_default_independence(self): # Ensure that fields using the default value aren't being assigned # shallow copies. class FauxDataManager(object): def setstate(self, obj): pass def oldstate(self, obj, tid): pass def register(self, obj): pass # Dummy instances foo = Item(id=u'foo') foo.portal_type = 'testtype' foo._p_jar = FauxDataManager() bar = Item(id=u'bar') bar.portal_type = 'testtype' bar._p_jar = FauxDataManager() baz = Container(id=u'baz') baz.portal_type = 'testtype' baz._p_jar = FauxDataManager() # Dummy schema class ISchema(Interface): listfield = zope.schema.List(title=u"listfield", default=[1, 2]) # FTI mock fti_mock = self.mocker.proxy(DexterityFTI(u"testtype")) self.expect(fti_mock.lookupSchema()).result(ISchema).count(1) self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype") self.replay() # Ensure that the field of foo is not the same field, also attached to # bar. self.assertTrue(foo.listfield is not bar.listfield) self.assertTrue(foo.listfield is not baz.listfield) # And just to reinforce why this is awful, we'll ensure that updating # the field's value on one object does not change the value on the # other. foo.listfield.append(3) self.assertEqual(bar.listfield, [1, 2]) self.assertEqual(baz.listfield, [1, 2])
def test_provided_by_item(self): class FauxDataManager(object): def setstate(self, obj): pass def oldstate(self, obj, tid): pass def register(self, obj): pass # Dummy instance item = Item(id=u'id') item.portal_type = 'testtype' item._p_jar = FauxDataManager() # Dummy schema class ISchema(Interface): foo = zope.schema.TextLine(title=u"foo", default=u"foo_default") bar = zope.schema.TextLine(title=u"bar") class IMarker(Interface): pass # Schema is not implemented by class or provided by instance self.assertFalse(ISchema.implementedBy(Item)) self.assertFalse(ISchema.providedBy(item)) # FTI mock fti_mock = self.mocker.proxy(DexterityFTI(u"testtype")) self.expect(fti_mock.lookupSchema()).result(ISchema).count(1) self.mock_utility(fti_mock, IDexterityFTI, name=u"testtype") self.replay() self.assertFalse(ISchema.implementedBy(Item)) # Schema as looked up in FTI is now provided by item ... self.assertTrue(ISchema.providedBy(item)) # If the _v_ attribute cache does not work, then we'd expect to have # to look up the schema more than once (since we invalidated) # the cache. This is not the case, as evidenced by .count(1) above. self.assertTrue(ISchema.providedBy(item)) # We also need to ensure that the _v_ attribute doesn't hide any # interface set directly on the instance with alsoProvides() or # directlyProvides(). This is done by clearing the cache when these # are invoked. alsoProvides(item, IMarker) self.assertTrue(IMarker.providedBy(item)) self.assertTrue(ISchema.providedBy(item))