def test_deletion(self, user_response): tab = MetaboliteTab() model = Model() metabolite1 = Metabolite("m1") metabolite2 = Metabolite("m2") metabolite3 = Metabolite("m3") model.add_metabolites([metabolite1, metabolite2, metabolite3]) model.setup_metabolite_table() assert len( model.metabolites) == model.QtMetaboliteTable.rowCount() == 3 tab.set_model(model) tab.confirmDeletion = Mock(return_value=user_response) item = tab.dataTable.item(1, 0) selected_metabolite = item.link source_index = tab.dataTable.indexFromItem(item) view_index = tab.proxyModel.mapFromSource(source_index) tab.dataView.selectRow(view_index.row()) assert tab.confirmDeletion.called is False tab.deleteItemSlot() assert tab.confirmDeletion.called is True assert (selected_metabolite in model.metabolites) is not user_response assert tab.dataTable.findItems( selected_metabolite.id) is not user_response if user_response: assert len( model.metabolites) == model.QtMetaboliteTable.rowCount() == 2
def test_map_metabolite_by_formula(self, database, progress): model = Model() met1 = Metabolite("m1", formula="H2O") model.add_metabolites([met1]) update_metabolite_database_mapping(database, model, progress) assert model.database_mapping[met1] == 1
def test_map_metabolite_by_name(self, database, progress): model = Model() met1 = Metabolite("m1", name="Water") model.add_metabolites([met1]) update_metabolite_database_mapping(database, model, progress) assert model.database_mapping[met1] == 1
def test_not_mapped_for_name_substring(self, database, progress): model = Model() met1 = Metabolite("m1", name="ater") model.add_metabolites([met1]) update_metabolite_database_mapping(database, model, progress) assert model.database_mapping[met1] is None
def test_get_item_from_model(self): model = Model("test id") reaction = Reaction("r_id") metabolite = Metabolite("m_id") gene = Gene("g_id") # ToDo: Add gene group model.add_reactions([reaction]) model.add_metabolites([metabolite]), model.add_gene(gene) # ToDo: Add gene group assert get_item_from_model("Model", model.id, model) is model assert get_item_from_model("Reaction", reaction.id, model) is reaction assert get_item_from_model("Metabolite", metabolite.id, model) is metabolite assert get_item_from_model("Gene", gene.id, model) is gene # Test expected errors # GeneGroup not implemented with pytest.raises(NotImplementedError): get_item_from_model("GeneGroup", "test_id", model) # ID not in model with pytest.raises(KeyError): get_item_from_model("Reaction", "Not in model", model) with pytest.raises(KeyError): get_item_from_model("Metabolite", "Not in model", model) with pytest.raises(KeyError): get_item_from_model("Gene", "Not in model", model)
def test_map_metabolite_by_annotation(self, database, progress): model = Model() met1 = Metabolite("m1") model.add_metabolites([met1]) met1.annotation.add( Annotation(identifier="MNXM2", collection="metanetx.chemical")) update_metabolite_database_mapping(database, model, progress) assert model.database_mapping[met1] == 1
def test_edit_item_dialog_reject(self): tab = MetaboliteTab() model = Model() metabolite1 = Metabolite("m1") model.add_metabolites([metabolite1]) model.setup_metabolite_table() model.QtMetaboliteTable.update_row_from_link = Mock() tab.set_model(model) tab.dataView.selectRow(0) assert model.QtMetaboliteTable.update_row_from_link.called is False tab.editItemSlot() assert model.QtMetaboliteTable.update_row_from_link.called is False
def test_addition_of_attributes_only_when_set(self): model = Model("Test") metabolite = Metabolite(id="test") model.add_metabolites([metabolite]) add_metabolites(self.root, model) metabolite_node = self.root.find(sbml3_listOfSpecies+"/"+sbml3_species) assert metabolite_node is not None assert metabolite_node.get(fbc_charge) is None assert metabolite_node.get(fbc_chemicalFormula) is None assert metabolite_node.get("name") is None assert metabolite_node.get("compartment") is None
def test_no_map_by_stoichiometry_if_any_metabolite_not_mapped( self, database, progress): model = Model() met1 = Metabolite("m1") met2 = Metabolite("m2") model.add_metabolites((met1, met2)) model.database_mapping.update({met1: 1}) reaction = Reaction("r1") reaction.add_metabolites({met1: -1, met2: -1}) model.add_reactions([reaction]) update_reaction_database_mapping(database, model, progress) assert reaction not in model.database_mapping
def test_map_reaction_by_stoichiometry(self, database, progress): model = Model() met1 = Metabolite("m1") met2 = Metabolite("m2") met3 = Metabolite("m3") met4 = Metabolite("m4") model.add_metabolites((met1, met2, met3, met4)) model.database_mapping.update({met1: 1, met2: 2, met3: 3, met4: 4}) reaction = Reaction("r1") reaction.add_metabolites({met1: -1, met2: -1, met3: 1, met4: 1}) model.add_reactions([reaction]) update_reaction_database_mapping(database, model, progress) assert model.database_mapping[reaction] == 1
def test_map_reaction_by_annotation(self, database, progress): model = Model() met1 = Metabolite("m1") met2 = Metabolite("m2") model.add_metabolites([met1, met2]) reaction = Reaction("r1") reaction.add_metabolites({met1: -1, met2: 1}) reaction.annotation.add( Annotation(identifier="MNXR14892", collection="metanetx.reaction")) model.add_reactions([reaction]) update_reaction_database_mapping(database, model, progress) assert model.database_mapping[reaction] == 1
def test_add_compartments_defined_in_metabolite(): model = Model() metabolite = Metabolite(id="test", compartment="c") model.add_metabolites([metabolite]) root = Element("Root") add_compartments(root, model) compartment_list = root.find(sbml3_listOfCompartments) assert compartment_list is not None compartment = compartment_list.find(sbml3_compartment) assert compartment is not None assert compartment.get("id") == "c" assert compartment.get("name") is None
def test_updating(self): model = Model() met1 = Metabolite(id="met1", formula="H2O", name="Water", charge=0., compartment="c") react1 = Reaction(id="react1", name="test2", subsystem="test2", lower_bound=0., upper_bound=1000.) react1.add_metabolites({met1: -1}) model.add_metabolites([met1]) model.add_reactions([react1]) model.setup_tables() assert model.QtReactionTable.rowCount() == 1 assert model.QtMetaboliteTable.rowCount() == 1 # Check that content is right for i, element in enumerate(model.QtMetaboliteTable.header): assert str(getattr(met1, element.lower())) == model.QtMetaboliteTable.item(0, i).text() # Check that metabolite id is in table assert met1.id in model.QtReactionTable.item(0, 2).text() # Change metabolite met1.id = "new_id" met1.name = "new_name" met1.formula = "H2O2" met1.name = "None" met1.charge = 1. met1.compartment = "e" # Tables are out of sync for i, element in enumerate(model.QtMetaboliteTable.header): assert str(getattr(met1, element.lower())) != model.QtMetaboliteTable.item(0, i).text() # Check reaction table out of sync assert react1.id not in model.QtReactionTable.item(0, 2).text() model.gem_update_metabolites([met1]) # Metabolite table updated for i, element in enumerate(model.QtMetaboliteTable.header): assert str(getattr(met1, element.lower())) == model.QtMetaboliteTable.item(0, i).text() # Reaction table updated assert met1.id in model.QtReactionTable.item(0, 2).text()
def test_add_item_dialog_reject(self): tab = MetaboliteTab() model = Model() model.add_metabolites = Mock() model.QtMetaboliteTable.update_row_from_item = Mock() tab.set_model(model) assert model.add_metabolites.called is False assert model.QtMetaboliteTable.update_row_from_item.called is False tab.addItemSlot() assert model.add_metabolites.called is False assert model.QtMetaboliteTable.update_row_from_item.called is False
def test_update_iteratively(self): """ Check that metabolite are successfully updated one after another """ react = Reaction("rea") met1 = Metabolite("met1", formula="C7H8O2") met2 = Metabolite("met2") met3 = Metabolite("met3") # Update to CO2 in second iteration react.add_metabolites({met1: 1, met3: 1, met2: -1}) react1 = Reaction("rea2") # Transfer C8H8O4 met4 = Metabolite("met4", formula="C8H8O4") react1.add_metabolites({met2: -1, met4: 1}) # Setup model model = Model("id") model.add_metabolites([met1, met2, met3, met4]) model.add_reactions([react, react1]) return_value = update_formulae_iteratively(model) assert met2.formula == met4.formula assert met3.formula == "CO2" assert set(return_value) == set([met2, met3])
class TestEditModelSettings: @pytest.fixture(autouse=True) def setup_items(self): self.test_id = "Test_id" self.test_name = "Test_name" self.model = Model(self.test_id, self.test_name) self.parent = QWidget() self.comp1_name = "Cytoplasm" self.comp1_id = "c" self.new_comp_id = "n" self.new_comp_name = "Nucleus" self.new_comp = Compartment(self.new_comp_id, self.new_comp_name) self.comp1 = Compartment(self.comp1_id, self.comp1_name) self.model.gem_compartments[self.comp1_id] = self.comp1 self.metabolite = Metabolite("test", compartment=self.comp1_id) self.model.add_metabolites([self.metabolite]) self.model.setup_tables() self.dialog = EditModelDialog(model=self.model) @pytest.fixture() def patch_progress(self, monkeypatch): monkeypatch.setattr("PyQt5.QtWidgets.QProgressDialog", Mock()) monkeypatch.setattr("PyQt5.QtWidgets.QApplication.processEvents", Mock()) def test_setup(self): assert self.model.name == self.test_name assert self.model.id == self.test_id assert self.comp1_id in self.model.gem_compartments assert self.model.gem_compartments[self.comp1_id] == self.comp1 assert self.dialog.buttonBox.button(QDialogButtonBox.Save).isEnabled() is False assert self.dialog.input_name.text() == self.test_name assert self.dialog.input_id.text() == self.test_id assert self.dialog.compartmentTable.rowCount() == 1 assert self.metabolite in self.model.metabolites def test_change_in_id_enables_button(self): model = Model() model.gem_compartments["c"] = Compartment("c", "Cytoplasm") dialog = EditModelDialog(model=model) save_button = dialog.buttonBox.button(QDialogButtonBox.Save) # Change id assert save_button.isEnabled() is False QtTest.QTest.keyClick(dialog.input_id, "M") assert save_button.isEnabled() is True # Undo change QtTest.QTest.keyClick(dialog.input_id, QtCore.Qt.Key_Backspace) assert save_button.isEnabled() is False def test_change_in_name_enables_button(self): model = Model() model.gem_compartments["c"] = Compartment("c", "Cytoplasm") dialog = EditModelDialog(model=model) save_button = dialog.buttonBox.button(QDialogButtonBox.Save) # Change id assert save_button.isEnabled() is False QtTest.QTest.keyClicks(dialog.input_name, "M") assert save_button.isEnabled() is True # Undo change QtTest.QTest.keyClick(dialog.input_name, QtCore.Qt.Key_Backspace) assert save_button.isEnabled() is False def test_add_compartment(self): row_count = self.dialog.compartmentTable.rowCount() self.dialog._add_new_compartment_to_table(self.new_comp) assert self.dialog.compartmentTable.rowCount() == row_count + 1 assert self.dialog.buttonBox.button(QDialogButtonBox.Save).isEnabled() is True assert self.dialog.input_changed() is True def test_compartment_deletion(self): assert self.dialog.compartmentTable.rowCount() == 1 self.dialog.compartmentTableView.selectRow(0) QtTest.QTest.mouseClick(self.dialog.button_del_compartment, QtCore.Qt.LeftButton) assert self.dialog.compartmentTable.rowCount() == 0 def test_change_compartment_name(self): assert self.dialog.buttonBox.button(QDialogButtonBox.Save).isEnabled() is False self.dialog.compartmentTable.item(0, 1).setText(self.new_comp_name) assert self.dialog.buttonBox.button(QDialogButtonBox.Save).isEnabled() is True def test_save_changes_id(self): QtTest.QTest.keyClicks(self.dialog.input_id, self.test_id) self.dialog.save_changes() assert self.model.id == self.test_id + self.test_id def test_save_changes_name(self): QtTest.QTest.keyClicks(self.dialog.input_name, self.test_name) self.dialog.save_changes() assert self.model.name == self.test_name + self.test_name def test_save_changes_compartment_addition(self): self.dialog._add_new_compartment_to_table(self.new_comp) assert self.dialog.compartmentTable.rowCount() == 2 self.dialog.save_changes() assert self.model.gem_compartments == {self.comp1_id: self.comp1, self.new_comp_id: self.new_comp} assert self.metabolite in self.model.metabolites def test_save_changes_compartment_deletion(self): self.dialog.compartmentTable.setRowCount(0) assert self.metabolite in self.model.metabolites self.dialog.save_changes() assert self.model.gem_compartments == {} assert self.metabolite not in self.model.metabolites def test_save_changed_compartment_name(self): self.dialog.compartmentTable.item(0, 1).setText(self.new_comp_name) assert self.dialog.buttonBox.button(QDialogButtonBox.Save).isEnabled() is True self.dialog.save_changes() assert self.model.gem_compartments[self.comp1_id].name == self.new_comp_name def test_save_changed_compartment_id(self): new_id = "z" self.dialog.compartmentTable.item(0, 0).setText(new_id) self.dialog.save_changes() assert "z" in self.model.gem_compartments assert self.metabolite.compartment == new_id assert self.model.gem_compartments[new_id] is self.comp1 assert self.comp1.name == self.comp1_name
class TestModelDisplayWidget: @pytest.fixture(autouse=True) def setup_items(self): self.parent = QWidget() self.widget = ModelDisplayWidget(self.parent) self.test_id = "Test_model" self.test_name = "Test name" self.model = Model(self.test_id, name=self.test_name) self.comp1_abbrev = "c" self.comp1_name = "Cytoplasm" self.comp1 = Compartment(self.comp1_abbrev, self.comp1_name) self.model.gem_compartments[self.comp1_abbrev] = self.comp1 self.gene = Gene(id="test_id", name="test_name") self.metabolite = Metabolite(id="test_id", compartment="c") self.reaction = Reaction(id="test_id") self.model.add_metabolites([self.metabolite]) self.model.add_reactions([self.reaction]) self.model.genes.append(self.gene) def test_setup(self): assert len(self.model.metabolites) == 1 assert len(self.model.reactions) == 1 assert len(self.model.genes) == 1 assert self.model.id == self.test_id assert self.model.name == self.test_name assert self.model.gem_compartments[self.comp1_abbrev] == self.comp1 def test_model_addition(self): path = "Test_path" self.widget.set_model(self.model, path=path) assert self.widget.label_model_id.text() == self.test_id assert self.widget.label_model_name.text() == self.test_name assert self.widget.label_number_genes.text() == str( len(self.model.genes)) assert self.widget.label_number_reactions.text() == str( len(self.model.reactions)) assert self.widget.label_number_metabolites.text() == str( len(self.model.metabolites)) assert self.widget.label_model_path.text() == path def test_clear_information(self): path = "Test_path" self.widget.set_model(self.model, path=path) self.widget.clear_information() assert self.widget.label_model_name.text() == "" assert self.widget.label_model_id.text() == "" assert self.widget.label_number_reactions.text() == "" assert self.widget.label_number_metabolites.text() == "" assert self.widget.label_number_genes.text() == "" assert self.widget.label_model_path.text() == path def test_setting_empty_model(self): path = "Test_path" self.widget.set_model(self.model, path=path) self.widget.set_model(None) assert self.widget.label_model_name.text() == "" assert self.widget.label_model_id.text() == "" assert self.widget.label_number_reactions.text() == "" assert self.widget.label_number_metabolites.text() == "" assert self.widget.label_number_genes.text() == "" assert self.widget.label_model_path.text() == ""
class TestMetaboliteIO: @pytest.fixture(autouse=True) def setup_items(self): self.test_id = "test_id" self.test_name = "test_name" self.test_formula = "H2O" self.test_charge = 0 self.test_compartment = "t" self.metabolite = Metabolite(id=self.test_id, name=self.test_name, formula=self.test_formula, charge=self.test_charge, compartment=self.test_compartment) self.annotation1 = Annotation("chebi", "CHEBI:37671") self.metabolite.annotation.add(self.annotation1) self.model = Model("Test") self.model.add_metabolites([self.metabolite]) self.root = Element("root") def test_setup(self): assert self.metabolite.id == self.test_id assert self.metabolite.name == self.test_name assert self.metabolite.formula == self.test_formula assert self.metabolite.compartment == self.test_compartment assert self.metabolite.charge == self.test_charge assert len(self.model.metabolites) == 1 assert len(self.metabolite.annotation) == 1 assert isinstance(self.metabolite.annotation, set) assert self.annotation1 in self.metabolite.annotation def test_adding_metabolites_to_xml(self): add_metabolites(self.root, self.model) assert len(self.root) == 1 metabolite_list_node = self.root.find(sbml3_listOfSpecies) assert metabolite_list_node is not None assert len(metabolite_list_node) == 1 metabolite = metabolite_list_node.find(sbml3_species) assert metabolite is not None assert metabolite.get(fbc_charge) is None assert metabolite.get("compartment") == self.test_compartment assert metabolite.get(fbc_chemicalFormula) == self.test_formula assert metabolite.get("id") == cobra_metabolite_prefix + self.test_id assert metabolite.get("name") == self.test_name annotation_node = metabolite.find("/".join([sbml3_annotation, rdf_RDF, rdf_description, bqbiol_is, rdf_bag, rdf_li])) assert annotation_node is not None assert annotation_node.get(rdf_resource) == "http://identifiers.org/chebi/CHEBI:37671" def test_addition_of_attributes_only_when_set(self): model = Model("Test") metabolite = Metabolite(id="test") model.add_metabolites([metabolite]) add_metabolites(self.root, model) metabolite_node = self.root.find(sbml3_listOfSpecies+"/"+sbml3_species) assert metabolite_node is not None assert metabolite_node.get(fbc_charge) is None assert metabolite_node.get(fbc_chemicalFormula) is None assert metabolite_node.get("name") is None assert metabolite_node.get("compartment") is None def test_parsing_of_valid_metabolite(self): parent_node = ET.fromstring(valid_metabolite_with_annotation) metabolites = parse_metabolites(parent_node) assert len(metabolites) == 1 metabolite = metabolites[0] assert metabolite.id == "13GLUCAN" assert metabolite.name == "1,3-beta-D-Glucan" assert metabolite.compartment == "c" assert metabolite.formula == "C18H32O16" assert metabolite.charge == 0 assert len(metabolite.annotation) == 3 assert Annotation("inchi", "InChI=1S/C18H32O16/c19-1-4-7(22)10(25)11(26)17(31-4)34-15-9(24)6(3-21)32-18(13(15)28)33-14-8(23)5(2-20)30-16(29)12(14)27/h4-29H,1-3H2/t4-,5-,6-,7-,8-,9-,10+,11-,12-,13-,14+,15+,16-,17+,18+/m1/s1") in metabolite.annotation assert Annotation("chebi", "CHEBI:37671") in metabolite.annotation assert Annotation("kegg.compound", "C00965") in metabolite.annotation def test_parsing_of_valid_metabolite_wo_annotation(self): parent_node = ET.fromstring(valid_metabolite_wo_annotation) metabolites = parse_metabolites(parent_node) assert len(metabolites) == 1 metabolite = metabolites[0] assert metabolite.id == "13GLUCAN" assert metabolite.name == "1,3-beta-D-Glucan" assert metabolite.compartment == "c" assert metabolite.formula == "" assert metabolite.charge == 0 def test_read_write_consistency(self): root = Element("root") add_metabolites(root, self.model) metabolites = parse_metabolites(root) assert len(metabolites) == 1 metabolite = metabolites[0] assert metabolite.id == self.test_id assert metabolite.name == self.test_name assert metabolite.charge == self.test_charge assert metabolite.formula == self.test_formula assert isinstance(metabolite.annotation, set) assert self.annotation1 in metabolite.annotation