blob: aa9fbc06b037f80552bf90bed837e9630f81ac50 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package fhirio
import (
"bytes"
"errors"
"io"
"net/http"
"testing"
"github.com/apache/beam/sdks/v2/go/pkg/beam"
"google.golang.org/api/healthcare/v1"
)
var (
testOperationResult = operationResults{Successes: 5, Failures: 2}
fakeRequestReturnErrorMessage = "internal error"
requestReturnErrorFakeClient = &fakeFhirStoreClient{
fakeReadResources: func([]byte) (*http.Response, error) {
return nil, errors.New(fakeRequestReturnErrorMessage)
},
fakeExecuteBundles: func(string, string) (*http.Response, error) {
return nil, errors.New(fakeRequestReturnErrorMessage)
},
fakeSearch: func(string, string, map[string]string, string) (*http.Response, error) {
return nil, errors.New(fakeRequestReturnErrorMessage)
},
fakeDeidentify: func(string, string, *healthcare.DeidentifyConfig) (operationResults, error) {
return operationResults{}, errors.New(fakeRequestReturnErrorMessage)
},
fakeImportResources: func(string, string, ContentStructure) (operationResults, error) {
return operationResults{}, errors.New(fakeRequestReturnErrorMessage)
},
}
badStatusFakeResponse = &http.Response{
Body: io.NopCloser(bytes.NewBufferString("response")),
StatusCode: http.StatusForbidden,
}
badStatusFakeClient = &fakeFhirStoreClient{
fakeReadResources: func([]byte) (*http.Response, error) {
return badStatusFakeResponse, nil
},
fakeExecuteBundles: func(string, string) (*http.Response, error) {
return badStatusFakeResponse, nil
},
fakeSearch: func(string, string, map[string]string, string) (*http.Response, error) {
return badStatusFakeResponse, nil
},
}
fakeBodyReaderErrorMessage = "ReadAll fail"
bodyReaderErrorFakeResponse = &http.Response{
Body: &fakeReaderCloser{
fakeRead: func([]byte) (int, error) {
return 0, errors.New(fakeBodyReaderErrorMessage)
},
},
StatusCode: http.StatusOK,
}
bodyReaderErrorFakeClient = &fakeFhirStoreClient{
fakeReadResources: func([]byte) (*http.Response, error) {
return bodyReaderErrorFakeResponse, nil
},
fakeExecuteBundles: func(string, string) (*http.Response, error) {
return bodyReaderErrorFakeResponse, nil
},
fakeSearch: func(string, string, map[string]string, string) (*http.Response, error) {
return bodyReaderErrorFakeResponse, nil
},
}
emptyBodyReaderFakeResponse = &http.Response{
Body: io.NopCloser(bytes.NewBuffer(nil)),
StatusCode: http.StatusOK,
}
emptyResponseBodyFakeClient = &fakeFhirStoreClient{
fakeExecuteBundles: func(string, string) (*http.Response, error) {
return emptyBodyReaderFakeResponse, nil
},
fakeSearch: func(string, string, map[string]string, string) (*http.Response, error) {
return emptyBodyReaderFakeResponse, nil
},
}
)
type fakeFhirStoreClient struct {
fakeReadResources func([]byte) (*http.Response, error)
fakeExecuteBundles func(string, string) (*http.Response, error)
fakeSearch func(string, string, map[string]string, string) (*http.Response, error)
fakeDeidentify func(string, string, *healthcare.DeidentifyConfig) (operationResults, error)
fakeImportResources func(string, string, ContentStructure) (operationResults, error)
}
func (c *fakeFhirStoreClient) executeBundle(storePath, bundle string) (*http.Response, error) {
return c.fakeExecuteBundles(storePath, bundle)
}
func (c *fakeFhirStoreClient) readResource(resourcePath []byte) (*http.Response, error) {
return c.fakeReadResources(resourcePath)
}
func (c *fakeFhirStoreClient) search(storePath, resourceType string, queries map[string]string, pageToken string) (*http.Response, error) {
return c.fakeSearch(storePath, resourceType, queries, pageToken)
}
func (c *fakeFhirStoreClient) deidentify(srcStorePath, dstStorePath string, deidConfig *healthcare.DeidentifyConfig) (operationResults, error) {
return c.fakeDeidentify(srcStorePath, dstStorePath, deidConfig)
}
func (c *fakeFhirStoreClient) importResources(storePath, gcsURI string, contentStructure ContentStructure) (operationResults, error) {
return c.fakeImportResources(storePath, gcsURI, contentStructure)
}
// Useful to fake the Body of a http.Response.
type fakeReaderCloser struct {
io.Closer
fakeRead func([]byte) (int, error)
}
func (m *fakeReaderCloser) Read(b []byte) (int, error) {
return m.fakeRead(b)
}
func validateCounter(t *testing.T, pipelineResult beam.PipelineResult, expectedCounterName string, expectedCount int) {
t.Helper()
counterResults := pipelineResult.Metrics().Query(func(mr beam.MetricResult) bool {
return mr.Name() == expectedCounterName
}).Counters()
if expectedCount == 0 && len(counterResults) == 0 {
return
}
if len(counterResults) != 1 {
t.Fatalf("got %v counters with name %v, expected 1", len(counterResults), expectedCounterName)
}
counterResult := counterResults[0]
if counterResult.Result() != int64(expectedCount) {
t.Fatalf("counter %v result is %v, expected %v", expectedCounterName, counterResult.Result(), expectedCount)
}
}