Skip to content

Commit ee90f4a

Browse files
BFD-4182: Add more test cases to V3 load tests (#2756)
Co-authored-by: Austin Schey <austin.schey@forpeople.us>
1 parent 68a1252 commit ee90f4a

2 files changed

Lines changed: 229 additions & 2 deletions

File tree

apps/utils/locust_tests/common/db_idr.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,30 @@ def get_regression_bene_sks(uri: str, table_sample_pct=None) -> List[str]:
4343
return [str(r[0]) for r in _execute(uri, bene_query)]
4444

4545

46+
def get_regression_current_part_a_bene_sks(uri: str, table_sample_pct=None) -> List[str]:
47+
"""Retrieves a random list of beneficiary IDs
48+
49+
Args:
50+
uri (str): Database URI
51+
52+
Returns:
53+
List[str]: A list of synthetic beneficiary IDs used for the regression suites
54+
"""
55+
bene_query = "SELECT b. bene_sk FROM idr.beneficiary b join idr.beneficiary_third_party tp on b.bene_sk = tp.bene_sk where b. bene_sk = b. bene_xref_efctv_sk and tp.bene_tp_type_cd = 'A' limit 1000"
56+
return [str(r[0]) for r in _execute(uri, bene_query)]
57+
58+
def get_regression_current_part_b_bene_sks(uri: str, table_sample_pct=None) -> List[str]:
59+
"""Retrieves a random list of beneficiary IDs
60+
61+
Args:
62+
uri (str): Database URI
63+
64+
Returns:
65+
List[str]: A list of synthetic beneficiary IDs used for the regression suites
66+
"""
67+
bene_query = "SELECT b. bene_sk FROM idr.beneficiary b join idr.beneficiary_third_party tp on b.bene_sk = tp.bene_sk where b. bene_sk = b. bene_xref_efctv_sk and tp.bene_tp_type_cd = 'B' limit 1000"
68+
return [str(r[0]) for r in _execute(uri, bene_query)]
69+
4670
def get_regression_bene_mbis(uri: str, table_sample_pct=None) -> List[str]:
4771
"""Retrieves a random list list of MBIs
4872
@@ -54,3 +78,16 @@ def get_regression_bene_mbis(uri: str, table_sample_pct=None) -> List[str]:
5478
"""
5579
bene_query = "SELECT bene_mbi_id FROM idr.beneficiary limit 1000"
5680
return [str(r[0]) for r in _execute(uri, bene_query)]
81+
82+
83+
def get_regression_claim_ids(uri: str, table_sample_pct=None) -> List[str]:
84+
"""Retrieves a random list list of clam Ids
85+
86+
Args:
87+
uri (str): Database URI
88+
89+
Returns:
90+
List[str]: A list of synthetic beneficiary IDs used for the regression suites
91+
"""
92+
claim_query = "SELECT clm_uniq_id from idr.claim limit 1000"
93+
return [str(r[0]) for r in _execute(uri, claim_query)]

apps/utils/locust_tests/v3/regression_suite.py

Lines changed: 192 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@
33
from locust import events, tag, task
44
from locust.env import Environment
55

6+
import logging
7+
68
from common import data, db_idr
79
from common.bfd_user_base import BFDUserBase
810
from common.locust_utils import is_distributed, is_locust_master
911

1012
master_bene_sks: Collection[str] = []
13+
master_bene_sks_part_a: Collection[str] = []
14+
master_bene_sks_part_b: Collection[str] = []
1115
master_bene_mbis: Collection[str] = []
16+
master_claim_ids: Collection[str] = []
1217

1318

1419
@events.test_start.add_listener
@@ -29,13 +34,35 @@ def _(environment: Environment, **kwargs):
2934
data_type_name="bene_ids",
3035
)
3136

37+
global master_bene_sks_part_a
38+
master_bene_sks_part_a = data.load_from_parsed_opts(
39+
environment.parsed_options,
40+
db_idr.get_regression_current_part_a_bene_sks,
41+
data_type_name="bene_ids_part_a",
42+
)
43+
44+
global master_bene_sks_part_b
45+
master_bene_sks_part_b = data.load_from_parsed_opts(
46+
environment.parsed_options,
47+
db_idr.get_regression_current_part_b_bene_sks,
48+
data_type_name="bene_ids_part_b",
49+
)
50+
3251
global master_bene_mbis
3352
master_bene_mbis = data.load_from_parsed_opts(
3453
environment.parsed_options,
3554
db_idr.get_regression_bene_mbis,
3655
data_type_name="bene_mbis",
3756
)
3857

58+
global master_claim_ids
59+
master_claim_ids = data.load_from_parsed_opts(
60+
environment.parsed_options,
61+
db_idr.get_regression_claim_ids,
62+
data_type_name="claim_ids",
63+
)
64+
65+
logger = logging.getLogger(__name__)
3966

