forked from enviPath/enviPy
96 lines
3.5 KiB
Python
96 lines
3.5 KiB
Python
from django.conf import settings as s
|
|
from django.test import TestCase, override_settings
|
|
|
|
from epdb.logic import PackageManager
|
|
from epdb.models import Pathway, User
|
|
|
|
Package = s.GET_PACKAGE_MODEL()
|
|
|
|
|
|
@override_settings(MODEL_DIR=s.FIXTURE_DIRS[0] / "models", CELERY_TASK_ALWAYS_EAGER=True)
|
|
class MultiGenTest(TestCase):
|
|
fixtures = ["test_fixtures_incl_model.jsonl.gz"]
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(MultiGenTest, cls).setUpClass()
|
|
cls.user: "User" = User.objects.get(username="anonymous")
|
|
cls.package: "Package" = PackageManager.create_package(
|
|
cls.user, "Anon Test Package", "No Desc"
|
|
)
|
|
cls.BBD_SUBSET: "Package" = Package.objects.get(name="Fixtures")
|
|
# 1,1,1-Trichloroethane (an/aerobic)
|
|
cls.PW_WITH_INTERMEDIATE_NAME = "1,1,1-Trichloroethane (an/aerobic)"
|
|
cls.PW_WITHOUT_INTERMEDIATE_NAME = "Caffeine"
|
|
|
|
def test_engineer_pathway(self):
|
|
from epdb.tasks import engineer_pathways
|
|
|
|
pw_to_engineer = Pathway.objects.get(name=self.PW_WITH_INTERMEDIATE_NAME)
|
|
engineered, predicted = engineer_pathways(
|
|
[pw_to_engineer.pk], self.user.prediction_settings().pk, self.package.pk
|
|
)
|
|
|
|
self.assertEqual(len(engineered), 1)
|
|
self.assertEqual(len(predicted), 1)
|
|
eng_pw = Pathway.objects.get(url=engineered[0])
|
|
|
|
for n in eng_pw.nodes:
|
|
if n.kv.get("is_engineered_intermediate"):
|
|
self.assertEqual(n.default_node_label.smiles, "CCO")
|
|
|
|
pw_to_engineer = Pathway.objects.get(name=self.PW_WITHOUT_INTERMEDIATE_NAME)
|
|
engineered, predicted = engineer_pathways(
|
|
[pw_to_engineer.pk], self.user.prediction_settings().pk, self.package.pk
|
|
)
|
|
|
|
self.assertEqual(len(engineered), 0)
|
|
self.assertEqual(len(predicted), 0)
|
|
|
|
# Test pathway deduplication in eng pathway process
|
|
pw1 = Pathway.objects.get(name=self.PW_WITH_INTERMEDIATE_NAME)
|
|
|
|
# Add pw1 twice
|
|
engineered, predicted = engineer_pathways(
|
|
[pw1.pk, pw1.pk], self.user.prediction_settings().pk, self.package.pk
|
|
)
|
|
|
|
self.assertEqual(len(engineered), 1)
|
|
self.assertEqual(len(predicted), 1)
|
|
|
|
# Check that both pathways contain the intermediate
|
|
num_intermediates_found = 0
|
|
for eng in engineered:
|
|
eng_pw = Pathway.objects.get(url=eng)
|
|
|
|
for n in eng_pw.nodes:
|
|
if n.kv.get("is_engineered_intermediate"):
|
|
self.assertEqual(n.default_node_label.smiles, "CCO")
|
|
num_intermediates_found += 1
|
|
|
|
self.assertEqual(num_intermediates_found, 1)
|
|
|
|
# Get a copy to have two pathways with potential intermediates as the fixture
|
|
# only contains one
|
|
mapping = {}
|
|
pw2 = pw1.copy(self.package, mapping=mapping)
|
|
|
|
engineered, predicted = engineer_pathways(
|
|
[pw1.pk, pw2.pk], self.user.prediction_settings().pk, self.package.pk
|
|
)
|
|
|
|
self.assertEqual(len(engineered), 2)
|
|
self.assertEqual(len(predicted), 2)
|
|
|
|
# Check that both pathways contain the intermediate
|
|
num_intermediates_found = 0
|
|
for eng in engineered:
|
|
eng_pw = Pathway.objects.get(url=eng)
|
|
|
|
for n in eng_pw.nodes:
|
|
if n.kv.get("is_engineered_intermediate"):
|
|
self.assertEqual(n.default_node_label.smiles, "CCO")
|
|
num_intermediates_found += 1
|
|
|
|
self.assertEqual(num_intermediates_found, 2)
|