Esempio n. 1
0
def test_uncontained():
    item = Item()
    container = {u'foo': item}
    x, event = containedEvent(item, container, u'foo')

    assert item.__parent__ is container
    assert item.__name__ == u'foo'

    uncontained(item, container, u'foo')
    assert item.__parent__ is None
    assert item.__name__ is None

    assert len(getEvents(IObjectRemovedEvent)) == 1

    event = getEvents(IObjectRemovedEvent)[-1]
    assert event.object is item
    assert event.oldParent is container
    assert event.oldName == u'foo'
    assert event.newParent is None
    assert event.newName is None

    assert len(getEvents(IObjectModifiedEvent)) == 1
    assert getEvents(IObjectModifiedEvent)[-1].object is container

    # Events are never triggered twice
    uncontained(item, container, u'foo')
    assert len(getEvents(IObjectRemovedEvent)) == 1
    assert len(getEvents(IObjectModifiedEvent)) == 1

    item.__parent__, item.__name__ = container, None
    uncontained(item, container, u'foo')
    assert len(getEvents(IObjectRemovedEvent)) == 1
    assert len(getEvents(IObjectModifiedEvent)) == 2

    item.__parent__, item.__name__ = None, u'bar'
    uncontained(item, container, u'foo')
    assert len(getEvents(IObjectRemovedEvent)) == 1
    assert len(getEvents(IObjectModifiedEvent)) == 3
def test_contained_event():

    container = {}
    item = Contained()
    x, event = containedEvent(item, container, u'foo')
    assert x is item
    assert item.__parent__ is container
    assert item.__name__ == u'foo'

    assert event.__class__.__name__ == 'ObjectAddedEvent'
    assert event.object is item
    assert event.newParent is container
    assert event.newName == u'foo'
    assert event.oldParent is None
    assert event.oldName is None

    # Event is not triggered twice.
    x2, event = containedEvent(item, container, u'foo')
    assert x2 is item
    assert item.__parent__ is container
    assert item.__name__ == u'foo'

    assert not event

    # Moved event
    x, event = containedEvent(item, container, u'foo2')
    assert event.__class__.__name__ == 'ObjectMovedEvent'
    assert event.object is item
    assert event.newParent is container
    assert event.newName == u'foo2'
    assert event.oldParent is container
    assert event.oldName == u'foo'

    # Ilocation enrichment
    item = Location()
    assert not IContained.providedBy(item)

    x, event = containedEvent(item, container, 'foo')
    assert x is item
    assert item.__parent__ is container
    assert item.__name__ == 'foo'
    assert IContained.providedBy(item)

    # Containment proxy
    item = []
    x, event = containedEvent(item, container, 'foo')
    assert not x is item
    assert x.__parent__ is container
    assert x.__name__ == 'foo'

    # Make sure we don't lose existing directly provided interfaces.
    from zope.interface import Interface, directlyProvides

    class IOther(Interface):
        pass

    item = Location()
    directlyProvides(item, IOther)
    assert IOther.providedBy(item)

    x, event = containedEvent(item, container, 'foo')
    assert IOther.providedBy(item)