diff --git a/.dockerignore b/.dockerignore index 1707413ec..5526f027b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,7 +2,10 @@ **/bcdaworker/archive/* **/bcdaworker/data/* **/bcdaworker/tmp/* +**/bcdaworker/tmpdata **/bcdaworker/tmpdata/* +**/bcdaworker/TEMP +**/bcdaworker/TEMP/* **/.git **/data **/test_results diff --git a/.gitignore b/.gitignore index 850b6a09d..6f79ee403 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ bcda/swaggerui bcdaworker/data/* bcdaworker/archive/* bcdaworker/tmpdata/* +bcdaworker/TEMP/* .env.sh .envrc bcda/pending_delete_dir/* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 18b55cd5d..74bf0d292 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,4 +7,4 @@ repos: rev: v1.0.0-rc.1 hooks: - id: golangci-lint-pkg - args: ['--new'] + args: ['--new', '-v'] diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 000000000..c9953ae1e --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +golang 1.23.1 diff --git a/Makefile b/Makefile index 0cbe9e843..c279392a4 100644 --- a/Makefile +++ b/Makefile @@ -10,17 +10,19 @@ package: -e GPG_SEC_KEY_FILE='${GPG_SEC_KEY_FILE}' \ -v ${PWD}:/go/src/github.com/CMSgov/bcda-app packaging $(version) +setup-tests: + # Clean up any existing data to ensure we spin up container in a known state. + docker compose -f docker-compose.test.yml rm -fsv tests + docker compose -f docker-compose.test.yml build tests LINT_TIMEOUT ?= 3m -lint: - docker compose -f docker-compose.test.yml build tests +lint: setup-tests docker compose -f docker-compose.test.yml run \ --rm tests golangci-lint run --exclude="(conf\.(Un)?[S,s]etEnv)" --exclude="github\.com\/stretchr\/testify\/suite\.Suite contains sync\.RWMutex" --timeout=$(LINT_TIMEOUT) --verbose # TODO: Remove the exclusion of G301 as part of BCDA-8414 docker compose -f docker-compose.test.yml run --rm tests gosec -exclude=G301 ./... ./optout -smoke-test: - docker compose -f docker-compose.test.yml build tests +smoke-test: setup-tests test/smoke_test/smoke_test.sh $(env) $(maintenanceMode) postman: @@ -45,8 +47,7 @@ postman: --global-var v2Disabled=false \ --global-var maintenanceMode=$(maintenanceMode) -unit-test: unit-test-ssas unit-test-db unit-test-localstack load-fixtures-ssas - docker compose -f docker-compose.test.yml build tests +unit-test: unit-test-ssas unit-test-db unit-test-localstack load-fixtures-ssas setup-tests @docker compose -f docker-compose.test.yml run --rm tests bash scripts/unit_test.sh unit-test-ssas: @@ -82,8 +83,7 @@ unit-test-db-snapshot: # Target takes a snapshot of the currently running postgres instance used for unit testing and updates the db/testing/docker-entrypoint-initdb.d/dump.pgdata file docker compose -f docker-compose.test.yml exec db-unit-test sh -c 'PGPASSWORD=$$POSTGRES_PASSWORD pg_dump -U postgres --format custom --file=/docker-entrypoint-initdb.d/dump.pgdata --create $$POSTGRES_DB' -performance-test: - docker compose -f docker-compose.test.yml build tests +performance-test: setup-tests docker compose -f docker-compose.test.yml run --rm -w /go/src/github.com/CMSgov/bcda-app/test/performance_test tests sh performance_test.sh test: diff --git a/bcda/client/bluebutton.go b/bcda/client/bluebutton.go index 50a8f725a..702a9fbe0 100644 --- a/bcda/client/bluebutton.go +++ b/bcda/client/bluebutton.go @@ -2,11 +2,10 @@ package client import ( "context" - "crypto/sha256" "crypto/tls" "crypto/x509" - "encoding/hex" "fmt" + "io" "net/http" "net/url" "os" @@ -16,7 +15,7 @@ import ( "time" "github.com/ccoveille/go-safecast" - "github.com/cenkalti/backoff/v4" + backoff "github.com/cenkalti/backoff/v4" "github.com/newrelic/go-agent/v3/newrelic" "github.com/CMSgov/bcda-app/bcda/client/fhir" @@ -32,7 +31,6 @@ import ( "github.com/sirupsen/logrus" "github.com/pborman/uuid" - "golang.org/x/crypto/pbkdf2" ) var logger logrus.FieldLogger @@ -67,7 +65,7 @@ type APIClient interface { GetExplanationOfBenefit(jobData models.JobEnqueueArgs, patientID string, claimsWindow ClaimsWindow) (*fhirModels.Bundle, error) GetPatient(jobData models.JobEnqueueArgs, patientID string) (*fhirModels.Bundle, error) GetCoverage(jobData models.JobEnqueueArgs, beneficiaryID string) (*fhirModels.Bundle, error) - GetPatientByIdentifierHash(jobData models.JobEnqueueArgs, hashedIdentifier string) (string, error) + GetPatientByMbi(jobData models.JobEnqueueArgs, mbi string) (string, error) GetClaim(jobData models.JobEnqueueArgs, mbi string, claimsWindow ClaimsWindow) (*fhirModels.Bundle, error) GetClaimResponse(jobData models.JobEnqueueArgs, mbi string, claimsWindow ClaimsWindow) (*fhirModels.Bundle, error) } @@ -163,18 +161,16 @@ func (bbc *BlueButtonClient) GetPatient(jobData models.JobEnqueueArgs, patientID return bbc.getBundleData(u, jobData, header) } -func (bbc *BlueButtonClient) GetPatientByIdentifierHash(jobData models.JobEnqueueArgs, hashedIdentifier string) (string, error) { - params := GetDefaultParams() - - // FHIR spec requires a FULLY qualified namespace so this is in fact the argument, not a URL - params.Set("identifier", fmt.Sprintf("https://bluebutton.cms.gov/resources/identifier/%s|%v", "mbi-hash", hashedIdentifier)) +func (bbc *BlueButtonClient) GetPatientByMbi(jobData models.JobEnqueueArgs, mbi string) (string, error) { + params := url.Values{} - u, err := bbc.getURL("Patient", params) + u, err := bbc.getURL("Patient/_search", params) if err != nil { return "", err } - return bbc.getRawData(jobData, u) + body := fmt.Sprintf(`{"identifier":"http://hl7.org/fhir/sid/us-mbi|%s"}`, mbi) + return bbc.getRawData(jobData, "POST", u, strings.NewReader(body)) } func (bbc *BlueButtonClient) GetCoverage(jobData models.JobEnqueueArgs, beneficiaryID string) (*fhirModels.Bundle, error) { @@ -194,48 +190,38 @@ func (bbc *BlueButtonClient) GetClaim(jobData models.JobEnqueueArgs, mbi string, header := make(http.Header) header.Add("IncludeTaxNumbers", "true") - mbiHash, err := HashIdentifier(mbi) - if err != nil { - return nil, err - } - params := GetDefaultParams() - params.Set("mbi", mbiHash) params.Set("excludeSAMHSA", "true") updateParamWithServiceDate(¶ms, claimsWindow) updateParamWithLastUpdated(¶ms, jobData.Since, jobData.TransactionTime) - u, err := bbc.getURL("Claim", params) + u, err := bbc.getURL("Claim/_search", params) if err != nil { return nil, err } - return bbc.getBundleData(u, jobData, header) + body := fmt.Sprintf(`{"identifier":"http://hl7.org/fhir/sid/us-mbi|%s"}`, mbi) + return bbc.postBundleData(u, jobData, header, strings.NewReader(body)) } func (bbc *BlueButtonClient) GetClaimResponse(jobData models.JobEnqueueArgs, mbi string, claimsWindow ClaimsWindow) (*fhirModels.Bundle, error) { header := make(http.Header) header.Add("IncludeTaxNumbers", "true") - mbiHash, err := HashIdentifier(mbi) - if err != nil { - return nil, err - } - params := GetDefaultParams() - params.Set("mbi", mbiHash) params.Set("excludeSAMHSA", "true") updateParamWithServiceDate(¶ms, claimsWindow) updateParamWithLastUpdated(¶ms, jobData.Since, jobData.TransactionTime) - u, err := bbc.getURL("ClaimResponse", params) + u, err := bbc.getURL("ClaimResponse/_search", params) if err != nil { return nil, err } - return bbc.getBundleData(u, jobData, header) + body := fmt.Sprintf(`{"identifier":"http://hl7.org/fhir/sid/us-mbi|%s"}`, mbi) + return bbc.postBundleData(u, jobData, header, strings.NewReader(body)) } func (bbc *BlueButtonClient) GetExplanationOfBenefit(jobData models.JobEnqueueArgs, patientID string, claimsWindow ClaimsWindow) (*fhirModels.Bundle, error) { @@ -263,13 +249,21 @@ func (bbc *BlueButtonClient) GetMetadata() (string, error) { } jobData := models.JobEnqueueArgs{} - return bbc.getRawData(jobData, u) + return bbc.getRawData(jobData, "GET", u, nil) } func (bbc *BlueButtonClient) getBundleData(u *url.URL, jobData models.JobEnqueueArgs, headers http.Header) (*fhirModels.Bundle, error) { + return bbc.makeBundleDataRequest("GET", u, jobData, headers, nil) +} + +func (bbc *BlueButtonClient) postBundleData(u *url.URL, jobData models.JobEnqueueArgs, headers http.Header, body io.Reader) (*fhirModels.Bundle, error) { + return bbc.makeBundleDataRequest("POST", u, jobData, headers, body) +} + +func (bbc *BlueButtonClient) makeBundleDataRequest(method string, u *url.URL, jobData models.JobEnqueueArgs, headers http.Header, body io.Reader) (*fhirModels.Bundle, error) { var b *fhirModels.Bundle for ok := true; ok; { - result, nextURL, err := bbc.tryBundleRequest(u, jobData, headers) + result, nextURL, err := bbc.tryBundleRequest(method, u, jobData, headers, body) if err != nil { return nil, err } @@ -287,7 +281,7 @@ func (bbc *BlueButtonClient) getBundleData(u *url.URL, jobData models.JobEnqueue return b, nil } -func (bbc *BlueButtonClient) tryBundleRequest(u *url.URL, jobData models.JobEnqueueArgs, headers http.Header) (*fhirModels.Bundle, *url.URL, error) { +func (bbc *BlueButtonClient) tryBundleRequest(method string, u *url.URL, jobData models.JobEnqueueArgs, headers http.Header, body io.Reader) (*fhirModels.Bundle, *url.URL, error) { m := monitoring.GetMonitor() txn := m.Start(u.Path, nil, nil) defer m.End(txn) @@ -303,7 +297,7 @@ func (bbc *BlueButtonClient) tryBundleRequest(u *url.URL, jobData models.JobEnqu b := backoff.WithMaxRetries(eb, bbc.maxTries) err = backoff.RetryNotify(func() error { - req, err := http.NewRequest("GET", u.String(), nil) + req, err := http.NewRequest(method, u.String(), body) if err != nil { logger.Error(err) return err @@ -337,7 +331,7 @@ func (bbc *BlueButtonClient) tryBundleRequest(u *url.URL, jobData models.JobEnqu return result, nextURL, nil } -func (bbc *BlueButtonClient) getRawData(jobData models.JobEnqueueArgs, u *url.URL) (string, error) { +func (bbc *BlueButtonClient) getRawData(jobData models.JobEnqueueArgs, method string, u *url.URL, body io.Reader) (string, error) { m := monitoring.GetMonitor() txn := m.Start(u.Path, nil, nil) defer m.End(txn) @@ -349,7 +343,7 @@ func (bbc *BlueButtonClient) getRawData(jobData models.JobEnqueueArgs, u *url.UR var result string err := backoff.RetryNotify(func() error { - req, err := http.NewRequest("GET", u.String(), nil) + req, err := http.NewRequest(method, u.String(), body) if err != nil { logger.Error(err) return err @@ -417,19 +411,6 @@ func GetDefaultParams() (params url.Values) { return params } -func HashIdentifier(toHash string) (hashedValue string, err error) { - blueButtonPepper := conf.GetEnv("BB_HASH_PEPPER") - blueButtonIter := utils.GetEnvInt("BB_HASH_ITER", 1000) - - pepper, err := hex.DecodeString(blueButtonPepper) - - if err != nil { - return "", errors.Wrap(err, "Failed to decode bluebutton hash pepper") - } - - return hex.EncodeToString(pbkdf2.Key([]byte(toHash), pepper, blueButtonIter, 32, sha256.New)), nil -} - func updateParamWithServiceDate(params *url.Values, claimsWindow ClaimsWindow) { // ServiceDate only uses yyyy-mm-dd const isoDate = "2006-01-02" diff --git a/bcda/client/bluebutton_test.go b/bcda/client/bluebutton_test.go index 2199f6584..e653538ec 100644 --- a/bcda/client/bluebutton_test.go +++ b/bcda/client/bluebutton_test.go @@ -296,20 +296,6 @@ func (s *BBRequestTestSuite) TestGetClaim() { assert.Equal(s.T(), 1, len(e.Entries)) } -func (s *BBRequestTestSuite) TestGetClaim_HashIdentifierError() { - existingPepper := conf.GetEnv("BB_HASH_PEPPER") - - defer func() { - conf.SetEnv(s.T(), "BB_HASH_PEPPER", existingPepper) - }() - - conf.SetEnv(s.T(), "BB_HASH_PEPPER", "ëÃìùÃ") - - _, err := s.bbClient.GetClaim(jobData, "1234567890hashed", client.ClaimsWindow{}) - assert.NotNil(s.T(), err) - assert.Contains(s.T(), err.Error(), "Failed to decode bluebutton hash pepper") -} - func (s *BBRequestTestSuite) TestGetClaim_500() { e, err := s.bbClient.GetClaim(jobData, "1234567890hashed", client.ClaimsWindow{}) assert.Regexp(s.T(), `blue button request failed \d+ time\(s\) failed to get bundle response`, err.Error()) @@ -322,20 +308,6 @@ func (s *BBRequestTestSuite) TestGetClaimResponse() { assert.Equal(s.T(), 1, len(e.Entries)) } -func (s *BBRequestTestSuite) TestGetClaimResponse_HashIdentifierError() { - existingPepper := conf.GetEnv("BB_HASH_PEPPER") - - defer func() { - conf.SetEnv(s.T(), "BB_HASH_PEPPER", existingPepper) - }() - - conf.SetEnv(s.T(), "BB_HASH_PEPPER", "ëÃìùÃ") - - _, err := s.bbClient.GetClaimResponse(jobData, "1234567890hashed", client.ClaimsWindow{}) - assert.NotNil(s.T(), err) - assert.Contains(s.T(), err.Error(), "Failed to decode bluebutton hash pepper") -} - func (s *BBRequestTestSuite) TestGetClaimResponse_500() { e, err := s.bbClient.GetClaimResponse(jobData, "1234567890hashed", client.ClaimsWindow{}) assert.Regexp(s.T(), `blue button request failed \d+ time\(s\) failed to get bundle response`, err.Error()) @@ -355,20 +327,20 @@ func (s *BBRequestTestSuite) TestGetMetadata_500() { assert.Equal(s.T(), "", p) } -func (s *BBRequestTestSuite) TestGetPatientByIdentifierHash() { - p, err := s.bbClient.GetPatientByIdentifierHash(models.JobEnqueueArgs{}, "hashedIdentifier") +func (s *BBRequestTestSuite) TestGetPatientByMbi() { + p, err := s.bbClient.GetPatientByMbi(models.JobEnqueueArgs{}, "mbi") assert.Nil(s.T(), err) assert.Contains(s.T(), p, `"id": "20000000000001"`) } -func (s *BBRequestTestSuite) TestGetPatientByIdentifierHash_500() { +func (s *BBRequestTestSuite) TestGetPatientByMbi_500() { var cms_id, job_id bool hook := test.NewLocal(logrus.StandardLogger()) jobData := models.JobEnqueueArgs{ ID: 1, CMSID: "A0000", } - p, err := s.bbClient.GetPatientByIdentifierHash(jobData, "hashedIdentifier") + p, err := s.bbClient.GetPatientByMbi(jobData, "mbi") entry := hook.AllEntries() for _, t := range entry { s.T().Log(t.Data) @@ -385,51 +357,6 @@ func (s *BBRequestTestSuite) TestGetPatientByIdentifierHash_500() { assert.Equal(s.T(), "", p) } -// Sample values from https://confluence.cms.gov/pages/viewpage.action?spaceKey=BB&title=Getting+Started+with+Blue+Button+2.0%27s+Backend#space-menu-link-content -func (s *BBTestSuite) TestHashIdentifier() { - assert.NotZero(s.T(), conf.GetEnv("BB_HASH_PEPPER")) - HICN := "1000067585" - HICNHash, err := client.HashIdentifier(HICN) - assert.Nil(s.T(), err) - - // This test will only be valid for this pepper. If it is different in different environments we will need different checks - if conf.GetEnv("BB_HASH_PEPPER") == "b8ebdcc47fdd852b8b0201835c6273a9177806e84f2d9dc4f7ecaff08681e86d74195c6aef2db06d3d44c9d0b8f93c3e6c43d90724b605ac12585b9ab5ee9c3f00d5c0d284e6b8e49d502415c601c28930637b58fdca72476e31c22ad0f24ecd761020d6a4bcd471f0db421d21983c0def1b66a49a230f85f93097e9a9a8e0a4f4f0add775213cbf9ecfc1a6024cb021bd1ed5f4981a4498f294cca51d3939dfd9e6a1045350ddde7b6d791b4d3b884ee890d4c401ef97b46d1e57d40efe5737248dd0c4cec29c23c787231c4346cab9bb973f140a32abaa0a2bd5c0b91162f8d2a7c9d3347aafc76adbbd90ec5bfe617a3584e94bc31047e3bb6850477219a9" { - assert.Equal(s.T(), "b67baee938a551f06605ecc521cc329530df4e088e5a2d84bbdcc047d70faff4", HICNHash) - } - HICN = "123456789" - HICNHash, err = client.HashIdentifier(HICN) - assert.Nil(s.T(), err) - assert.NotEqual(s.T(), "b67baee938a551f06605ecc521cc329530df4e088e5a2d84bbdcc047d70faff4", HICNHash) - - MBI := "1000067585" - MBIHash, err := client.HashIdentifier(MBI) - assert.Nil(s.T(), err) - - if conf.GetEnv("BB_HASH_PEPPER") == "b8ebdcc47fdd852b8b0201835c6273a9177806e84f2d9dc4f7ecaff08681e86d74195c6aef2db06d3d44c9d0b8f93c3e6c43d90724b605ac12585b9ab5ee9c3f00d5c0d284e6b8e49d502415c601c28930637b58fdca72476e31c22ad0f24ecd761020d6a4bcd471f0db421d21983c0def1b66a49a230f85f93097e9a9a8e0a4f4f0add775213cbf9ecfc1a6024cb021bd1ed5f4981a4498f294cca51d3939dfd9e6a1045350ddde7b6d791b4d3b884ee890d4c401ef97b46d1e57d40efe5737248dd0c4cec29c23c787231c4346cab9bb973f140a32abaa0a2bd5c0b91162f8d2a7c9d3347aafc76adbbd90ec5bfe617a3584e94bc31047e3bb6850477219a9" { - assert.Equal(s.T(), "b67baee938a551f06605ecc521cc329530df4e088e5a2d84bbdcc047d70faff4", MBIHash) - } - - MBI = "123456789" - MBIHash, err = client.HashIdentifier(MBI) - assert.Nil(s.T(), err) - assert.NotEqual(s.T(), "b67baee938a551f06605ecc521cc329530df4e088e5a2d84bbdcc047d70faff4", MBIHash) -} - -func (s *BBTestSuite) TestHashIdentifierFailure() { - assert.NotZero(s.T(), conf.GetEnv("BB_HASH_PEPPER")) - existingPepper := conf.GetEnv("BB_HASH_PEPPER") - - defer func() { - conf.SetEnv(s.T(), "BB_HASH_PEPPER", existingPepper) - }() - - conf.SetEnv(s.T(), "BB_HASH_PEPPER", "ëÃìùÃ") - - HICN := "1000067585" - _, err := client.HashIdentifier(HICN) - assert.NotNil(s.T(), err) -} - func (s *BBRequestTestSuite) TearDownAllSuite() { s.ts.Close() } @@ -636,9 +563,9 @@ func (s *BBRequestTestSuite) TestValidateRequest() { }, }, { - "GetPatientByIdentifierHash", + "GetPatientByMbi", func(bbClient *client.BlueButtonClient) (interface{}, error) { - return bbClient.GetPatientByIdentifierHash(models.JobEnqueueArgs{}, "hashedIdentifier") + return bbClient.GetPatientByMbi(models.JobEnqueueArgs{}, "mbi") }, func(t *testing.T, payload interface{}) { result, ok := payload.(string) @@ -650,7 +577,7 @@ func (s *BBRequestTestSuite) TestValidateRequest() { noIncludeAddressFieldsChecker, noIncludeTaxNumbersChecker, noBulkRequestHeaders, - hasDefaultRequestHeaders, + hasDefaultRequestHeadersNoQuery, }, }, { @@ -1022,6 +949,13 @@ func hasDefaultRequestHeaders(t *testing.T, req *http.Request) { assert.NotEmpty(t, req.Header.Get(constants.BBHeaderOriginQ)) assert.NotEmpty(t, req.Header.Get(constants.BBHeaderOriginQC)) } +func hasDefaultRequestHeadersNoQuery(t *testing.T, req *http.Request) { + assert.NotEmpty(t, req.Header.Get(constants.BBHeaderTS)) + assert.NotEmpty(t, req.Header.Get(constants.BBHeaderOriginURL)) + assert.NotEmpty(t, req.Header.Get(constants.BBHeaderOriginQID)) + assert.Empty(t, req.Header.Get(constants.BBHeaderOriginQ)) + assert.NotEmpty(t, req.Header.Get(constants.BBHeaderOriginQC)) +} func hasBulkRequestHeaders(t *testing.T, req *http.Request) { assert.NotEmpty(t, req.Header.Get(jobIDHeader)) assert.NotEmpty(t, req.Header.Get(clientIDHeader)) diff --git a/bcda/client/mock_bluebutton.go b/bcda/client/mock_bluebutton.go index 279affeab..29219e3c9 100644 --- a/bcda/client/mock_bluebutton.go +++ b/bcda/client/mock_bluebutton.go @@ -26,8 +26,8 @@ func (bbc *MockBlueButtonClient) GetExplanationOfBenefit(jobData models.JobEnque return args.Get(0).(*fhirModels.Bundle), args.Error(1) } -func (bbc *MockBlueButtonClient) GetPatientByIdentifierHash(jobData models.JobEnqueueArgs, hashedIdentifier string) (string, error) { - args := bbc.Called(hashedIdentifier) +func (bbc *MockBlueButtonClient) GetPatientByMbi(jobData models.JobEnqueueArgs, mbi string) (string, error) { + args := bbc.Called(mbi) return args.String(0), args.Error(1) } diff --git a/bcdaworker/worker/bluebutton.go b/bcdaworker/worker/bluebutton.go index 79782b079..42f220021 100644 --- a/bcdaworker/worker/bluebutton.go +++ b/bcdaworker/worker/bluebutton.go @@ -12,12 +12,7 @@ import ( // This method will ensure that a valid BlueButton ID is returned. // If you use cclfBeneficiary.BlueButtonID you will not be guaranteed a valid value func getBlueButtonID(bb client.APIClient, mbi string, jobData models.JobEnqueueArgs) (blueButtonID string, err error) { - hashedIdentifier, err := client.HashIdentifier(mbi) - if err != nil { - return "", err - } - - jsonData, err := bb.GetPatientByIdentifierHash(jobData, hashedIdentifier) + jsonData, err := bb.GetPatientByMbi(jobData, mbi) if err != nil { return "", err } diff --git a/bcdaworker/worker/worker_test.go b/bcdaworker/worker/worker_test.go index 8bf8ec6c0..0296cf6a8 100644 --- a/bcdaworker/worker/worker_test.go +++ b/bcdaworker/worker/worker_test.go @@ -188,24 +188,21 @@ func SetupWriteResourceToFile(s *WorkerTestSuite, resource string) (context.Cont ctx := context.Background() ctx = log.NewStructuredLoggerEntry(log.Worker, ctx) - id, err := client.HashIdentifier(cclfBeneficiary.MBI) - assert.Nil(s.T(), err) - switch resource { case "ExplanationOfBenefit": - bbc.On("GetPatientByIdentifierHash", id).Return(bbc.GetData("Patient", beneID)) + bbc.On("GetPatientByMbi", cclfBeneficiary.MBI).Return(bbc.GetData("Patient", beneID)) bbc.On("GetExplanationOfBenefit", jobArgs, beneID, claimsWindowMatcher(claimsWindow.LowerBound, claimsWindow.UpperBound)).Return(bbc.GetBundleData("ExplanationOfBenefit", beneID)) case "Coverage": - bbc.On("GetPatientByIdentifierHash", id).Return(bbc.GetData("Patient", beneID)) + bbc.On("GetPatientByMbi", cclfBeneficiary.MBI).Return(bbc.GetData("Patient", beneID)) bbc.On("GetCoverage", jobArgs, beneID).Return(bbc.GetBundleData("Coverage", beneID)) case "Patient": - bbc.On("GetPatientByIdentifierHash", id).Return(bbc.GetData("Patient", beneID)) + bbc.On("GetPatientByMbi", cclfBeneficiary.MBI).Return(bbc.GetData("Patient", beneID)) bbc.On("GetPatient", jobArgs, beneID).Return(bbc.GetBundleData("Patient", beneID)) case "Claim": - bbc.On("GetPatientByIdentifierHash", id).Return(bbc.GetData("Patient", beneID)) + bbc.On("GetPatientByMbi", cclfBeneficiary.MBI).Return(bbc.GetData("Patient", beneID)) bbc.On("GetClaim", jobArgs, beneID, claimsWindowMatcher(claimsWindow.LowerBound, claimsWindow.UpperBound)).Return(bbc.GetBundleData("Claim", beneID)) case "ClaimResponse": - bbc.On("GetPatientByIdentifierHash", id).Return(bbc.GetData("Patient", beneID)) + bbc.On("GetPatientByMbi", cclfBeneficiary.MBI).Return(bbc.GetData("Patient", beneID)) bbc.On("GetClaimResponse", jobArgs, beneID, claimsWindowMatcher(claimsWindow.LowerBound, claimsWindow.UpperBound)).Return(bbc.GetBundleData("ClaimResponse", beneID)) } @@ -254,10 +251,7 @@ func (s *WorkerTestSuite) TestWriteEmptyResourceToFile() { postgrestest.CreateCCLFBeneficiary(s.T(), s.db, &cclfBeneficiary) cclfBeneficiaryIDs = append(cclfBeneficiaryIDs, strconv.FormatUint(uint64(cclfBeneficiary.ID), 10)) - id, err := client.HashIdentifier(cclfBeneficiary.MBI) - assert.Nil(s.T(), err) - - bbc.On("GetPatientByIdentifierHash", id).Return(bbc.GetData("Patient", beneficiaryID)) + bbc.On("GetPatientByMbi", cclfBeneficiary.MBI).Return(bbc.GetData("Patient", beneficiaryID)) jobArgs := models.JobEnqueueArgs{ID: s.jobID, ResourceType: "ExplanationOfBenefit", BeneficiaryIDs: cclfBeneficiaryIDs, TransactionTime: transactionTime, ACOID: s.testACO.UUID.String()} // Set up the mock function to return the expected values @@ -282,10 +276,7 @@ func (s *WorkerTestSuite) TestWriteEOBDataToFileWithErrorsBelowFailureThreshold( cclfBeneficiary := models.CCLFBeneficiary{FileID: s.cclfFile.ID, MBI: beneficiaryID, BlueButtonID: beneficiaryID} postgrestest.CreateCCLFBeneficiary(s.T(), s.db, &cclfBeneficiary) cclfBeneficiaryIDs = append(cclfBeneficiaryIDs, strconv.FormatUint(uint64(cclfBeneficiary.ID), 10)) - - id, err := client.HashIdentifier(cclfBeneficiary.MBI) - assert.Nil(s.T(), err) - bbc.On("GetPatientByIdentifierHash", id).Return(bbc.GetData("Patient", beneficiaryID)) + bbc.On("GetPatientByMbi", cclfBeneficiary.MBI).Return(bbc.GetData("Patient", beneficiaryID)) } jobArgs := models.JobEnqueueArgs{ID: s.jobID, ResourceType: "ExplanationOfBenefit", BeneficiaryIDs: cclfBeneficiaryIDs, TransactionTime: transactionTime, ACOID: s.testACO.UUID.String()} @@ -335,17 +326,13 @@ func (s *WorkerTestSuite) TestWriteEOBDataToFileWithErrorsAboveFailureThreshold( bbc.On("GetExplanationOfBenefit", jobArgs, beneficiaryIDs[0], claimsWindowMatcher()).Return(nil, errors.New("error")) bbc.On("GetExplanationOfBenefit", jobArgs, beneficiaryIDs[1], claimsWindowMatcher()).Return(nil, errors.New("error")) bbc.MBI = &beneficiaryIDs[0] - id0, err := client.HashIdentifier(beneficiaryIDs[0]) - assert.Nil(s.T(), err) - bbc.On("GetPatientByIdentifierHash", id0).Return(bbc.GetData("Patient", beneficiaryIDs[0])) + bbc.On("GetPatientByMbi", beneficiaryIDs[0]).Return(bbc.GetData("Patient", beneficiaryIDs[0])) bbc.MBI = &beneficiaryIDs[1] - id1, err := client.HashIdentifier(beneficiaryIDs[1]) - assert.Nil(s.T(), err) - bbc.On("GetPatientByIdentifierHash", id1).Return(bbc.GetData("Patient", beneficiaryIDs[1])) + bbc.On("GetPatientByMbi", beneficiaryIDs[1]).Return(bbc.GetData("Patient", beneficiaryIDs[1])) jobArgs.BeneficiaryIDs = cclfBeneficiaryIDs - err = createDir(s.tempDir) + err := createDir(s.tempDir) assert.NoError(s.T(), err) jobKeys, err := writeBBDataToFile(s.logctx, s.r, &bbc, *s.testACO.CMSID, rand.Int63(), jobArgs, s.tempDir) assert.Len(s.T(), jobKeys, 1) @@ -378,7 +365,7 @@ func (s *WorkerTestSuite) TestWriteEOBDataToFile_BlueButtonIDNotFound() { conf.SetEnv(s.T(), "EXPORT_FAIL_PCT", "51") bbc := client.MockBlueButtonClient{} - bbc.On("GetPatientByIdentifierHash", mock.AnythingOfType("string")).Return("", errors.New("No beneficiary found for MBI")) + bbc.On("GetPatientByMbi", mock.AnythingOfType("string")).Return("", errors.New("No beneficiary found for MBI")) badMBIs := []string{"ab000000001", "ab000000002"} var cclfBeneficiaryIDs []string diff --git a/go.mod b/go.mod index d3de5cd8b..a1c85fb6f 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/stretchr/testify v1.9.0 github.com/tsenart/vegeta v12.7.0+incompatible github.com/urfave/cli v1.22.9 - golang.org/x/crypto v0.23.0 + golang.org/x/crypto v0.23.0 // indirect golang.org/x/text v0.15.0 gotest.tools/gotestsum v1.6.2 ) diff --git a/shared_files/encrypted/local.env b/shared_files/encrypted/local.env index ef6ad61f2..ef36572b4 100644 --- a/shared_files/encrypted/local.env +++ b/shared_files/encrypted/local.env @@ -1,125 +1,98 @@ $ANSIBLE_VAULT;1.1;AES256 -31366265396239613265333862353437663138626531373136316531306132663339643362373430 -3461623462353464666662643036656365633837666339660a666665663436363735643632636535 -37323637633062653465366239313630616131393632653961633430393064373536366262333232 -3931626665396638380a633838313363363465313236656261653366633266666238653633653431 -39613236646434333962343937343130623161396464366565336631666162333564383666663663 -61646266376462633734323535346663333664386636663431656133333834303963383461356537 -61623837613061323631666435643734666135363734643436366630346363346439326135623862 -32363535353639646366656230636436626336636139393966613663363430313861376661313336 -66626566353735303261633666613831383931346562323735613133633965653332626231303132 -36383535613661663335303963313336616262373063313665666236326165383939326132363962 -66356237303236646162336632626363383932376166363963323738663233393361643264356166 -30303861323137303563656164386236336164373735323536613962363436363234376165653334 -33626337306138663233653836666239343035623661666465663162393737646539373238313135 -31366530313036396465613766653236653336363865623664363265333162643361343863303539 -61346630393765343063386537623639383339313831643865393361346537653336633631333362 -61633137303265313334303636386365396539616162303961613833316466363363373737333232 -65663061613339393362373333656663353336393637383631303935346231353331373437343439 -33393434313466656562353663333664656166623234343530613265373234656439393933363735 -63653236613536363031396533306332613232383838336530306635386232363237396232626161 -30363962636361363262326137343030373564666332633866336230346636626463346565666430 -64373432343836346562303666346338393866343431616134636236346464383337333435653562 -66396365333562316338303666396530646333653237366665666231323534643732656337613933 -32356161313533643339333736353264613963653837663530326434636666306235623536363961 -36363735303831303935643863653133363936383563376463333731376233343861363631306338 -39373432663865663766646462653764653633356466376663306239386166616335326363666135 -37663530346633353366363662663362323835623039623137643161306439313039393536323930 -63326638356639316138373035623964313330626533616636633930303437376464663337363064 -34396439383337323739326235353931373935373235326662333338666536303031633434316461 -64356565303834646133623166336535393536393039326135666631636131353464366136303063 -66363334663863343264303066303435646237663139366135343237373266616133343261363039 -35636166666630383837333834623964313065373030343666353731356464633439653633363835 -39623230353864353261323038343966363238333433323938323465636534356337646535663130 -39326163626130356431333234643737333835303566646438393839643533346462623830343439 -63373037373338633838393463636161656662336536376664336334393162316531313563366564 -38373462643638336262346532356263643263323630363438356633393462383033313330656161 -37316232303735663832333462626637333234643730626233326438626339366130353430373434 -31346131666434633865386433306363656537313738383265663633376232393536333665666266 -34386465626633303565316539313135373033303262393561393961303638363561336634373730 -65626563396534613761653463303139396264653935393238373262656431396630373636663361 -37383230616665306339303832613339646632386337663664333837616238663534376530643035 -65393965383662623135326162323530333261383835323632343133633962323966333765666636 -66366532623138326563303933666139623463613835366664353232396533386535353864326332 -61643734633361353130386533353030373832373564316563663538303139303531366534616137 -35613437663166323863343135376239373137333330366135623437353362653337346564353733 -65383635393438613265623434666663656333316135643563373030373131353432356662383866 -33363365623863396366623837366162326232303133333436333135366561666436323234323866 -65313062623533663635303031316561633135386230313432336435316465666165353631333133 -61616533613361303237396562343031376265353734656334393932303265326363316638393333 -61626430646531646436313264613938633564646366636663326531663430333330626135623431 -31393035646163303262646334333262633435356531623736326134373032323237353938373036 -65383361306436383330376432373834343734663164366532303033656162636636303762373937 -35623936646634356465303263333663656438613061363934373962663363643533656665306431 -39343166326637343361626561356430633666303365373939613137323864636537346634396561 -32646432353333613762663265333863643631383762646133313638386438393164633135336432 -64363534353832396430326262393135313133303434383538356662363638656664643936666466 -64346466646434356666316164333564386465656461616632373365303664393039356432656561 -63373738353161653234316364323637376261616232326632646566376335316466616237313534 -64643531373662346339323534643863393833346530623732633532633536323732643935343239 -34306633613135333336666433393361323931653566666462373933363165646335653733376131 -33393938346637653732343330336234653132626538376339333762343135393733623866656265 -32366430666531623136623763303263373039346539343435346434386462663766613765373231 -36333466353232303536643537393134313131666234323733636565323265396638336663343636 -32363839646639316536666363336236373039373962336530393336313064386463316661626539 -32343065376336646536666432373439343535353763623163313934663162373636303636623563 -35636666376566373432373062373039646532636461346632646434373462623461636133353062 -63363131646536666330376230393039353531346332633137336161353334653839326431303066 -30643834326633656135376337363635356163636133653066393461303733663762626232383762 -37643632346263623630303236303463633232316162336563386362633632643731363864373534 -37383932363037373164633533346331393139396130306539303061333364323965633864363662 -63316666323231336231303834323231353139383266653936336266313636356637363332643532 -65303366643638373331616663363833646436666133616362323666313063626165656365616337 -35313261363837313833616532326333343261336433386365373439323837303061316463373939 -30396536623862656634623932623632623963613939343566363631656433393263346634313035 -39333433313136623934616135663231326161643337376531656337306238336664373733643565 -39323439633361613435666137313965646265633733343331346566396539643032353962316463 -63313837386131313565376430303435613161353835346239363161633938313139393863656462 -31383832623635626563623331653731626363353663303565376530393534646531333837323238 -65613634333436633963333238396461393664353936343834396332383235316332386633623534 -33353136333439383939353261343230373462623334623431336237363765646365303139393037 -66623064613932356361306466363761653236396563383064353731356239646532373232643765 -37653865356262653863363765653038393631653766646665626464353833383237336665643334 -62653336353863323731323232396563633437356633323839653665393138613364373639613665 -38656633633366303263386538353566613765323439366362633337653737643966623863343166 -30666163353331353761343737376531653639616138303063303336613764313332313366666161 -64343964663832626635626237323231623835306663336136663836366564616135663437386266 -37386461633039386232623339333435313435393031633838393166383664346632636537393636 -38323865383633333031653035366430656264303463313730353765653636653231343336636632 -63323333346135366466656365313463316661623765393036316462613463303939386464333432 -36646532326635616366336632303965303163356433646134626562613965383832663564383636 -61323132386435373664363530613164393165613439356631343136663266326563393261633164 -32396662643361346566356661343338393334643466373361383838636665663030363733363034 -30326635306366313836303536373433373531356430343866396465383064353064626132623332 -39663263353661323662346138653866666266653431393737626436666236386336646231323736 -35333764316134313863663162376536363564373332333934663134306437666163303732363035 -36316165626136633639663162653161313461623564663363326432623433653739376232663461 -30323666623932316663633933613432353132656535653434393964383237333363666638623364 -34333732663238386164323733646464653465313635333734323365353565353861646634666134 -38653433646438656165313935363866623734326362636436366336303264653265313434636137 -38393832393034623863653164373738303136663864626330396139386630646136326334386262 -63626438653732303839333339663438303333663462303239306631326232626265303433393261 -39626637613861653132343963353330326464636232623930666230643037623030353634633233 -35666231386231353338663131336562356438663835393863326436356463653133343162363932 -61396265363836613563643935376663323666633561663431646632343964633237636261316363 -33643930323131343133333237623361393536623533663366623437306662303663613037313130 -65346437383335393862353239396362343435323030633536373865373336383239323139653337 -64613861393266666337623762626364333132336362356566363364666266656537333263656362 -39623334373631343863396566343638666161373237373233343135313961396539396539616262 -34373932343963633736333362636463636366663135633139373862646332613034383431333566 -35323865343533623461613937343930666438316634623964616564613831646162616130343431 -61343334336161323835363534343762386436653865383965646434383434626231663534626435 -63396231346363313231326538366635626230383631616238646330316532636362303164386131 -30643839306337373734383632633430653061393066636662633765623037643963343066623436 -66323039653930666332666331303965343234356163326264393435393633613063376433613634 -66643133636665656166666161653030396262376230366434363733613035663036393563376465 -35356265636331353237343039313065656165346232303739343037656536393764323765393265 -30363332303563663662656634613934306362363532623135383430366532383139643637306435 -37356138383239663563623037666365643062613637643332336239623437363336393062663534 -64626564656364313066316639353662333962353736353134653464653634613839366465393164 -66333562346130613664306466346564643239333138363962656134623739376266623130623730 -35393461623761646233613465366661623031353565653033623835616239623835353531346230 -30323364326339316333613032366130666139636338383031643734623761303237356465626362 -30663666623732656437626434366430343731333239353562613134323564626562303266656130 -39653139396561663961316432633562323031376135643737303033363236636238333861373935 -39373831613732303662 +31623366616135336561313133316264353263633634363334643861386266323764636136363839 +3435383136303763623138616331653036663535346337350a303738623865626335393439316165 +32666261646539623934306636653935633837653235356434323930303639353738636631346233 +3037316334313732640a373766336464373132393965313231656262366434313731313730616533 +31303366363835326666313539336233353139656231303636656431383433633439623230303439 +37333438636138343863313939353534373835336163643333636334356238376435363836323831 +37666634636238303437306563393034373134643762383237373934326439643063316535353230 +37623962666166393630623564643866343665643435306534346564396236383063393163363332 +37616231323639326565383066656432633934663066316438336266333335643031383866376138 +32353963393038346230663936343663343936393339393663396436656136623261336665393862 +62383937636630373161363533346263306363613731626166633462386332383832653732626637 +30313766333039343438623563383461633736616632626461616562666632343762643732653832 +66336264386264373938643162316135623261306439313233653636386266616433633836663834 +36376538303836303030666232656132346136656338326262303335646261333562653037313037 +34313237613234326166616132313232306265316333666630363837306233633664373164313536 +30643534363062306634656666393932636561393963613964626430383637393636336261376564 +38363064343566663730343864373331306363386330396165613539313838323934316363646362 +37333235336135393964623834383038626162646232646131613363386162303933623337333232 +30613036306566656635653330396638626164316433303061363932653537343539653334313863 +31626361613964376333303939643663363538356637376331393230333463336330363761373230 +66303365626139633462366637626437656431396635323962313433383232396533363538306532 +31373835643063356631303035343161626466336631386636396133656238386265653762656337 +61313362666537306437366365643066313031396239313535323062343063326364353035653762 +31663264646130653633336165656331613636306633313232626562623336633765663939343636 +62613238343462636238323033366135356563396631343639343166663635666361613031373661 +66336462636663626566316136656436373062326362326363626566616332623863376266653366 +34633739343431383538373437323761366139653162663234653836636435383835363661643535 +35373831313737663632333435643037656335663537326534336331636236346536386637653966 +32366462323263386631616666646461623434343036303631306633636632383966333631376438 +31313864643361353665333663323738333031613864613636353139663736343638356632656337 +34336530333330633837393633383030623365326235366132333633346465373166343039396333 +65336462666438303961393264393238383465356364326261363261633630666138373337313139 +35323435333037333935633331663563653133623136613838343137643230343037386332343966 +35393730346133303234326135303035386462333738396265623132616439353361643564313734 +38643632333863616632386564643035653136313663663330333561663137333634303864346337 +31613832656538623361393039376638373435643234383738366439383363663666376630383239 +35386632356431356465303037346638333038353464353935646561643864613839323839386533 +36306433306532333630613666616636346331306637643734646430636634366130393561346132 +31323434646231653534663366396238323234313630333064623834336437313861313636366363 +65323265363636306634346436613065336639383362313364313736313238616434353263356466 +32393464306234363064656435316239343331316130373238656162336364356266326265633361 +63333037333637323332306261636462313734373062653538656630393837653837613963616632 +61343236316639326432636265396563376337343235336439343661373031303331336165373439 +32323763396265356462623438323333333266653634393935353733373666643637346436303664 +39646463623936356430303961626131393363636263663133623534323139383939636363313565 +31386130353662386339656535393730393564356530356361323730663366396366643730393835 +62303861343964363035366538623139393735396562356465333130306465306639346231653432 +39623161323831623239613433396264663431306134346637353137613831393536346164333032 +39363137333865663762326634656363336138323662623035316262393031336462346164376635 +33396338313335343139393635386436333465373030386663386463353736373465393061636236 +32616534346166326363646337393035393530323066656338333964656237666462393263346364 +32316162383763363030376634643835643338333966323230346232363230326338626364376463 +39343238343438373565323133653838333266653534633966343135663061353733333064633437 +62326162316636383637626164393133303764643637386336353734626561383432336266356531 +32316263356238356632626338386162356663333561333938343839643732313039626665623766 +38323735323339303535616138623732376536366166356165623535643432393662616463353130 +65646633316533383366326362613934346262326165386239376264656365306637303237356537 +39366138383736353364393435616637326635663664383462386162653461623464336365306438 +30626232383461336464653830366565663463643562616263323935323635393037653938613863 +33326131663736386239633763653963663064323965633564663737386635343630303536633163 +36303932376464346266626565613939386636343566366432393664373330373465356337633537 +38353135353939633438653464656361363164343835353639336662616363636134356462393333 +38636162303662393061633461366437393161363966396434653236313232616266633434386334 +63376430666666346335376661383831346565633862303936386536656137303734666436343130 +34653262613936643533353530303066316235336563323339653932623063393861323630373465 +65303736663065336163306634643933616663313631313937306532623737366531393139666637 +37383532353832643561323433616366633539323664383634366638343630376438616131623434 +38633739636430353432663431613832396462363836323566653537636334353966323135306666 +37313431383264663536333934643734323433373939653037643464386564393634303231396338 +30336334336265373138616664623961636639376235373330303766663665613365636465393533 +63623163353533393363373932316138353964613265306136376433376562376664386430663034 +63643537643565353662383265663364633135323735663338333735396638303163373339633365 +39376234333461396134653661613466356134323439326136386562313166366434376561633935 +65356633343336383638316331633863346639383039373437346366303633306565393862383734 +37366261346430623235336336633137653464316361376361623439306139633861613463373237 +63383738326566643930636237656331353035333265333236363464323637313635313063656133 +61326464626636623162393339363264643235653137663538316461306665313163353964353438 +61346261336366343461376263613232653061363736363037656562613931663739643062613237 +35623137333237323731643061323739656333316162363664366439363364643166363833636666 +64636331336135616330383638666330633066616163663430623432303837313635636636646161 +34396339623463383833623930346662343761376162356637376131336238616663663464333564 +36363066666134666230383832636535386432643166613032613334323937623164626632373261 +62376135363436306532303533373134303835353638653762656535353466336639303634623231 +31313035316439386264626438383062613664356264643565346638353936373036393235653939 +65373035633030363133303232363031333331373739373734323539323562626366343561643936 +38663136353835663463383233656264663438306564653430663835643565353764386464313736 +63643938383332613462336532646533326262333537353733333931393661386539666632663130 +30306137633363353965353165383366613436666664613734343234306133633335316363386439 +64363735613962353638336134373837343830623132376161383334353364336237653435626537 +65346436326364643637323763623130393731326630646263643138626161346436326131366436 +36623438646633336131356130646536316333646663316535396666616639396131393835346435 +36616463393065396230663161326364373165316236623335656165316539356664626131383261 +30646536643539313430303034646139316234323064316463383830346166303061646362663063 +66613765636163353438666264363931663838303534623131626434346436613062656639373266 +37663531333036303334373633353365373361626363313530666237643131393938393335643233 +38343331313630616633333434613733393732643039306532633233643931353363613563646465 +6637