class Test_Notifier(unittest.TestCase):
    """
    Unittest for the class Notifier.
    """

    def setUp(self):
        self.notifier = Notifier(['simple_key', 'key_with_message'])
        self.mock_listener = Mock()
        self.first_key_heared = self.mock_listener.first_key_heared
        self.first_key_heared_again = self.mock_listener.first_key_heared_again
        self.second_key_heared = self.mock_listener.second_key_heared
        self.notifier.connect('simple_key', self.first_key_heared)
        self.notifier.connect('simple_key', self.first_key_heared_again)
        self.notifier.connect('key_with_message', self.second_key_heared)

    def test_notifier(self):
        self.mock_listener.expects(once()).first_key_heared()
        self.mock_listener.expects(once()).first_key_heared_again()
        self.mock_listener.expects(never()).second_key_heared()
        self.notifier.notify('simple_key')
        self.mock_listener.verify()

    def test_notifier_with_message(self):
        self.mock_listener.expects(never()).first_key_heared()
        self.mock_listener.expects(never()).first_key_heared_again()
        self.mock_listener.expects(once()).method('second_key_heared').\
                with_at_least(same('little message'))
        self.notifier.notify('key_with_message', 'little message')
        self.mock_listener.verify()

    def test_disconnect(self):
        self.mock_listener.expects(once()).first_key_heared()
        self.mock_listener.expects(never()).first_key_heared_again()
        self.notifier.disconnect('simple_key', self.first_key_heared_again)
        self.notifier.notify('simple_key')
        self.mock_listener.verify()

    def test_reconnect(self):
        self.mock_listener.expects(once()).first_key_heared()
        self.mock_listener.expects(once()).first_key_heared_again()
        self.notifier.disconnect('simple_key', self.first_key_heared_again)
        self.notifier.connect('simple_key', self.first_key_heared_again)
        self.notifier.notify('simple_key')
        self.mock_listener.verify()