async def test_fhir_client_patient_list_auth_fail_retry_async() -> None: test_name = "test_fhir_client_patient_list_auth_fail_retry_async" mock_server_url = "http://mock-server:1080" mock_client: MockServerFriendlyClient = MockServerFriendlyClient( base_url=mock_server_url ) relative_url: str = test_name absolute_url: str = mock_server_url + "/" + test_name mock_client.clear(f"/{test_name}/*.*") mock_client.reset() mock_client.expect( mock_request(path=f"/{relative_url}/Patient", method="GET"), mock_response(code=401), timing=times(1), ) auth_response_text = { "access_token": "my_access_token", "expires_in": 86400, "token_type": "Bearer", } mock_client.expect( mock_request(path=f"/{relative_url}/auth", method="POST"), mock_response(code=200, body=auth_response_text), timing=times(1), ) response_text: str = json.dumps({"resourceType": "Patient", "id": "12355"}) mock_client.expect( mock_request(path=f"/{relative_url}/Patient", method="GET"), mock_response(body=response_text), timing=times(1), ) fhir_client = FhirClient() fhir_client = fhir_client.url(absolute_url).resource("Patient") fhir_client = fhir_client.client_credentials( client_id="client_id", client_secret="client_secret" ) fhir_client = fhir_client.auth_server_url(absolute_url + "/" + "auth").auth_scopes( ["user/*.ready"] ) response: FhirGetResponse = await fhir_client.get_async() print(response.responses) assert response.responses == response_text
def test_fhir_client_patient_merge() -> None: test_name = "test_fhir_client_patient_merge" mock_server_url = "http://mock-server:1080" mock_client: MockServerFriendlyClient = MockServerFriendlyClient( base_url=mock_server_url) relative_url: str = test_name absolute_url: str = mock_server_url + "/" + test_name mock_client.clear(f"/{test_name}/*.*") mock_client.reset() response_text_1: List[Dict[str, int]] = [{"created": 1, "updated": 0}] resource = {"resourceType": "Patient", "id": "12355"} # request_body = {"resourceType": "Bundle", "entry": [{"resource": resource}]} mock_client.expect( mock_request( path=f"/{relative_url}/Patient/1/$merge", method="POST", body=json.dumps([resource]), ), mock_response(body=json.dumps(response_text_1)), timing=times(1), ) fhir_client = FhirClient() fhir_client = fhir_client.url(absolute_url).resource("Patient") response: FhirMergeResponse = fhir_client.merge([json.dumps(resource)]) print(response.responses) assert response.responses == response_text_1
async def test_fhir_client_patient_list_async() -> None: test_name = "test_fhir_client_patient_list_async" mock_server_url = "http://mock-server:1080" mock_client: MockServerFriendlyClient = MockServerFriendlyClient( base_url=mock_server_url) relative_url: str = test_name absolute_url: str = mock_server_url + "/" + test_name mock_client.clear(f"/{test_name}/*.*") mock_client.reset() response_text: str = json.dumps({"resourceType": "Patient", "id": "12355"}) mock_client.expect( mock_request(path=f"/{relative_url}/Patient", method="GET"), mock_response(body=response_text), timing=times(1), ) fhir_client = FhirClient() fhir_client = fhir_client.url(absolute_url).resource("Patient") response: FhirGetResponse = await fhir_client.get_async() print(response.responses) assert response.responses == response_text
async def test_fhir_client_patient_list_auth_fail_async() -> None: test_name = "test_fhir_client_patient_list_auth_fail_async" mock_server_url = "http://mock-server:1080" mock_client: MockServerFriendlyClient = MockServerFriendlyClient( base_url=mock_server_url) relative_url: str = test_name absolute_url: str = mock_server_url + "/" + test_name mock_client.clear(f"/{test_name}/*.*") mock_client.reset() mock_client.expect( mock_request(path=f"/{relative_url}/Patient", method="GET"), mock_response(code=403), timing=times(1), ) fhir_client = FhirClient() fhir_client = fhir_client.url(absolute_url).resource("Patient") response: FhirGetResponse = await fhir_client.get_async() print(response.responses) assert response.error == "403"
async def test_async_fhir_client_patient_by_identifier_missing_true() -> None: # Arrange test_name = "test_fhir_client_patient_by_id_async" mock_server_url = "http://mock-server:1080" mock_client: MockServerFriendlyClient = MockServerFriendlyClient( base_url=mock_server_url) relative_url: str = test_name absolute_url: str = mock_server_url + "/" + test_name mock_client.clear(f"/{test_name}/*") mock_client.reset() response_text: str = json.dumps({"resourceType": "Patient", "id": "12355"}) mock_client.expect( mock_request( path=f"/{relative_url}/Patient", method="GET", querystring={"identifier:missing": "true"}, ), mock_response(body=response_text), timing=times(1), ) # Act fhir_client = FhirClient() fhir_client = (fhir_client.url(absolute_url).resource("Patient").filter( [PropertyMissingFilter(property_="identifier", missing=True)])) response: FhirGetResponse = await fhir_client.get_async() # Assert print(response.responses) assert response.responses == response_text
async def test_fhir_client_patient_delete_async() -> None: test_name = "test_fhir_client_patient_delete_async" mock_server_url = "http://mock-server:1080" mock_client: MockServerFriendlyClient = MockServerFriendlyClient( base_url=mock_server_url) relative_url: str = test_name absolute_url: str = mock_server_url + "/" + test_name mock_client.clear(f"/{test_name}/*.*") mock_client.reset() mock_client.expect( mock_request(path=f"/{relative_url}/Patient/12345", method="DELETE"), mock_response(code=204), timing=times(1), ) # Act fhir_client = FhirClient() fhir_client = fhir_client.url(absolute_url).resource("Patient").id_( "12345") response: FhirDeleteResponse = await fhir_client.delete_async() # Assert assert response.status == 204
async def test_fhir_graph_async() -> None: test_name = "test_fhir_graph_async" mock_server_url = "http://mock-server:1080" mock_client: MockServerFriendlyClient = MockServerFriendlyClient( base_url=mock_server_url) relative_url: str = test_name absolute_url: str = mock_server_url + "/" + test_name mock_client.clear(f"/{test_name}/*.*") mock_client.reset() response_text = {"resourceType": "Patient", "id": "12355"} graph_definition = GraphDefinition( id_="123", name="my_everything", start="Patient", link=[ GraphDefinitionLink(target=[ GraphDefinitionTarget(type_="Location", params="managingOrganization={ref}") ]), GraphDefinitionLink(target=[ GraphDefinitionTarget( type_="HealthcareService", params="providedBy={ref}", link=[ GraphDefinitionLink(target=[ GraphDefinitionTarget(type_="Schedule", params="actor={ref}") ]) ], ) ]), ], ) mock_client.expect( mock_request(path=f"/{relative_url}/Patient/1/$graph", method="POST"), mock_response(body=response_text), timing=times(1), ) fhir_client = FhirClient() fhir_client = fhir_client.url(absolute_url).resource("Patient") response: FhirGetResponse = await fhir_client.graph_async( graph_definition=graph_definition, contained=False) assert json.loads(response.responses) == response_text
async def test_fhir_client_patient_list_ids_async() -> None: test_name = "test_fhir_client_patient_list_ids_async" mock_server_url = "http://mock-server:1080" mock_client: MockServerFriendlyClient = MockServerFriendlyClient( base_url=mock_server_url) relative_url: str = test_name absolute_url: str = mock_server_url + "/" + test_name mock_client.clear(f"/{test_name}/*.*") mock_client.reset() last_updated_after = datetime.datetime.strptime("2022-01-10", "%Y-%m-%d") response_text: str = json.dumps([ { "resourceType": "Patient", "id": "12355" }, { "resourceType": "Patient", "id": "5555" }, ]) mock_client.expect( mock_request( path=f"/{relative_url}/Patient", method="GET", querystring={ "_elements": "id", "_count": "10000", "_getpagesoffset": "9", "_lastUpdated": "ge2022-01-10T00:00:00Z", }, ), mock_response(body=response_text), timing=times(1), ) fhir_client = FhirClient() fhir_client = fhir_client.url(absolute_url).resource("Patient") fhir_client = fhir_client.last_updated_after(last_updated_after) list_of_ids: List[str] = await fhir_client.get_ids_for_query_async() print(json.dumps(list_of_ids)) assert list_of_ids == ["12355", "5555"]
def test_fhir_client_bundle_separated() -> None: test_name = "test_fhir_client_bundle_separated" mock_server_url = "http://mock-server:1080" mock_client: MockServerFriendlyClient = MockServerFriendlyClient( base_url=mock_server_url) relative_url: str = test_name absolute_url: str = mock_server_url + "/" + test_name mock_client.clear(f"/{test_name}/*.*") mock_client.reset() test_path = Path(__file__).parent with open(test_path.joinpath("../practitioner_graph_sample.json")) as f: response_text = json.load(f) action_payload = { "resourceType": "GraphDefinition", "id": "o", "name": "provider_everything", "status": "active", "start": "Practitioner", "link": [{ "description": "Practitioner Roles for this Practitioner", "target": [{ "type": "PractitionerRole", "params": "practitioner={ref}", "link": [ { "path": "organization", "target": [{ "type": "Organization" }], }, { "path": "location[x]", "target": [{ "type": "Location" }], }, { "path": "healthcareService[x]", "target": [{ "type": "HealthcareService" }], }, ], }], }], } mock_client.expect( mock_request( path=f"/{relative_url}/Patient/$graph", method="POST", querystring={ "id": "1053306548,1710949219", "contained": "true" }, ), mock_response(body=response_text), timing=times(1), ) fhir_client = (FhirClient().action("$graph").id_( ["1710949219", "1053306548"]).additional_parameters([ "&contained=true" ]).action_payload(action_payload).separate_bundle_resources(True)) fhir_client = fhir_client.url(absolute_url).resource("Patient") response: FhirGetResponse = fhir_client.get() with open(test_path.joinpath( "./practitioner_graph_sample_separated.json")) as f: expected_response = json.load(f) assert json.loads(response.responses) == expected_response
async def test_fhir_client_patient_list_in_batches_async() -> None: test_name = "test_fhir_client_patient_list_in_batches_async" mock_server_url = "http://mock-server:1080" mock_client: MockServerFriendlyClient = MockServerFriendlyClient( base_url=mock_server_url ) relative_url: str = test_name absolute_url: str = mock_server_url + "/" + test_name mock_client.clear(f"/{test_name}/*.*") mock_client.reset() # this is the first call made by the first concurrent request mock_client.expect( mock_request( path=f"/{relative_url}/Patient", method="GET", querystring={ "_elements": "id", "_count": "1", "_getpagesoffset": "0", "_total": "accurate", }, ), mock_response( body=json.dumps( { "resourceType": "Bundle", "total": 2, "entry": [{"resource": {"id": "1"}}], } ) ), timing=times(1), ) # this is the second call made by first concurrent request mock_client.expect( mock_request( path=f"/{relative_url}/Patient", method="GET", querystring={ "_elements": "id", "_count": "1", "_getpagesoffset": "3", "_total": "accurate", "id:above": "1", }, ), mock_response( body=json.dumps( { "resourceType": "Bundle", "total": 2, "entry": [], } ) ), timing=times(1), ) # this is the first call made by the second concurrent request mock_client.expect( mock_request( path=f"/{relative_url}/Patient", method="GET", querystring={ "_elements": "id", "_count": "1", "_getpagesoffset": "1", "_total": "accurate", }, ), mock_response( body=json.dumps( { "resourceType": "Bundle", "total": 2, "entry": [{"resource": {"id": "2"}}], } ) ), timing=times(1), ) # this is the second call made by second concurrent request mock_client.expect( mock_request( path=f"/{relative_url}/Patient", method="GET", querystring={ "_elements": "id", "_count": "1", "_getpagesoffset": "3", "_total": "accurate", "id:above": "2", }, ), mock_response( body=json.dumps( { "resourceType": "Bundle", "total": 2, "entry": [], } ) ), timing=times(1), ) # this is the call made by the third concurrent request mock_client.expect( mock_request( path=f"/{relative_url}/Patient", method="GET", querystring={ "_elements": "id", "_count": "1", "_getpagesoffset": "2", "_total": "accurate", }, ), mock_response( body=json.dumps( { "resourceType": "Bundle", "total": 2, "entry": [], } ) ), timing=times(1), ) # now mock the actual calls to get resources response_text_1: Dict[str, Any] = { "resourceType": "Bundle", "total": 2, "entry": [ {"resource": {"resourceType": "Patient", "id": "1"}}, {"resource": {"resourceType": "Patient", "id": "2"}}, ], } mock_client.expect( mock_request( path=f"/{relative_url}/Patient", method="GET", querystring={ "id": "1,2", "_count": "1", "_getpagesoffset": "0", "_total": "accurate", }, ), mock_response(body=json.dumps(response_text_1)), timing=times(1), ) fhir_client = FhirClient() fhir_client = fhir_client.url(absolute_url).resource("Patient") fhir_client = fhir_client.page_size(10) fhir_client = fhir_client.include_total(True) def handle_batch( x: Optional[List[Dict[str, Any]]], page_number: Optional[int] ) -> bool: if x: resources_list.extend(x) return True resources_list: List[Dict[str, Any]] = [] response: List[Dict[str, Any]] = await fhir_client.get_resources_by_query_async( fn_handle_batch=handle_batch, page_size_for_retrieving_ids=1, page_size_for_retrieving_resources=2, concurrent_requests=3, ) print(response) assert response == [] assert len(resources_list) == 2 print(resources_list) assert resources_list == [ {"resourceType": "Patient", "id": "1"}, {"resourceType": "Patient", "id": "2"}, ]