def test_set_decorated(self):
        """
        A decorator should be able to mark an object as decorated to
        prevent redecoration in the future.

        """
        sig = '__mumbo_jumbo__'
        dec = BaseDecorator(sig)
        o = FakeObject()
        dec._set_decorated(o)
        self.assertTrue(hasattr(o, sig))
    def test__call__stale(self):
        """
        Tests the __call_method on a stale(decorated) object

        """
        dec = BaseDecorator('__mumbo_jumbo__')
        dec._set_decorated = mock.Mock()
        dec._decorate = mock.Mock()
        dec._has_decorated = mock.Mock(return_value=True)
        o = FakeObject()
        config = {}
        dec(o, config)
        dec._set_decorated.assert_not_called()
        dec._has_decorated.assert_called_with(o)
        dec._decorate.assert_not_called()
    def test__call__fresh(self):
        """
        Tests the __call__ method on a fresh(undecorated) object.

        """
        dec = BaseDecorator('__mumbo_jumbo__')
        dec._set_decorated = mock.Mock()
        dec._has_decorated = mock.Mock(return_value=False)

        o = FakeObject()
        dec._decorate = mock.Mock(return_value=o)
        config = {}
        dec(o, config)
        dec._set_decorated.assert_called_with(o)
        dec._decorate.assert_called_once_with(o, config)
        dec._has_decorated.assert_called_with(o)