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): r = 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)