def test_missing_component_no_exception(self):
     """If a component no longer exists at the path to receive the notification, no error should occur."""
     v = ViewState(MagicMock())
     n = NotificationCentre(v)
     v.component_from_path = MagicMock(return_value=None)
     n.subscribe_to_notification('test_notification', 'page.test_component')
     n.post_notification('test_notification')
    def test_notification_unsubscribe_all(self):
        """nc.unsubscribe_from_all_notifications should prevent any more calls going to the component."""
        v = ViewState(MagicMock())
        n = NotificationCentre(v)
        component = MagicMock()
        v.component_from_path = MagicMock(return_value=component)

        n.subscribe_to_notification('test_notification', 'page.test_component')
        n.subscribe_to_notification('test_notification2', 'page.test_component')
        n.unsubscribe_from_all_notifications('page.test_component')
        n.post_notification('test_notification')
        n.post_notification('test_notification2')
        self.assertEqual(component.process_notification.call_count, 0)
    def test_notification_unsubscribe(self):
        """After a component unsubscribes, it should not receive that notification any more (but should still receive
        others that it is subscribed to)."""
        v = ViewState(MagicMock())
        n = NotificationCentre(v)
        component = MagicMock()
        v.component_from_path = MagicMock(return_value=component)

        n.subscribe_to_notification('test_notification', 'page.test_component')
        n.subscribe_to_notification('test_notification2', 'page.test_component')
        n.unsubscribe_from_notification('test_notification', 'page.test_component')
        n.post_notification('test_notification')
        self.assertEqual(component.process_notification.call_count, 0)
        n.post_notification('test_notification2')
        component.process_notification.assert_called_with('test_notification2', None)
    def test_global_notification_subscription_and_receive(self):
        """A component that subscribes to a notification with a blank source, should receive that notification no matter
        what source posts it."""
        v = ViewState(MagicMock())
        n = NotificationCentre(v)
        component = MagicMock()
        v.component_from_path = MagicMock(return_value=component)

        n.subscribe_to_notification('test_notification', 'page.test_component')
        n.post_notification('test_notification')
        component.process_notification.assert_called_with('test_notification', None)

        n.subscribe_to_notification('test_notification2', 'page.test_component')
        n.post_notification('test_notification2', 'page.another_component')
        component.process_notification.assert_called_with('test_notification2', None)
    def test_specific_notification_subscription_and_receive(self):
        """A component can listen to events from only single sources, so shouldn't receive that notification if posted
        from elsewhere."""
        v = ViewState(MagicMock())
        n = NotificationCentre(v)
        component = MagicMock()
        v.component_from_path = MagicMock(return_value=component)

        n.subscribe_to_notification('test_notification', 'page.test_component', 'page.source_component')
        n.post_notification('test_notification')
        n.post_notification('test_notification', 'page.another_source')
        self.assertEqual(component.process_notification.call_count, 0)

        n.post_notification('test_notification', 'page.source_component')
        component.process_notification.assert_called_with('test_notification', None)
 def test_no_listeners_no_exception(self):
     """If there is no listener for a notification, no error should occur."""
     v = ViewState(MagicMock())
     n = NotificationCentre(v)
     n.post_notification('test_notification')