Skip to content

Commit e8670d8

Browse files
merge
2 parents 8939770 + ee90f4a commit e8670d8

2 files changed

Lines changed: 245 additions & 2 deletions

File tree

apps/utils/locust_tests/common/db_idr.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,49 @@ def get_regression_bene_sks(uri: str, table_sample_pct: float | None = None) ->
4141
return [str(r[0]) for r in _execute(uri, bene_query)]
4242

4343

44+
def get_regression_current_part_a_bene_sks(
45+
uri: str,
46+
table_sample_pct: float | None = None, # noqa: ARG001
47+
) -> list[str]:
48+
"""Retrieve a random list of beneficiary IDs.
49+
50+
Args:
51+
uri (str): Database URI
52+
53+
Returns:
54+
List[str]: A list of synthetic beneficiary IDs used for the regression suites
55+
"""
56+
bene_query = """
57+
SELECT b. bene_sk
58+
FROM idr.beneficiary b
59+
join idr.beneficiary_third_party tp on b.bene_sk = tp.bene_sk
60+
where b. bene_sk = b. bene_xref_efctv_sk and tp.bene_tp_type_cd = 'A'
61+
limit 1000
62+
"""
63+
return [str(r[0]) for r in _execute(uri, bene_query)]
64+
65+
66+
def get_regression_current_part_b_bene_sks(
67+
uri: str,
68+
table_sample_pct: float | None = None, # noqa: ARG001
69+
) -> list[str]:
70+
"""Retrieve a random list of beneficiary IDs.
71+
72+
Args:
73+
uri (str): Database URI
74+
75+
Returns:
76+
List[str]: A list of synthetic beneficiary IDs used for the regression suites
77+
"""
78+
bene_query = """
79+
SELECT b. bene_sk
80+
FROM idr.beneficiary b
81+
join idr.beneficiary_third_party tp on b.bene_sk = tp.bene_sk
82+
where b. bene_sk = b. bene_xref_efctv_sk and tp.bene_tp_type_cd = 'B' limit 1000
83+
"""
84+
return [str(r[0]) for r in _execute(uri, bene_query)]
85+
86+
4487
def get_regression_bene_mbis(uri: str, table_sample_pct: float | None = None) -> list[str]: # noqa: ARG001
4588
"""Retrieve a random list list of MBIs.
4689
@@ -52,3 +95,16 @@ def get_regression_bene_mbis(uri: str, table_sample_pct: float | None = None) ->
5295
"""
5396
bene_query = "SELECT bene_mbi_id FROM idr.beneficiary limit 1000"
5497
return [str(r[0]) for r in _execute(uri, bene_query)]
98+
99+
100+
def get_regression_claim_ids(uri: str, table_sample_pct: float | None = None) -> list[str]: # noqa: ARG001
101+
"""Retrieve a random list list of clam Ids.
102+
103+
Args:
104+
uri (str): Database URI
105+
106+
Returns:
107+
List[str]: A list of synthetic beneficiary IDs used for the regression suites
108+
"""
109+
claim_query = "SELECT clm_uniq_id from idr.claim limit 1000"
110+
return [str(r[0]) for r in _execute(uri, claim_query)]

apps/utils/locust_tests/v3/regression_suite.py

Lines changed: 189 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import itertools
2+
import logging
23
from collections.abc import Collection
34
from typing import Any, ClassVar
45

@@ -10,7 +11,10 @@
1011
from common.locust_utils import is_distributed, is_locust_master
1112

1213
master_bene_sks: Collection[str] = []
14+
master_bene_sks_part_a: Collection[str] = []
15+
master_bene_sks_part_b: Collection[str] = []
1316
master_bene_mbis: Collection[str] = []
17+
master_claim_ids: Collection[str] = []
1418

1519

1620
@events.test_start.add_listener
@@ -29,13 +33,37 @@ def _(environment: Environment, **kwargs: dict[str, Any]) -> None: # noqa: ARG0
2933
data_type_name="bene_ids",
3034
)
3135

36+
global master_bene_sks_part_a # noqa: PLW0603
37+
master_bene_sks_part_a = data.load_from_parsed_opts(
38+
environment.parsed_options,
39+
db_idr.get_regression_current_part_a_bene_sks,
40+
data_type_name="bene_ids_part_a",
41+
)
42+
43+
global master_bene_sks_part_b # noqa: PLW0603
44+
master_bene_sks_part_b = data.load_from_parsed_opts(
45+
environment.parsed_options,
46+
db_idr.get_regression_current_part_b_bene_sks,
47+
data_type_name="bene_ids_part_b",
48+
)
49+
3250
global master_bene_mbis # noqa: PLW0603
3351
master_bene_mbis = data.load_from_parsed_opts(
3452
environment.parsed_options,
3553
db_idr.get_regression_bene_mbis,
3654
data_type_name="bene_mbis",
3755
)
3856

