Skip to content

Commit a76a984

Browse files
committed
tests: adopted to exclude criterion combination
1 parent 71c7978 commit a76a984

14 files changed

+370
-656
lines changed

tests/_fixtures/omop_fixture.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,15 @@ def celida_recommendation(
177177
recommendation_id=recommendation_id,
178178
pi_pair_url="https://example.com",
179179
pi_pair_name="my_pair",
180-
pi_pair_hash=hash("my_pair"),
180+
pi_pair_hash=str(hash("my_pair")),
181181
)
182182
db_session.add(pi_pair)
183183
db_session.commit()
184184

185185
criterion = Criterion(
186186
criterion_id=criterion_id,
187187
criterion_description="my_description",
188-
criterion_hash=hash("my_criterion"),
188+
criterion_hash=str(hash("my_criterion")),
189189
)
190190
db_session.add(criterion)
191191
db_session.commit()

tests/execution_engine/converter/action/test_drug_administration.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ def test_multiple_doses(self):
6464
],
6565
)
6666

67-
comb = action.to_expression()
68-
criteria = list(comb)
67+
expr = action.to_expression()
68+
criteria = list(expr.args)
6969

7070
assert len(criteria) == 3
7171
assert all(isinstance(c, DrugExposure) for c in criteria)

tests/execution_engine/omop/cohort/test_cohort_recommendation.py

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
import pytest
22

3-
from execution_engine.omop.cohort import PopulationInterventionPair
3+
from execution_engine.omop.cohort import PopulationInterventionPairExpr
44
from execution_engine.omop.cohort.recommendation import Recommendation
55
from execution_engine.omop.concepts import Concept
66
from execution_engine.omop.criterion.visit_occurrence import ActivePatients
7+
from execution_engine.util import logic
78
from tests.mocks.criterion import MockCriterion
89

910

1011
class TestRecommendation:
1112

1213
def test_serialization(self):
1314
# Register the mock criterion class
14-
from execution_engine.omop.criterion import factory
15-
16-
factory.register_criterion_class("MockCriterion", MockCriterion)
1715

