def test_upgrade_v3_to_v4(self): pu = ProjectUpgrader(self.toolbox) proj_v3 = make_v3_project_dict() self.assertTrue(pu.is_valid(3, proj_v3)) with TemporaryDirectory() as project_dir: with mock.patch( "spinetoolbox.project_upgrader.ProjectUpgrader.backup_project_file" ) as mock_backup, mock.patch( "spinetoolbox.project_upgrader.ProjectUpgrader.force_save" ) as mock_force_save, mock.patch( 'spinetoolbox.project_upgrader.LATEST_PROJECT_VERSION', 4 ): os.mkdir(os.path.join(project_dir, "tool_specs")) # Make /tool_specs dir # Make temp preprocessing_tool.json tool spec file spec_file_path = os.path.join(project_dir, "tool_specs", "preprocessing_tool.json") with open(spec_file_path, "w", encoding="utf-8") as tmp_spec_file: tmp_spec_file.write("hello") # Upgrade to version 4 proj_v4 = pu.upgrade(proj_v3, project_dir) mock_backup.assert_called_once() mock_force_save.assert_called_once() self.assertTrue(pu.is_valid(4, proj_v4)) # Check that items were transferred successfully by checking that item names are found in new # 'items' dict and that they contain a dict v3_items = proj_v3["items"] v4_items = proj_v4["items"] for name in v3_items.keys(): self.assertTrue(name in v4_items.keys()) self.assertIsInstance(v4_items[name], dict)
def test_upgrade_v1_to_latest(self): pu = ProjectUpgrader(self.toolbox) proj_v1 = make_v1_project_dict() self.assertTrue(pu.is_valid(1, proj_v1)) with TemporaryDirectory() as project_dir: with mock.patch( "spinetoolbox.project_upgrader.ProjectUpgrader.backup_project_file" ) as mock_backup, mock.patch( "spinetoolbox.project_upgrader.ProjectUpgrader.force_save" ) as mock_force_save: os.mkdir(os.path.join(project_dir, "tool_specs")) # Make /tool_specs dir # Make temp preprocessing_tool.json tool spec file spec_file_path = os.path.join(project_dir, "tool_specs", "preprocessing_tool.json") with open(spec_file_path, "w", encoding="utf-8") as tmp_spec_file: tmp_spec_file.write("hello") # Upgrade to latest version proj_latest = pu.upgrade(proj_v1, project_dir) mock_backup.assert_called_once() mock_force_save.assert_called_once() self.assertTrue(pu.is_valid(LATEST_PROJECT_VERSION, proj_latest)) # Check that items were transferred successfully by checking that item names are found in new # 'items' dict and that they contain a dict. Combiners should be gone in v5 v1_items = proj_v1["objects"] latest_items = proj_latest["items"] # v1 project items were categorized under a <item_type> dict which were inside an 'objects' dict for item_category in v1_items.keys(): for name in v1_items[item_category]: self.assertTrue(name in latest_items.keys()) self.assertIsInstance(latest_items[name], dict) self.assertTrue(latest_items[name]["type"] == item_category[:-1])
def test_upgrade_v1_to_v2(self): pu = ProjectUpgrader(self.toolbox) proj_v1 = make_v1_project_dict() self.assertTrue(pu.is_valid(1, proj_v1)) with TemporaryDirectory() as project_dir: with mock.patch( "spinetoolbox.project_upgrader.ProjectUpgrader.backup_project_file" ) as mock_backup, mock.patch( "spinetoolbox.project_upgrader.ProjectUpgrader.force_save" ) as mock_force_save, mock.patch( 'spinetoolbox.project_upgrader.LATEST_PROJECT_VERSION', 2 ): # Upgrade to version 2 proj_v2 = pu.upgrade(proj_v1, project_dir) mock_backup.assert_called_once() mock_force_save.assert_called_once() self.assertTrue(pu.is_valid(2, proj_v2)) # Check that items were transferred successfully by checking that item names are found in new # 'items' dict and that they contain a dict v1_items = proj_v1["objects"] v2_items = proj_v2["items"] # v1 project items categorized under an item_type dict which were inside an 'objects' dict for item_category in v1_items.keys(): for name in v1_items[item_category]: self.assertTrue(name in v2_items.keys()) self.assertIsInstance(v2_items[name], dict)
def test_is_valid_v4(self): """Tests is_valid for a version 4 project dictionary.""" p = make_v4_project_dict() project_upgrader = ProjectUpgrader(self.toolbox) self.assertTrue(project_upgrader.is_valid(4, p)) # Test that an invalid v4 project dict is not valid p = dict() p["project"] = dict() p["items"] = dict() self.assertFalse(project_upgrader.is_valid(4, p))
def test_is_valid2(self): """Tests that an invalid project information dictionary is not accepted.""" p = dict() p["project"] = dict() p["objects"] = dict() # p is missing lots of required information on purpose project_upgrader = ProjectUpgrader(self.toolbox) retval = project_upgrader.is_valid(p) self.assertFalse(retval)
def test_is_valid1(self): """Tests that the pre-made project information dictionary is valid according to project version 1.""" project_config_file = os.path.abspath( os.path.join(os.curdir, "tests", "test_resources", "Project Directory", ".spinetoolbox", "project.json")) project_upgrader = ProjectUpgrader(self.toolbox) project_dict = project_upgrader.open_proj_json(project_config_file) retval = project_upgrader.is_valid(project_dict) self.assertTrue(retval)
def test_upgrade_v4_to_v5(self): pu = ProjectUpgrader(self.toolbox) proj_v4 = make_v4_project_dict() self.assertTrue(pu.is_valid(4, proj_v4)) with TemporaryDirectory() as project_dir: with mock.patch( "spinetoolbox.project_upgrader.ProjectUpgrader.backup_project_file" ) as mock_backup, mock.patch( "spinetoolbox.project_upgrader.ProjectUpgrader.force_save" ) as mock_force_save, mock.patch( 'spinetoolbox.project_upgrader.LATEST_PROJECT_VERSION', 5 ): os.mkdir(os.path.join(project_dir, "tool_specs")) # Make /tool_specs dir # Make temp preprocessing_tool.json tool spec file spec_file_path = os.path.join(project_dir, "tool_specs", "preprocessing_tool.json") with open(spec_file_path, "w", encoding="utf-8") as tmp_spec_file: tmp_spec_file.write("hello") # Upgrade to version 5 proj_v5 = pu.upgrade(proj_v4, project_dir) mock_backup.assert_called_once() mock_force_save.assert_called_once() self.assertTrue(pu.is_valid(5, proj_v5)) # Check that items were transferred successfully by checking that item names are found in new # 'items' dict and that they contain a dict. Combiners should be gone in v5 v4_items = proj_v4["items"] # Make a list of Combiner names combiners = list() for name, d in v4_items.items(): if d["type"] == "Combiner": combiners.append(name) v5_items = proj_v5["items"] for name in v4_items.keys(): if name in combiners: # v5 should not have Combiners anymore self.assertFalse(name in v5_items.keys()) else: self.assertTrue(name in v5_items.keys()) self.assertIsInstance(v5_items[name], dict)
def test_upgrade(self): """Tests that reading an old project file (.proj) and upgrading it produces a valid project information dictionary.""" old_project_file = os.path.abspath( os.path.join(os.curdir, "tests", "test_resources", "unit_test_project.proj")) pu = ProjectUpgrader(self.toolbox) old_project_dict = pu.open_proj_json(old_project_file) with TemporaryDirectory() as old_project_dir: # Old project has four items which should have a data_dir a_dir = os.path.join(old_project_dir, "a") b_dir = os.path.join(old_project_dir, "b") c_dir = os.path.join(old_project_dir, "c") d_dir = os.path.join(old_project_dir, "d") create_dir(a_dir) create_dir(b_dir) create_dir(c_dir) create_dir(d_dir) udgraded_project_dict = pu.upgrade(old_project_dict, old_project_dir, "dummy_project_dir") retval = pu.is_valid(udgraded_project_dict) self.assertTrue(retval)