def test_detail_dnshost_gui_actions(self):
        """
        Tests that repository detail component's presentation_agent works as
        expected, and that abstraction attributes are set correspondingly to
        GUI actions.
        """
        site = SiteConfigurationManager.get_blank_site()
        dnshost = site.dnshost
        control_agent = DetailDNSHostControlAgent(dnshost)
        presentation_agent = control_agent.get_presentation_agent()
        refresh_gui()

        # When name entry is set, the abstraction should have corresponding
        # value set
        for name in ('name', 'description'):
            presentation_agent[name].set_text('abc')
            refresh_gui()
            self.assertEquals(getattr(dnshost, name), 'abc',
                              'dnshost %s attribute is wrong: %s' % (name, getattr(dnshost, name)))

        # Comboboxes value should be reported to abstraction
        domain = SiteDefaultsManager.get_domains().keys()[0]
        platform = SiteDefaultsManager.get_platforms().keys()[0]

        for name, value in {'domain': domain, 'platform': platform}.items():
            presentation_agent.set_value(name, value)
            refresh_gui()
            self.assertEquals(getattr(dnshost, name), value,
                             'dnshost %s attribute is wrong' % name)
    def test_detail_dnshost_abstraction_actions(self):
        """
        Tests that database detail component's abstractions changes are
        correctly reported to GUI.
        """
        site = SiteConfigurationManager.get_blank_site()
        dnshost = site.dnshost
        control_agent = DetailDNSHostControlAgent(dnshost)
        presentation_agent = control_agent.get_presentation_agent()
        refresh_gui()

        # All widgets should be enabled
        flags = {
            'name': True,
            'domain': True,
            'platform': True,
            'description': True
            }
        self.assert_widgets_sensitive_flag(presentation_agent, flags)

        # When a name or description is set, correpsonding widget
        # should follow
        for name in ('name', 'description'):
            setattr(dnshost, name, 'abc')
            refresh_gui()
            self.assertEquals(presentation_agent[name].get_text(), 'abc',
                             'dnshost %s widget is wrong' % name)

        # Comboboxes value should reflect abstraction changes
        domain = SiteDefaultsManager.get_domains().keys()[0]
        platform = SiteDefaultsManager.get_platforms().keys()[0]

        for name, value in {'domain': domain, 'platform': platform}.items():
            setattr(dnshost, name, value)
            refresh_gui()
            self.assertEquals(presentation_agent.get_combobox_selection(
                presentation_agent[name]), value,
                'dnshost %s widget selection is wrong' % name)

        # Tests that when done flag is set, allw widgets are disabled
        dnshost.done = True
        refresh_gui()

        # Tests widgets sensitivity after enablement
        flags = {
            'description': False,
            'name': False,
            'domain': False,
            'platform': False,
            }
        self.assert_widgets_sensitive_flag(presentation_agent, flags)
    def test_detail_dnshost_read_only(self):
        """
        Tests that database detail component's abstractions changes are
        correctly reported to GUI.
        """
        site = SiteConfigurationManager.get_blank_site()
        dnshost = site.dnshost
        control_agent = DetailDNSHostControlAgent(dnshost, read_only=True)
        presentation_agent = control_agent.get_presentation_agent()
        refresh_gui()

        # Ine read-only mode, all widgets should be disabled
        flags = {
            'name': False,
            'domain': False,
            'platform': False,
            'description': False
            }
        self.assert_widgets_sensitive_flag(presentation_agent, flags)
    def test_detail_dnshost_init_state(self):
        """
        Tests repository detail component's presentation_agent initial state
        """
        dnshost = SiteConfigurationManager.lookup_host_by_name('*', '*')[0]
        site = SiteConfigurationManager.get_site_by_name(dnshost.name, dnshost.domain)
        dnshost = site.dnshost
        control_agent = DetailDNSHostControlAgent(dnshost)
        presentation_agent = control_agent.get_presentation_agent()
        refresh_gui()

        # Tests widgets sensitivity
        flags = {
            'description': not dnshost.done,
            'name': not dnshost.done,
            'domain': not dnshost.done,
            'platform': not dnshost.done,
            }
        self.assert_widgets_sensitive_flag(presentation_agent, flags)
    def test_detail_dnshost_validity_flag(self):
        """
        Tests that the validity flag is correctly set and unset when a
        component's widget value is set to a correct and incorrect value.
        """
        site = SiteConfigurationManager.get_blank_site()
        dnshost = site.dnshost
        control_agent = DetailDNSHostControlAgent(dnshost)
        presentation_agent = control_agent.get_presentation_agent()

        observer = ValidityObserver()
        control_agent.get_event_bus().subscribe(
            DataValidityEvent, observer.validity_changed)

        presentation_agent['name'].set_text('abc')
        refresh_gui()
        self.assertTrue(observer.notified,
                        'validity observer has not been notified')
        self.assertTrue(observer.flag,
                        'dns validity should be true')

        presentation_agent['name'].set_text('@b c')
        refresh_gui()
        self.assertTrue(observer.notified,
                        'validity observer has not been notified')
        self.assertFalse(observer.flag,
                        'dnshost validity should be false')
        control_agent.get_event_bus().unsubscribe(
            DataValidityEvent, observer.validity_changed)