from django.test import TestCase from epdb.logic import PackageManager from epdb.models import Rule, User class RuleTest(TestCase): fixtures = ["test_fixtures.jsonl.gz"] @classmethod def setUpClass(cls): super(RuleTest, 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): r = Rule.create( rule_type="SimpleAmbitRule", package=self.package, 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]", ) self.assertEqual( r.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]", ) self.assertEqual(r.name, "bt0022-2833") self.assertEqual( r.description, "Dihalomethyl derivative + Halomethyl derivative > 1-Halo-1-methylalcohol derivative + 1-Methylalcohol derivative", ) def test_smirks_are_trimmed(self): r = Rule.create( rule_type="SimpleAmbitRule", package=self.package, 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] ", ) self.assertEqual( r.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]", ) def test_name_and_description_optional(self): r = Rule.create( rule_type="SimpleAmbitRule", package=self.package, 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]", ) self.assertRegex(r.name, "Rule \\d+") self.assertEqual(r.description, "no description") def test_empty_name_and_description_are_ignored(self): r = Rule.create( rule_type="SimpleAmbitRule", package=self.package, 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]", name="", description="", ) self.assertRegex(r.name, "Rule \\d+") self.assertEqual(r.description, "no description") def test_deduplication(self): r1 = Rule.create( rule_type="SimpleAmbitRule", package=self.package, 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]", name="", description="", ) r2 = Rule.create( rule_type="SimpleAmbitRule", package=self.package, 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]", name="", description="", ) self.assertEqual(r1.pk, r2.pk) self.assertEqual(len(self.package.rules), 1) def test_valid_smirks(self): with self.assertRaises(ValueError): Rule.create( rule_type="SimpleAmbitRule", package=self.package, smirks="This is not a valid SMIRKS", name="", description="", ) def test_delete(self): r = Rule.create( rule_type="SimpleAmbitRule", package=self.package, 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]", name="", description="", ) r.delete() self.assertEqual(Rule.objects.filter(package=self.package).count(), 0)