4067
class RegressionV3User(BFDUserBase):
4168
"""Regression test suite for V3 BFD Server endpoints.
@@ -47,12 +74,22 @@ class RegressionV3User(BFDUserBase):
4774

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

5280
def __init__(self, *args, **kwargs):
5381
super().__init__(*args, **kwargs)
82+
logger.info(f"Loaded {len(master_bene_sks)} bene_sks.")
83+
logger.info(f"Loaded {len(master_bene_sks_part_a)} bene_sks_part_a.")
84+
logger.info(f"Loaded {len(master_bene_sks_part_b)} bene_sks_part_b.")
85+
logger.info(f"Loaded {len(master_bene_mbis)} bene_mbis.")
86+
logger.info(f"Loaded {len(master_claim_ids)} claim_ids.")
87+
5488
self.bene_sks = itertools.cycle(list(master_bene_sks))
89+
self.bene_sks_part_a = itertools.cycle(list(master_bene_sks_part_a))
90+
self.bene_sks_part_b = itertools.cycle(list(master_bene_sks_part_b))
5591
self.bene_mbis = itertools.cycle(list(master_bene_mbis))
92+
self.claim_ids = itertools.cycle(list(master_claim_ids))
5693

5794
@tag("patient", "patient_read_id")
5895
@task
@@ -114,7 +151,7 @@ def patient_search_mbi_last_updated(self):
114151
"identifier": f"http://hl7.org/fhir/sid/us-mbi|{next(self.bene_mbis)}",
115152
"_format": "application/fhir+json",
116153
}
117-
| self.BENE_LAST_UPDATED,
154+
| self.LAST_UPDATED_FILTER,
118155
name="/v3/fhir/Patient search by mbi with last updated",
119156
)
120157

@@ -129,3 +166,156 @@ def patient_search_mbi_post(self):
129166
},
130167
name="/v3/fhir/Patient search by mbi (POST)",
131168
)
169+
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):
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):
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):
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):
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):
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+
243+
@tag("coverage", "coverage_search_last_updated")
244+
@task
245+
def coverage_search_last_updated(self):
246+
"""Coverage search by beneficiary with _lastUpdated filter."""
247+
self.run_task_by_parameters(
248+
base_path="/v3/fhir/Coverage",
249+
params={
250+
"beneficiary": f"Patient/{next(self.bene_sks)}",
251+
"_format": "application/fhir+json",
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):
263+
"""ExplanationOfBenefit read by its unique claim ID."""
264+
265+
self.run_task_by_parameters(
266+
base_path=f"/v3/fhir/ExplanationOfBenefit/{next(self.claim_ids)}",
267+
params={
268+
"_format": "application/fhir+json"
269+
},
270+
name="/v3/fhir/ExplanationOfBenefit read",
271+
)
272+
273+
274+
@tag("eob", "eob_search_id")
275+
@task
276+
def eob_search_id(self):
277+
"""ExplanationOfBenefit search by its unique claim ID."""
278+
claim_id = next(self.claim_ids)
279+
280+
self.run_task_by_parameters(
281+
base_path="/v3/fhir/ExplanationOfBenefit",
282+
params={"_id": claim_id, "_format": "application/fhir+json"},
283+
name="/v3/fhir/ExplanationOfBenefit search by id",
284+
)
285+
286+
@tag("eob", "eob_search_patient")
287+
@task
288+
def eob_search_patient(self):
289+
"""ExplanationOfBenefit search by patient ID (bene_sk)."""
290+
291+
self.run_task_by_parameters(
292+
base_path="/v3/fhir/ExplanationOfBenefit",
293+
params={"patient": next(self.bene_sks), "_format": "application/fhir+json"},
294+
name="/v3/fhir/ExplanationOfBenefit search by patient",
295+
)
296+
297+
@tag("eob", "eob_search_service_date")
298+
@task
299+
def eob_search_service_date(self):
300+
"""ExplanationOfBenefit search by patient and service-date."""
301+
self.run_task_by_parameters(
302+
base_path="/v3/fhir/ExplanationOfBenefit",
303+
params={
304+
"patient": next(self.bene_sks),
305+
"_format": "application/fhir+json",
306+
} | self.SERVICE_DATE_RANGE,
307+
name="/v3/fhir/ExplanationOfBenefit search by service-date",
308+
)
309+
310+
@tag("eob", "eob_search_last_updated")
311+
@task
312+
def eob_search_last_updated(self):
313+
"""ExplanationOfBenefit search by patient with _lastUpdated."""
314+
self.run_task_by_parameters(
315+
base_path="/v3/fhir/ExplanationOfBenefit",
316+
params={
317+
"patient": next(self.bene_sks),
318+
"_format": "application/fhir+json",
319+
} | self.LAST_UPDATED_FILTER,
320+
name="/v3/fhir/ExplanationOfBenefit search by patient with last updated",
321+
)

0 commit comments

Comments
 (0)