from django.test import TestCase from epdb.logic import PackageManager from epdb.models import Compound, User, Reaction, Rule class ReactionTest(TestCase): fixtures = ["test_fixtures.jsonl.gz"] @classmethod def setUpClass(cls): super(ReactionTest, cls).setUpClass() cls.user = User.objects.get(username="anonymous") cls.package = PackageManager.create_package(cls.user, "Anon Test Package", "No Desc") def test_smoke(self): educt = Compound.create( self.package, smiles="C(CCl)Cl", name="1,2-Dichloroethane", description="Eawag BBD compound c0001", ).default_structure product = Compound.create( self.package, smiles="C(CO)Cl", name="2-Chloroethanol", description="Eawag BBD compound c0005", ).default_structure r = Reaction.create( package=self.package, name="Eawag BBD reaction r0001", educts=[educt], products=[product], multi_step=False, ) self.assertEqual(r.smirks(), "C(CCl)Cl>>C(CO)Cl") self.assertEqual(r.name, "Eawag BBD reaction r0001") self.assertEqual(r.description, "no description") def test_string_educts_and_products(self): r = Reaction.create( package=self.package, name="Eawag BBD reaction r0001", educts=["C(CCl)Cl"], products=["C(CO)Cl"], multi_step=False, ) self.assertEqual(r.smirks(), "C(CCl)Cl>>C(CO)Cl") def test_missing_smiles(self): educt = Compound.create( self.package, smiles="C(CCl)Cl", name="1,2-Dichloroethane", description="Eawag BBD compound c0001", ).default_structure product = Compound.create( self.package, smiles="C(CO)Cl", name="2-Chloroethanol", description="Eawag BBD compound c0005", ).default_structure with self.assertRaises(ValueError): _ = Reaction.create( package=self.package, name="Eawag BBD reaction r0001", educts=[educt], products=[], multi_step=False, ) with self.assertRaises(ValueError): _ = Reaction.create( package=self.package, name="Eawag BBD reaction r0001", educts=[], products=[product], multi_step=False, ) with self.assertRaises(ValueError): _ = Reaction.create( package=self.package, name="Eawag BBD reaction r0001", educts=[], products=[], multi_step=False, ) def test_empty_name_and_description_are_ignored(self): r = Reaction.create( package=self.package, name="", description="", educts=["C(CCl)Cl"], products=["C(CO)Cl"], multi_step=False, ) self.assertEqual(r.name, "no name") self.assertEqual(r.description, "no description") def test_deduplication(self): rule = Rule.create( package=self.package, rule_type="SimpleAmbitRule", name="bt0022-2833", description="Dihalomethyl derivative + Halomethyl derivative > 1-Halo-1-methylalcohol derivative + 1-Methylalcohol derivative", smirks="[H:5][C:1]([#6:6])([#1,#9,#17,#35,#53:4])[#9,#17,#35,#53]>>[H:5][C:1]([#6:6])([#8])[#1,#9,#17,#35,#53:4]", ) r1 = Reaction.create( package=self.package, name="Eawag BBD reaction r0001", educts=["C(CCl)Cl"], products=["C(CO)Cl"], rules=[rule], multi_step=False, ) r2 = Reaction.create( package=self.package, name="Eawag BBD reaction r0001", educts=["C(CCl)Cl"], products=["C(CO)Cl"], rules=[rule], multi_step=False, ) # Check if create detects that this Compound already exist # In this case the existing object should be returned self.assertEqual(r1.pk, r2.pk) self.assertEqual(len(self.package.reactions), 1) def test_deduplication_without_rules(self): r1 = Reaction.create( package=self.package, name="Eawag BBD reaction r0001", educts=["C(CCl)Cl"], products=["C(CO)Cl"], multi_step=False, ) r2 = Reaction.create( package=self.package, name="Eawag BBD reaction r0001", educts=["C(CCl)Cl"], products=["C(CO)Cl"], multi_step=False, ) # Check if create detects that this Compound already exist # In this case the existing object should be returned self.assertEqual(r1.pk, r2.pk) self.assertEqual(len(self.package.reactions), 1) def test_wrong_smiles(self): with self.assertRaises(ValueError): _ = Reaction.create( package=self.package, name="Eawag BBD reaction r0001", educts=["ASDF"], products=["C(CO)Cl"], multi_step=False, ) def test_delete(self): r = Reaction.create( package=self.package, name="Eawag BBD reaction r0001", educts=["C(CCl)Cl"], products=["C(CO)Cl"], multi_step=False, ) r.delete() self.assertEqual(Reaction.objects.filter(package=self.package).count(), 0)