Message wrapper attributes lookup
---------------------------------

The message wrapper enable to lookup attribute first on its own class and if the attribute isn't found then it looks up in the adapted message.

Some setup first. We create a fake amqp message.

    >>> from affinitic.zamqp.interfaces import IMessage
    >>> from zope.interface import implements
    >>> class DummyAMQPMessage(object):
    ...     implements(IMessage)
    ...     _state = ''
    ...
    ...     def ack(self):
    ...         self._state = 'ACK'


    >>> from affinitic.zamqp.interfaces import IMessageWrapper
    >>> message = DummyAMQPMessage()
    >>> messageWrapper = IMessageWrapper(message)
    >>> messageWrapper
    <affinitic.zamqp.message.MessageWrapper object at ...>

The message wrapper does not have a _state attribute but the
lookup will look in the adapted object (the DummyAMQPMessage object)::

    >>> messageWrapper._state
    ''
    >>> messageWrapper.ack()
    >>> messageWrapper._state
    'ACK'


Message and transaction
-----------------------

If the message is transaction aware and is acknowledged then the message broker receives acknowledgement
only on commit::

    >>> message = DummyAMQPMessage()
    >>> import transaction
    >>> tr = transaction.begin()
    >>> messageWrapper = IMessageWrapper(message)
    >>> messageWrapper.acknowledged
    False
    >>> messageWrapper._register()
    >>> messageWrapper.acknowledged
    False
    >>> message._state
    ''
    >>> messageWrapper.ack()
    >>> messageWrapper.acknowledged
    True
    >>> message._state
    ''
    >>> transaction.commit()
    >>> message._state
    'ACK'

If the transaction is aborted::

    >>> message = DummyAMQPMessage()
    >>> import transaction
    >>> tr = transaction.begin()
    >>> from affinitic.zamqp.interfaces import IMessageWrapper
    >>> messageWrapper = IMessageWrapper(message)
    >>> messageWrapper._register()
    >>> messageWrapper.acknowledged
    False
    >>> message._state
    ''
    >>> messageWrapper.ack()
    >>> messageWrapper.acknowledged
    True
    >>> message._state
    ''
    >>> transaction.abort()
    >>> message._state
    ''
    >>> messageWrapper.acknowledged
    False

If the message is not acknowledged nothing happen on the message.

    >>> tr = transaction.begin()
    >>> message = DummyAMQPMessage()
    >>> messageWrapper = IMessageWrapper(message)
    >>> messageWrapper._register()
    >>> messageWrapper.acknowledged
    False
    >>> message._state
    ''
    >>> transaction.commit()
    >>> message._state
    ''

If we work without a transaction, message receive directly the acknowledgment

    >>> messageWrapper = IMessageWrapper(message)
    >>> message._state
    ''
    >>> messageWrapper.ack()
    >>> messageWrapper.acknowledged
    True
    >>> message._state
    'ACK'
