Skip to content

Commit

Permalink
Update Claim and ClaimResponse headers, params, body (#1001)
Browse files Browse the repository at this point in the history
## 🎫 Ticket

An extension of BCDA-8230

## 🛠 Changes

Adjusted Claim and ClaimResponse requests to properly match new
expectations.

## ℹ️ Context

<!-- Why were these changes made? Add background context suitable for a
non-technical audience. -->

<!-- If any of the following security implications apply, this PR must
not be merged without Stephen Walter's approval. Explain in this section
and add @SJWalter11 as a reviewer.
  - Adds a new software dependency or dependencies.
  - Modifies or invalidates one or more of our security controls.
  - Stores or transmits data that was not stored or transmitted before.
- Requires additional review of security implications for other reasons.
-->

## 🧪 Validation

Full linting and test suite.
  • Loading branch information
carlpartridge authored Oct 10, 2024
1 parent 094dc12 commit a49000c
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 26 deletions.
25 changes: 14 additions & 11 deletions bcda/client/bluebutton.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,8 @@ func (bbc *BlueButtonClient) GetPatient(jobData models.JobEnqueueArgs, patientID
func (bbc *BlueButtonClient) GetPatientByMbi(jobData models.JobEnqueueArgs, mbi string) (string, error) {
headers := make(http.Header)
headers.Add("Content-Type", "application/x-www-form-urlencoded")
params := url.Values{}

params := GetDefaultParams()
params.Set("identifier", fmt.Sprintf("http://hl7.org/fhir/sid/us-mbi|%s", mbi))

u, err := bbc.getURL("Patient/_search", params)
Expand All @@ -189,12 +190,14 @@ func (bbc *BlueButtonClient) GetCoverage(jobData models.JobEnqueueArgs, benefici
}

func (bbc *BlueButtonClient) GetClaim(jobData models.JobEnqueueArgs, mbi string, claimsWindow ClaimsWindow) (*fhirModels.Bundle, error) {
header := make(http.Header)
header.Add("IncludeTaxNumbers", "true")
headers := make(http.Header)
headers.Add("Content-Type", "application/x-www-form-urlencoded")

params := GetDefaultParams()
params.Set("excludeSAMHSA", "true")

params.Set("includeTaxNumbers", "true")
params.Set("isHashed", "false")
params.Set("mbi", mbi)
updateParamWithServiceDate(&params, claimsWindow)
updateParamWithLastUpdated(&params, jobData.Since, jobData.TransactionTime)

Expand All @@ -203,17 +206,18 @@ func (bbc *BlueButtonClient) GetClaim(jobData models.JobEnqueueArgs, mbi string,
return nil, err
}

body := fmt.Sprintf(`{"identifier":"http://hl7.org/fhir/sid/us-mbi|%s"}`, mbi)
return bbc.makeBundleDataRequest("POST", u, jobData, header, strings.NewReader(body))
return bbc.makeBundleDataRequest("POST", u, jobData, headers, strings.NewReader(params.Encode()))
}

func (bbc *BlueButtonClient) GetClaimResponse(jobData models.JobEnqueueArgs, mbi string, claimsWindow ClaimsWindow) (*fhirModels.Bundle, error) {
header := make(http.Header)
header.Add("IncludeTaxNumbers", "true")
headers := make(http.Header)
headers.Add("Content-Type", "application/x-www-form-urlencoded")

params := GetDefaultParams()
params.Set("excludeSAMHSA", "true")

params.Set("includeTaxNumbers", "true")
params.Set("isHashed", "false")
params.Set("mbi", mbi)
updateParamWithServiceDate(&params, claimsWindow)
updateParamWithLastUpdated(&params, jobData.Since, jobData.TransactionTime)

Expand All @@ -222,8 +226,7 @@ func (bbc *BlueButtonClient) GetClaimResponse(jobData models.JobEnqueueArgs, mbi
return nil, err
}

body := fmt.Sprintf(`{"identifier":"http://hl7.org/fhir/sid/us-mbi|%s"}`, mbi)
return bbc.makeBundleDataRequest("POST", u, jobData, header, strings.NewReader(body))
return bbc.makeBundleDataRequest("POST", u, jobData, headers, strings.NewReader(params.Encode()))
}

func (bbc *BlueButtonClient) GetExplanationOfBenefit(jobData models.JobEnqueueArgs, patientID string, claimsWindow ClaimsWindow) (*fhirModels.Bundle, error) {
Expand Down
41 changes: 26 additions & 15 deletions bcda/client/bluebutton_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -598,10 +598,10 @@ func (s *BBRequestTestSuite) TestValidateRequest() {
nowChecker,
noServiceDateChecker,
excludeSAMHSAChecker,
includeTaxNumbersChecker,
noIncludeAddressFieldsChecker,
hasDefaultRequestHeaders,
hasBulkRequestHeaders,
hasClaimRequiredURLEncodedParams,
},
},
{
Expand All @@ -619,10 +619,10 @@ func (s *BBRequestTestSuite) TestValidateRequest() {
nowChecker,
noServiceDateChecker,
excludeSAMHSAChecker,
includeTaxNumbersChecker,
noIncludeAddressFieldsChecker,
hasDefaultRequestHeaders,
hasBulkRequestHeaders,
hasClaimRequiredURLEncodedParams,
},
},
{
Expand All @@ -641,10 +641,10 @@ func (s *BBRequestTestSuite) TestValidateRequest() {
serviceDateLowerBoundChecker,
noServiceDateUpperBoundChecker,
excludeSAMHSAChecker,
includeTaxNumbersChecker,
noIncludeAddressFieldsChecker,
hasDefaultRequestHeaders,
hasBulkRequestHeaders,
hasClaimRequiredURLEncodedParams,
},
},
{
Expand All @@ -663,10 +663,10 @@ func (s *BBRequestTestSuite) TestValidateRequest() {
noServiceDateLowerBoundChecker,
serviceDateUpperBoundChecker,
excludeSAMHSAChecker,
includeTaxNumbersChecker,
noIncludeAddressFieldsChecker,
hasDefaultRequestHeaders,
hasBulkRequestHeaders,
hasClaimRequiredURLEncodedParams,
},
},
{
Expand All @@ -685,10 +685,10 @@ func (s *BBRequestTestSuite) TestValidateRequest() {
serviceDateLowerBoundChecker,
serviceDateUpperBoundChecker,
excludeSAMHSAChecker,
includeTaxNumbersChecker,
noIncludeAddressFieldsChecker,
hasDefaultRequestHeaders,
hasBulkRequestHeaders,
hasClaimRequiredURLEncodedParams,
},
},
{
Expand All @@ -706,10 +706,10 @@ func (s *BBRequestTestSuite) TestValidateRequest() {
nowChecker,
noServiceDateChecker,
excludeSAMHSAChecker,
includeTaxNumbersChecker,
noIncludeAddressFieldsChecker,
hasDefaultRequestHeaders,
hasBulkRequestHeaders,
hasClaimRequiredURLEncodedParams,
},
},
{
Expand All @@ -727,10 +727,10 @@ func (s *BBRequestTestSuite) TestValidateRequest() {
nowChecker,
noServiceDateChecker,
excludeSAMHSAChecker,
includeTaxNumbersChecker,
noIncludeAddressFieldsChecker,
hasDefaultRequestHeaders,
hasBulkRequestHeaders,
hasClaimRequiredURLEncodedParams,
},
},
{
Expand All @@ -749,10 +749,10 @@ func (s *BBRequestTestSuite) TestValidateRequest() {
serviceDateLowerBoundChecker,
noServiceDateUpperBoundChecker,
excludeSAMHSAChecker,
includeTaxNumbersChecker,
noIncludeAddressFieldsChecker,
hasDefaultRequestHeaders,
hasBulkRequestHeaders,
hasClaimRequiredURLEncodedParams,
},
},
{
Expand All @@ -771,10 +771,10 @@ func (s *BBRequestTestSuite) TestValidateRequest() {
noServiceDateLowerBoundChecker,
serviceDateUpperBoundChecker,
excludeSAMHSAChecker,
includeTaxNumbersChecker,
noIncludeAddressFieldsChecker,
hasDefaultRequestHeaders,
hasBulkRequestHeaders,
hasClaimRequiredURLEncodedParams,
},
},
{
Expand All @@ -793,10 +793,10 @@ func (s *BBRequestTestSuite) TestValidateRequest() {
serviceDateLowerBoundChecker,
serviceDateUpperBoundChecker,
excludeSAMHSAChecker,
includeTaxNumbersChecker,
noIncludeAddressFieldsChecker,
hasDefaultRequestHeaders,
hasBulkRequestHeaders,
hasClaimRequiredURLEncodedParams,
},
},
}
Expand Down Expand Up @@ -956,13 +956,17 @@ func hasContentTypeURLEncodedHeader(t *testing.T, req *http.Request) {
assert.Equal(t, "application/x-www-form-urlencoded", req.Header.Get("Content-Type"))
}
func hasURLEncodedBodyWithIdentifier(t *testing.T, req *http.Request) {
buf := new(bytes.Buffer)
buf.ReadFrom(req.Body)
respBytes := buf.String()
body := string(respBytes)

body := reqBodyToString(req)
assert.Contains(t, body, fmt.Sprintf("identifier=%s", url.QueryEscape("http://hl7.org/fhir/sid/us-mbi|")))
}
func hasClaimRequiredURLEncodedParams(t *testing.T, req *http.Request) {
body := reqBodyToString(req)
assert.Contains(t, body, "includeTaxNumbers=true")
assert.Contains(t, body, "mbi=beneID1")
assert.Contains(t, body, "excludeSAMHSA=true")
assert.Contains(t, body, "isHashed=false")
}

func hasBulkRequestHeaders(t *testing.T, req *http.Request) {
assert.NotEmpty(t, req.Header.Get(jobIDHeader))
assert.NotEmpty(t, req.Header.Get(clientIDHeader))
Expand All @@ -974,6 +978,13 @@ func noBulkRequestHeaders(t *testing.T, req *http.Request) {
}
}

func reqBodyToString(req *http.Request) string {
buf := new(bytes.Buffer)
buf.ReadFrom(req.Body)
respBytes := buf.String()
return string(respBytes)
}

func TestBBTestSuite(t *testing.T) {
suite.Run(t, new(BBTestSuite))
suite.Run(t, new(BBRequestTestSuite))
Expand Down

0 comments on commit a49000c

Please sign in to comment.