1816
original = Recommendation(
19-
pi_pairs=[],
17+
expr=logic.BooleanFunction(),
2018
base_criterion=MockCriterion("c"),
2119
name="foo",
2220
title="bar",
@@ -47,7 +45,7 @@ def test_serialization_with_active_patients(self, concept):
4745
# specifically because there used to be a problem with the
4846
# serialization of that combination.
4947
original = Recommendation(
50-
pi_pairs=[],
48+
expr=logic.BooleanFunction(),
5149
base_criterion=ActivePatients(),
5250
name="foo",
5351
title="bar",
@@ -60,11 +58,12 @@ def test_serialization_with_active_patients(self, concept):
6058
deserialized = Recommendation.from_json(json)
6159
assert original == deserialized
6260

63-
def test_database_serialization(self, concept):
61+
def test_database_serialization(
62+
self,
63+
concept,
64+
db_session, # use_db_session fixture for a proper database clean up after this test
65+
):
6466
from execution_engine.execution_engine import ExecutionEngine
65-
from execution_engine.omop.criterion.factory import register_criterion_class
66-
67-
register_criterion_class("MockCriterion", MockCriterion)
6867

6968
e = ExecutionEngine(verbose=False)
7069

@@ -74,18 +73,18 @@ def test_database_serialization(self, concept):
7473
population_criterion = MockCriterion("p")
7574
intervention_criterion = MockCriterion("i)")
7675

77-
pi_pair = PopulationInterventionPair(
76+
pi_pair = PopulationInterventionPairExpr(
77+
population_expr=population_criterion,
78+
intervention_expr=intervention_criterion,
7879
name="foo",
7980
url="foo",
8081
base_criterion=base_criterion,
81-
population=population_criterion,
82-
intervention=intervention_criterion,
8382
)
8483

8584
pi_pairs = [pi_pair]
8685

8786
recommendation = Recommendation(
88-
pi_pairs=pi_pairs,
87+
expr=pi_pair,
8988
base_criterion=ActivePatients(),
9089
name="foo",
9190
title="bar",
@@ -105,33 +104,33 @@ def test_database_serialization(self, concept):
105104
with pytest.raises(ValueError, match=r"Database ID has not been set yet!"):
106105
assert pi_pair.id is None
107106

108-
for criterion in pi_pair.flatten():
109-
with pytest.raises(
110-
ValueError, match=r"Database ID has not been set yet!"
111-
):
112-
assert criterion.id is None
107+
for criterion in recommendation.atoms():
108+
with pytest.raises(ValueError, match=r"Database ID has not been set yet!"):
109+
assert criterion.id is None
113110

114111
e.register_recommendation(recommendation)
115112

116113
assert recommendation.id is not None
117114
assert recommendation.base_criterion.id is not None
115+
118116
for pi_pair in recommendation.population_intervention_pairs():
119117
assert pi_pair.id is not None
120-
for criterion in pi_pair.flatten():
121-
assert criterion.id is not None
118+
119+
for criterion in recommendation.atoms():
120+
assert criterion.id is not None
122121

123122
rec_loaded = e.load_recommendation_from_database(url)
124123

125124
assert recommendation == rec_loaded
126125
assert rec_loaded.id == recommendation.id
127-
assert len(rec_loaded._pi_pairs) == len(pi_pairs)
126+
assert len(list(rec_loaded.population_intervention_pairs())) == 1
128127

129-
for pi_pair_loaded, pi_pair in zip(rec_loaded._pi_pairs, pi_pairs):
128+
for pi_pair_loaded, pi_pair in zip(
129+
list(rec_loaded.population_intervention_pairs()), pi_pairs
130+
):
130131
assert pi_pair_loaded.id == pi_pair.id
131132

132-
assert len(pi_pair_loaded.flatten()) == len(pi_pair.flatten())
133-
134-
for criterion_loaded, criterion in zip(
135-
pi_pair_loaded.flatten(), pi_pair.flatten()
136-
):
137-
assert criterion.id == criterion_loaded.id
133+
for criterion_loaded, criterion in zip(
134+
rec_loaded.atoms(), recommendation.atoms()
135+
):
136+
assert criterion.id == criterion_loaded.id
Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
from execution_engine.omop.cohort.population_intervention_pair import (
2-
PopulationInterventionPair,
2+
PopulationInterventionPairExpr,
33
)
4+
from execution_engine.util import logic
45
from tests.mocks.criterion import MockCriterion
56

67

78
class TestPopulationInterventionPair:
89

910
def test_serialization(self):
1011
# Register the mock criterion class
11-
from execution_engine.omop.criterion import factory
12-
13-
factory.register_criterion_class("MockCriterion", MockCriterion)
14-
15-
original = PopulationInterventionPair(
16-
name="foo", url="bar", base_criterion=MockCriterion("c")
12+
original = PopulationInterventionPairExpr(
13+
population_expr=logic.NonSimplifiableAnd(MockCriterion("population")),
14+
intervention_expr=logic.NonSimplifiableAnd(MockCriterion("intervention")),
15+
name="foo",
16+
url="bar",
17+
base_criterion=MockCriterion("base"),
1718
)
1819

1920
json = original.json()
20-
deserialized = PopulationInterventionPair.from_json(json)
21+
deserialized = PopulationInterventionPairExpr.from_json(json)
2122
assert original == deserialized
Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +0,0 @@
1-
from typing import Any, Dict, Self
2-
3-
from sqlalchemy import Select, select
4-
5-
from execution_engine.omop.criterion.abstract import (
6-
Criterion,
7-
column_interval_type,
8-
observation_end_datetime,
9-
observation_start_datetime,
10-
)
11-
from execution_engine.util.interval import IntervalType
12-
13-
14-
class NoopCriterion(Criterion):
15-
"""
16-
Select patients who are post-surgical in the timeframe between the day of the surgery and 6 days after the surgery.
17-
"""
18-
19-
_static = True
20-
21-
def _create_query(self) -> Select:
22-
"""
23-
Get the SQL Select query for data required by this criterion.
24-
"""
25-
subquery = self.base_query().subquery()
26-
27-
query = select(
28-
subquery.c.person_id,
29-
column_interval_type(IntervalType.POSITIVE),
30-
observation_start_datetime.label("interval_start"),
31-
observation_end_datetime.label("interval_end"),
32-
)
33-
34-
query = self._filter_base_persons(query, c_person_id=subquery.c.person_id)
35-
query = self._filter_datetime(query)
36-
37-
return query
38-
39-
@classmethod
40-
def from_dict(cls, data: Dict[str, Any]) -> Self:
41-
"""
42-
Create an object from a dictionary.
43-
"""
44-
return cls()
45-
46-
def description(self) -> str:
47-
"""
48-
Get a description of the criterion.
49-
"""
50-
return self.__class__.__name__
51-
52-
def dict(self) -> dict:
53-
"""
54-
Get a dictionary representation of the object.
55-
"""
56-
return {}

0 commit comments

Comments
 (0)