def test_cannot_modify_default(self):
        ch = ConfigHolder(MACROS, MockVersionControl(), file_manager=MockConfigurationFileManager(), test_config=Configuration(MACROS))

        try:
            ch.save_configuration(DEFAULT_COMPONENT, True)
        except Exception as err:
            self.assertEqual(err.message, "Cannot save over default component")
    def test_empty_component_save_and_load(self):
        ch = ConfigHolder(MACROS, MockVersionControl(), file_manager=MockConfigurationFileManager(), test_config=Configuration(MACROS))
        ch.save_configuration("TESTCOMPONENT", True)
        ch.clear_config()

        conf = ch.load_configuration("TESTCOMPONENT", True)
        ch.set_config(conf, True)

        self.assertEqual(ch.get_config_name(), "TESTCOMPONENT")
        self.assertEqual(len(ch.get_blocknames()), 0)
        self.assertEqual(len(ch.get_group_details()), 0)
        self.assertEqual(len(ch.get_ioc_names()), 0)
        self.assertEqual(len(ch.get_component_names()), 0)
    def test_default_component_is_loaded(self):
        # Arrange
        ch = ConfigHolder(MACROS, MockVersionControl(), file_manager=MockConfigurationFileManager(), test_config=Configuration(MACROS))
        ch.save_configuration("TESTCONFIG", False)
        ch.clear_config()

        # Act
        conf = ch.load_configuration("TESTCONFIG")
        ch.set_config(conf, False)

        # Assert
        comp_count = len(ch.get_component_names())
        comp_count_with_default = len(ch.get_component_names(True))
        self.assertTrue(comp_count_with_default > comp_count)
    def test_set_config_details(self):
        # Need component
        ch = ConfigHolder(MACROS, MockVersionControl(), file_manager=MockConfigurationFileManager(), test_config=Configuration(MACROS))
        ch.save_configuration("TESTCOMPONENT", True)

        new_details = {"iocs":
                           [{"name": "TESTSIMPLE1", "autostart": True, "restart": True, "macros": [], "pvs": [],
                             "pvsets": [], "component": None},
                            {"name": "TESTSIMPLE2", "autostart": True, "restart": True, "macros": [], "pvs": [],
                             "pvsets": [], "component": None}],
                       "blocks":
                           [{"name": "TESTBLOCK1", "local": True, "pv": "PV1", "component": None,
                             "visible": True},
                            {"name": "TESTBLOCK2", "local": True, "pv": "PV2", "component": None,
                             "visible": True},
                            {"name": "TESTBLOCK3", "local": True, "pv": "PV3", "component": None,
                             "visible": True}],
                       "components": [{"name": "TESTCOMPONENT"}],
                       "groups":
                           [{"blocks": ["TESTBLOCK1"], "name": "Group1", "component": None},
                            {"blocks": ["TESTBLOCK2"], "name": "Group2", "component": None},
                            {"blocks": ["TESTBLOCK3"], "name": "NONE", "component": None}],
                       "name": "TESTCONFIG",
                       "description": "Test Description",
                       "synoptic": "TEST_SYNOPTIC"
                       }
        ch.set_config_details(new_details)
        details = ch.get_config_details()
        iocs = [x['name'] for x in details['iocs']]
        self.assertEqual(len(iocs), 2)
        self.assertTrue("TESTSIMPLE1" in iocs)
        self.assertTrue("TESTSIMPLE2" in iocs)

        self.assertEqual(len(details['blocks']), 3)
        blks = [x['name'] for x in details['blocks']]
        self.assertTrue("TESTBLOCK1" in blks)
        self.assertTrue("TESTBLOCK2" in blks)
        self.assertTrue("TESTBLOCK3" in blks)

        self.assertEqual(len(details['groups']), 3)
        self.assertEqual(details['groups'][0]['blocks'], ["TESTBLOCK1"])
        self.assertEqual(details['groups'][1]['blocks'], ["TESTBLOCK2"])
        self.assertEqual(details['groups'][2]['blocks'], ["TESTBLOCK3"])

        self.assertEqual(len(details['components']), 1)
        self.assertEqual(details['components'][0]['name'], "TESTCOMPONENT")

        self.assertEqual(details['name'], "TESTCONFIG")
        self.assertEqual(details['description'], "Test Description")
        self.assertEqual(details['synoptic'], "TEST_SYNOPTIC")
    def test_save_comp_add_to_config(self):
        # Create and save a component
        ch = ConfigHolder(MACROS, MockVersionControl(), file_manager=MockConfigurationFileManager(), test_config=create_dummy_component())
        ch.save_configuration("TESTCOMPONENT", True)
        ch.clear_config()

        # Create and save a config that uses the component
        ch.set_config(create_dummy_config())
        comp = ch.load_configuration("TESTCOMPONENT", True)
        ch.add_component("TESTCOMPONENT", comp)

        ch.save_configuration("TESTCONFIG", False)
        ch.clear_config()
        conf = ch.load_configuration("TESTCONFIG", False)
        ch.set_config(conf)

        self.assertEqual(len(ch.get_component_names()), 1)