Skip to content

Commit 1b1b296

Browse files
committed
Refactored subject selection builder to reduce cognitive complexity
- Extracted `_preprocess_criteria()` and `_dispatch_criteria_key()` from `_add_variable_selection_criteria` - Removed duplicated preprocessing logic after extraction - Added descriptive docstrings for both new helper methods - Wrote pytest coverage for criteria dispatch and preprocessing paths - Brought method below SonarQube cognitive complexity threshold
1 parent 0d84fa9 commit 1b1b296

File tree

2 files changed

+513
-484
lines changed

2 files changed

+513
-484
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import pytest
2+
from utils.oracle.subject_selection_query_builder import (
3+
SubjectSelectionQueryBuilder,
4+
SubjectSelectionCriteriaKey,
5+
)
6+
from classes.subject import Subject
7+
from classes.user import User
8+
9+
10+
@pytest.fixture
11+
def builder():
12+
return SubjectSelectionQueryBuilder()
13+
14+
15+
@pytest.fixture
16+
def dummy_subject():
17+
subject = Subject()
18+
subject.screening_status_change_date = None
19+
subject.date_of_death = None
20+
return subject
21+
22+
23+
@pytest.fixture
24+
def dummy_user():
25+
return User()
26+
27+
28+
def test_add_criteria_subject_age_y_d(builder, dummy_user, dummy_subject):
29+
# This format triggers the 'y/d' logic branch
30+
criteria = {"subject age (y/d)": "60/0"}
31+
32+
builder._add_variable_selection_criteria(criteria, dummy_user, dummy_subject)
33+
where_clause = " ".join(builder.sql_where)
34+
35+
assert "c.date_of_birth" in where_clause
36+
assert "ADD_MONTHS(TRUNC(TRUNC(SYSDATE))" in where_clause
37+
38+
39+
def test_add_criteria_subject_hub_code_with_enum(builder, dummy_user, dummy_subject):
40+
criteria = {"subject hub code": "user organisation"}
41+
builder._add_variable_selection_criteria(criteria, dummy_user, dummy_subject)
42+
sql = " ".join(builder.sql_where)
43+
assert "c.hub_id" in sql
44+
assert "SELECT hub.org_id" in sql
45+
46+
47+
def test_invalid_criteria_key_raises_exception(builder, dummy_user, dummy_subject):
48+
criteria = {"invalid key": "value"}
49+
with pytest.raises(Exception):
50+
builder._add_variable_selection_criteria(criteria, dummy_user, dummy_subject)
51+
52+
53+
def test_preprocess_commented_criterion_skips_processing(builder, dummy_subject):
54+
result = builder._preprocess_criteria(
55+
"subject age", "#this is ignored", dummy_subject
56+
)
57+
assert result is False
58+
59+
60+
def test_dispatch_known_key_executes(builder, dummy_user, dummy_subject):
61+
# Arrange
62+
builder.criteria_key = SubjectSelectionCriteriaKey.SUBJECT_AGE
63+
builder.criteria_value = "60"
64+
builder.criteria_comparator = " = "
65+
builder.criteria_key_name = "subject age"
66+
67+
# Act
68+
builder._dispatch_criteria_key(dummy_user, dummy_subject)
69+
70+
# Assert
71+
where_clause = " ".join(builder.sql_where)
72+
assert "c.date_of_birth" in where_clause
73+
assert "FLOOR(MONTHS_BETWEEN(TRUNC(SYSDATE), c.date_of_birth)/12)" in where_clause

0 commit comments

Comments
 (0)