def test_detail_database_abstraction_actions(self):
        """
        Tests that database detail component's abstractions changes are
        correctly reported to GUI.
        """
        site = SiteConfigurationManager.get_blank_site()
        database = site.database
        control_agent = DetailDatabaseControlAgent(database)
        presentation_agent = control_agent.get_presentation_agent()
        database.enabled = True
        refresh_gui()

        # All widgets should be enabled
        flags = {
            'enabled': True,
            'type': True,
            'name': True,
            'username': True,
            'password': True,
            }
        self.assert_widgets_sensitive_flag(presentation_agent, flags)

        # Enabled widget should be activated
        self.assert_widgets_active_flag(presentation_agent, {'enabled': True})

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

        # Comboboxes value should reflect abstraction changes
        dbtype = SiteDefaultsManager.get_database_types().keys()[0]

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

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

        # Tests widgets sensitivity after enablement
        flags = {
            'enabled': False,
            'type': False,
            'name': False,
            'username': False,
            'password': False,
            }
        self.assert_widgets_sensitive_flag(presentation_agent, flags)
    def test_detail_database_gui_actions(self):
        """
        Tests that database detail component's presentation_agent works as
        expected, and that abstraction attributes are set correspondingly to
        GUI actions.
        """
        site = SiteConfigurationManager.get_blank_site()
        database = site.database
        control_agent = DetailDatabaseControlAgent(database)
        presentation_agent = control_agent.get_presentation_agent()
        presentation_agent['enabled'].set_active(True)
        refresh_gui()

        # Enables component
        presentation_agent['enabled'].set_active(True)
        refresh_gui()

        # Tests widgets sensitivity after enablement
        flags = {
            'enabled': True,
            'type': True,
            'name': True,
            'username': True,
            'password': True,
            }
        self.assert_widgets_sensitive_flag(presentation_agent, flags)

        # When a widget is enabled, the corresponding attribute should follow
        for name in ('enabled',):
            setattr(database, name, True)
            refresh_gui()
            self.assert_widgets_active_flag(presentation_agent, {name: True})

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

        # Comboboxes value should be reported to abstraction
        dbtype = SiteDefaultsManager.get_database_types().keys()[0]

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

        # Ine read-only mode, all widgets should be disabled
        flags = {
            'enabled': False,
            'name':  False,
            'username':  False,
            'password':  False,
            'type':  False
            }
        self.assert_widgets_sensitive_flag(presentation_agent, flags)
    def test_detail_database_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()
        database = site.database
        control_agent = DetailDatabaseControlAgent(database, read_only=True)
        presentation_agent = control_agent.get_presentation_agent()
        database.enabled = True
        refresh_gui()

        for widget in ('name', 'username'):
            observer = ValidityObserver()
            control_agent.get_event_bus().subscribe(
                DataValidityEvent, observer.validity_changed)

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

            observer.reset()
            presentation_agent[widget].set_text('ab c')
            refresh_gui()
            self.assertTrue(observer.notified,
                            'validity observer has not been notified')
            self.assertFalse(observer.flag,
                            'database validity should be false')
            control_agent.get_event_bus().unsubscribe(
                DataValidityEvent, observer.validity_changed)
    def detail_database_state_test(self, database):
        """
        Tests site detail component's presentation_agent initial state
        """
        done = database.done
        enabled = database.enabled
        control_agent = DetailDatabaseControlAgent(database)
        presentation_agent = control_agent.get_presentation_agent()
        refresh_gui()

        # Tests checkboxes state
        flags = { 'enabled': enabled }
        self.assert_widgets_active_flag(presentation_agent, flags)

        # Tests widgets sensitivity
        flags = {
            'enabled': not done,
            'name': enabled and not done,
            'username': enabled and not done,
            'password': enabled and not done,
            'type': enabled and not done,
            }
        self.assert_widgets_sensitive_flag(presentation_agent, flags)