11import itertools
2+ import logging
23from collections .abc import Collection
34from typing import Any , ClassVar
45
1011from common .locust_utils import is_distributed , is_locust_master
1112
1213master_bene_sks : Collection [str ] = []
14+ master_bene_sks_part_a : Collection [str ] = []
15+ master_bene_sks_part_b : Collection [str ] = []
1316master_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
4068class 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