57+
global master_claim_ids # noqa: PLW0603
58+
master_claim_ids = data.load_from_parsed_opts(
59+
environment.parsed_options,
60+
db_idr.get_regression_claim_ids,
61+
data_type_name="claim_ids",
62+
)
63+
64+
65+
logger = logging.getLogger(__name__)
66+
3967

4068
class RegressionV3User(BFDUserBase):
4169
"""Regression test suite for V3 BFD Server endpoints.
@@ -47,12 +75,22 @@ class RegressionV3User(BFDUserBase):
4775

4876
# Do we terminate the tests when a test runs out of data and paginated URLs?
4977
END_ON_NO_DATA = False
50-
BENE_LAST_UPDATED: ClassVar = {"_lastUpdated": "gt2020-05-05"}
78+
LAST_UPDATED_FILTER: ClassVar = {"_lastUpdated": "gt2020-05-05"}
79+
SERVICE_DATE_RANGE: ClassVar = {"service-date": "ge2020-01-01"}
5180

5281
def __init__(self, *args: tuple, **kwargs: dict[str, Any]) -> None:
5382
super().__init__(*args, **kwargs)
83+
logger.info("Loaded %s bene_sks.", len(master_bene_sks))
84+
logger.info("Loaded %s bene_sks_part_a.", len(master_bene_sks_part_a))
85+
logger.info("Loaded %s bene_sks_part_b.", len(master_bene_sks_part_b))
86+
logger.info("Loaded %s bene_mbis.", len(master_bene_mbis))
87+
logger.info("Loaded %s claim_ids.", len(master_claim_ids))
88+
5489
self.bene_sks = itertools.cycle(list(master_bene_sks))
90+
self.bene_sks_part_a = itertools.cycle(list(master_bene_sks_part_a))
91+
self.bene_sks_part_b = itertools.cycle(list(master_bene_sks_part_b))
5592
self.bene_mbis = itertools.cycle(list(master_bene_mbis))
93+
self.claim_ids = itertools.cycle(list(master_claim_ids))
5694

5795
@tag("patient", "patient_read_id")
5896
@task
@@ -114,7 +152,7 @@ def patient_search_mbi_last_updated(self) -> None:
114152
"identifier": f"http://hl7.org/fhir/sid/us-mbi|{next(self.bene_mbis)}",
115153
"_format": "application/fhir+json",
116154
}
117-
| self.BENE_LAST_UPDATED,
155+
| self.LAST_UPDATED_FILTER,
118156
name="/v3/fhir/Patient search by mbi with last updated",
119157
)
120158

@@ -129,3 +167,152 @@ def patient_search_mbi_post(self) -> None:
129167
},
130168
name="/v3/fhir/Patient search by mbi (POST)",
131169
)
170+
171+
# ==========================================================
172+
# Coverage Endpoint Tests
173+
# ==========================================================
174+
175+
@tag("coverage", "coverage_read_id_part_a")
176+
@task
177+
def coverage_read_id_part_a(self) -> None:
178+
"""Coverage read by composite ID for Part A."""
179+
coverage_id = f"part-a-{next(self.bene_sks_part_a)}"
180+
181+
self.run_task_by_parameters(
182+
base_path=f"/v3/fhir/Coverage/{coverage_id}",
183+
params={
184+
"_format": "application/fhir+json",
185+
},
186+
name="/v3/fhir/Coverage read part A",
187+
)
188+
189+
@tag("coverage", "coverage_read_id_part_b")
190+
@task
191+
def coverage_read_id_part_b(self) -> None:
192+
"""Coverage read by composite ID for Part B."""
193+
coverage_id = f"part-b-{next(self.bene_sks_part_b)}"
194+
195+
self.run_task_by_parameters(
196+
base_path=f"/v3/fhir/Coverage/{coverage_id}",
197+
params={
198+
"_format": "application/fhir+json",
199+
},
200+
name="/v3/fhir/Coverage read Part B",
201+
)
202+
203+
@tag("coverage", "coverage_search_id")
204+
@task
205+
def coverage_search_id_part_b(self) -> None:
206+
"""Coverage search by composite ID for Part B."""
207+
bene_sk = next(self.bene_sks)
208+
coverage_id = f"part-b-{bene_sk}"
209+
self.run_task_by_parameters(
210+
base_path="/v3/fhir/Coverage",
211+
params={
212+
"_id": coverage_id,
213+
"_format": "application/fhir+json",
214+
},
215+
name="/v3/fhir/Coverage search by id",
216+
)
217+
218+
@tag("coverage", "coverage_search_beneficiary")
219+
@task
220+
def coverage_search_by_beneficiary(self) -> None:
221+
"""Coverage search by beneficiary ID."""
222+
self.run_task_by_parameters(
223+
base_path="/v3/fhir/Coverage",
224+
params={
225+
"beneficiary": f"Patient/{next(self.bene_sks)}",
226+
"_format": "application/fhir+json",
227+
},
228+
name="/v3/fhir/Coverage search by beneficiary",
229+
)
230+
231+
@tag("coverage", "coverage_search_beneficiary_post")
232+
@task
233+
def coverage_search_by_beneficiary_post(self) -> None:
234+
self.run_task_by_parameters(
235+
base_path="/v3/fhir/Coverage/_search",
236+
body={
237+
"beneficiary": f"Patient/{next(self.bene_sks)}",
238+
},
239+
name="/v3/fhir/Coverage search by beneficiary (POST)",
240+
)
241+
242+
@tag("coverage", "coverage_search_last_updated")
243+
@task
244+
def coverage_search_last_updated(self) -> None:
245+
"""Coverage search by beneficiary with _lastUpdated filter."""
246+
self.run_task_by_parameters(
247+
base_path="/v3/fhir/Coverage",
248+
params={
249+
"beneficiary": f"Patient/{next(self.bene_sks)}",
250+
"_format": "application/fhir+json",
251+
}
252+
| self.LAST_UPDATED_FILTER,
253+
name="/v3/fhir/Coverage search by beneficiary with last updated",
254+
)
255+
256+
# ==========================================================
257+
# ExplanationOfBenefit (EOB) Endpoint Tests
258+
# ==========================================================
259+
260+
@tag("eob", "eob_read")
261+
@task
262+
def eob_read(self) -> None:
263+
"""ExplanationOfBenefit read by its unique claim ID."""
264+
self.run_task_by_parameters(
265+
base_path=f"/v3/fhir/ExplanationOfBenefit/{next(self.claim_ids)}",
266+
params={"_format": "application/fhir+json"},
267+
name="/v3/fhir/ExplanationOfBenefit read",
268+
)
269+
270+
@tag("eob", "eob_search_id")
271+
@task
272+
def eob_search_id(self) -> None:
273+
"""ExplanationOfBenefit search by its unique claim ID."""
274+
claim_id = next(self.claim_ids)
275+
276+
self.run_task_by_parameters(
277+
base_path="/v3/fhir/ExplanationOfBenefit",
278+
params={"_id": claim_id, "_format": "application/fhir+json"},
279+
name="/v3/fhir/ExplanationOfBenefit search by id",
280+
)
281+
282+
@tag("eob", "eob_search_patient")
283+
@task
284+
def eob_search_patient(self) -> None:
285+
"""ExplanationOfBenefit search by patient ID (bene_sk)."""
286+
self.run_task_by_parameters(
287+
base_path="/v3/fhir/ExplanationOfBenefit",
288+
params={"patient": next(self.bene_sks), "_format": "application/fhir+json"},
289+
name="/v3/fhir/ExplanationOfBenefit search by patient",
290+
)
291+
292+
@tag("eob", "eob_search_service_date")
293+
@task
294+
def eob_search_service_date(self) -> None:
295+
"""ExplanationOfBenefit search by patient and service-date."""
296+
self.run_task_by_parameters(
297+
base_path="/v3/fhir/ExplanationOfBenefit",
298+
params={
299+
"patient": next(self.bene_sks),
300+
"_format": "application/fhir+json",
301+
}
302+
| self.SERVICE_DATE_RANGE,
303+
name="/v3/fhir/ExplanationOfBenefit search by service-date",
304+
)
305+
306+
@tag("eob", "eob_search_last_updated")
307+
@task
308+
def eob_search_last_updated(self) -> None:
309+
"""ExplanationOfBenefit search by patient with _lastUpdated."""
310+
self.run_task_by_parameters(
311+
base_path="/v3/fhir/ExplanationOfBenefit",
312+
params={
313+
"patient": next(self.bene_sks),
314+
"_format": "application/fhir+json",
315+
}
316+
| self.LAST_UPDATED_FILTER,
317+
name="/v3/fhir/ExplanationOfBenefit search by patient with last updated",
318+
)

0 commit comments

Comments
 (0)