From 870f6ffee2833c6d4ebb79518ff9eac4fa00f453 Mon Sep 17 00:00:00 2001 From: Jason Kulatunga Date: Fri, 26 Jan 2024 22:01:34 -0800 Subject: [PATCH] added test to verify that wizard resource creation works correctly. update fasten-sources (contains fix for silently ignoring failures during wizard resource creation). fixed file upload error in wizard. Fixed data structure error in wizard for DocumentReference. fixes #393 --- backend/pkg/web/handler/account.go | 2 +- .../pkg/web/handler/resource_related_test.go | 143 ++++++++++++++++++ backend/pkg/web/handler/testdata/related.json | 69 +++++++++ ...ecord-wizard-add-attachment.component.html | 2 +- ...-record-wizard-add-attachment.component.ts | 7 +- .../medical-record-wizard.utilities.ts | 13 +- .../medical-sources.component.html | 2 +- .../assets/favicon/android-chrome-300x300.png | Bin 0 -> 10622 bytes go.mod | 2 +- go.sum | 4 +- 10 files changed, 228 insertions(+), 16 deletions(-) create mode 100644 backend/pkg/web/handler/resource_related_test.go create mode 100644 backend/pkg/web/handler/testdata/related.json create mode 100644 frontend/src/assets/favicon/android-chrome-300x300.png diff --git a/backend/pkg/web/handler/account.go b/backend/pkg/web/handler/account.go index c90aad64..453cb959 100644 --- a/backend/pkg/web/handler/account.go +++ b/backend/pkg/web/handler/account.go @@ -8,7 +8,7 @@ import ( "net/http" ) -// SECURITY: this is a secure endpoint, and should only be called after a double confirmation +// UX: this is a secure endpoint, and should only be called after a double confirmation func DeleteAccount(c *gin.Context) { logger := c.MustGet(pkg.ContextKeyTypeLogger).(*logrus.Entry) databaseRepo := c.MustGet(pkg.ContextKeyTypeDatabase).(database.DatabaseRepository) diff --git a/backend/pkg/web/handler/resource_related_test.go b/backend/pkg/web/handler/resource_related_test.go new file mode 100644 index 00000000..944b20a8 --- /dev/null +++ b/backend/pkg/web/handler/resource_related_test.go @@ -0,0 +1,143 @@ +package handler + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "github.com/fastenhealth/fasten-onprem/backend/pkg" + mock_config "github.com/fastenhealth/fasten-onprem/backend/pkg/config/mock" + "github.com/fastenhealth/fasten-onprem/backend/pkg/database" + "github.com/fastenhealth/fasten-onprem/backend/pkg/event_bus" + "github.com/fastenhealth/fasten-onprem/backend/pkg/models" + "github.com/gin-gonic/gin" + "github.com/golang/mock/gomock" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "io" + "io/ioutil" + "log" + "mime/multipart" + "net/http" + "net/http/httptest" + "os" + "testing" +) + +// Go through this page to understand how this file is structured. +// https://pkg.go.dev/github.com/stretchr/testify/suite#section-documentation + +// Define the suite, and absorb the built-in basic suite +// functionality from testify - including a T() method which +// returns the current testing context +type ResourceRelatedHandlerTestSuite struct { + suite.Suite + MockCtrl *gomock.Controller + TestDatabase *os.File + + AppConfig *mock_config.MockInterface + AppRepository database.DatabaseRepository + AppEventBus event_bus.Interface +} + +// BeforeTest has a function to be executed right before the test starts and receives the suite and test names as input +func (suite *ResourceRelatedHandlerTestSuite) BeforeTest(suiteName, testName string) { + suite.MockCtrl = gomock.NewController(suite.T()) + + dbFile, err := ioutil.TempFile("", fmt.Sprintf("%s.*.db", testName)) + if err != nil { + log.Fatal(err) + } + suite.TestDatabase = dbFile + + appConfig := mock_config.NewMockInterface(suite.MockCtrl) + appConfig.EXPECT().GetString("database.location").Return(suite.TestDatabase.Name()).AnyTimes() + appConfig.EXPECT().GetString("database.type").Return("sqlite").AnyTimes() + appConfig.EXPECT().IsSet("database.encryption.key").Return(false).AnyTimes() + appConfig.EXPECT().GetString("log.level").Return("INFO").AnyTimes() + suite.AppConfig = appConfig + + appRepo, err := database.NewRepository(suite.AppConfig, logrus.WithField("test", suite.T().Name()), event_bus.NewNoopEventBusServer()) + suite.AppRepository = appRepo + + suite.AppEventBus = event_bus.NewNoopEventBusServer() + + appRepo.CreateUser(context.Background(), &models.User{ + Username: "test_username", + Password: "test", + }) + +} + +// AfterTest has a function to be executed right after the test finishes and receives the suite and test names as input +func (suite *ResourceRelatedHandlerTestSuite) AfterTest(suiteName, testName string) { + suite.MockCtrl.Finish() + os.Remove(suite.TestDatabase.Name()) +} + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestResourceRelatedHandlerTestSuite(t *testing.T) { + suite.Run(t, new(ResourceRelatedHandlerTestSuite)) +} + +func (suite *ResourceRelatedHandlerTestSuite) TestResourceRelatedHandlerTestSuite() { + //setup + w := httptest.NewRecorder() + ctx, _ := gin.CreateTestContext(w) + ctx.Set(pkg.ContextKeyTypeLogger, logrus.WithField("test", suite.T().Name())) + ctx.Set(pkg.ContextKeyTypeDatabase, suite.AppRepository) + ctx.Set(pkg.ContextKeyTypeConfig, suite.AppConfig) + ctx.Set(pkg.ContextKeyTypeEventBusServer, suite.AppEventBus) + ctx.Set(pkg.ContextKeyTypeAuthUsername, "test_username") + + //test + relatedJsonForm, relatedJsonWriter := createMultipartFormData(suite.T(), "file", "testdata/related.json") // just pass the file name + relatedReq, err := http.NewRequest("POST", "/api/v1/resource/related", &relatedJsonForm) + // set the content type, this will contain the boundary. + relatedReq.Header.Set("Content-Type", relatedJsonWriter.FormDataContentType()) + ctx.Request = relatedReq + require.NoError(suite.T(), err) + + CreateRelatedResources(ctx) + + var responseWrapper models.ResponseWrapper + err = json.Unmarshal(w.Body.Bytes(), &responseWrapper) + require.NoError(suite.T(), err) + + summary := responseWrapper.Data.(map[string]interface{}) + + //assert + assert.EqualValues(suite.T(), http.StatusOK, w.Code) + assert.Equal(suite.T(), summary["TotalResources"], 3) + +} + +// https://stackoverflow.com/a/56696333/1157633 +func createMultipartFormData(t *testing.T, fieldName, fileName string) (bytes.Buffer, *multipart.Writer) { + var b bytes.Buffer + var err error + w := multipart.NewWriter(&b) + var fw io.Writer + file := mustOpen(fileName) + if fw, err = w.CreateFormFile(fieldName, file.Name()); err != nil { + t.Errorf("Error creating writer: %v", err) + } + if _, err = io.Copy(fw, file); err != nil { + t.Errorf("Error with io.Copy: %v", err) + } + w.Close() + return b, w +} + +func mustOpen(f string) *os.File { + r, err := os.Open(f) + if err != nil { + pwd, _ := os.Getwd() + fmt.Println("PWD: ", pwd) + panic(err) + } + return r +} diff --git a/backend/pkg/web/handler/testdata/related.json b/backend/pkg/web/handler/testdata/related.json new file mode 100644 index 00000000..b4d279b5 --- /dev/null +++ b/backend/pkg/web/handler/testdata/related.json @@ -0,0 +1,69 @@ +{ + "resourceType": "List", + "entry": [], + "encounter": { + "reference": "Encounter/4e4e6346-2350-47c0-ba73-ee0fdaf3a8a7" + }, + "contained": [ + { + "resourceType": "Encounter", + "id": "4e4e6346-2350-47c0-ba73-ee0fdaf3a8a7", + "serviceType": { + "id": "562", + "identifier": [ + { + "system": "http://terminology.hl7.org/CodeSystem/service-type", + "code": "562", + "display": "Test Message" + } + ], + "text": "Test Message" + }, + "status": "finished", + "participant": [], + "period": { + "start": "2024-01-04T08:00:00.000Z", + "end": "2024-01-27T08:00:00.000Z" + }, + "reasonReference": [], + "serviceProvider": {} + }, + { + "id": "4e2611e4-df0d-4dae-ad32-1c90537b32af", + "resourceType": "Binary", + "contentType": "application/pdf", + "data": "JVBERi0xLjcKCjEgMCBvYmogICUgZW50cnkgcG9pbnQKPDwKICAvVHlwZSAvQ2F0YWxvZwogIC9QYWdlcyAyIDAgUgo+PgplbmRvYmoKCjIgMCBvYmoKPDwKICAvVHlwZSAvUGFnZXMKICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCiAgL0NvdW50IDEKICAvS2lkcyBbIDMgMCBSIF0KPj4KZW5kb2JqCgozIDAgb2JqCjw8CiAgL1R5cGUgL1BhZ2UKICAvUGFyZW50IDIgMCBSCiAgL1Jlc291cmNlcyA8PAogICAgL0ZvbnQgPDwKICAgICAgL0YxIDQgMCBSIAogICAgPj4KICA+PgogIC9Db250ZW50cyA1IDAgUgo+PgplbmRvYmoKCjQgMCBvYmoKPDwKICAvVHlwZSAvRm9udAogIC9TdWJ0eXBlIC9UeXBlMQogIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KPj4KZW5kb2JqCgo1IDAgb2JqICAlIHBhZ2UgY29udGVudAo8PAogIC9MZW5ndGggNDQKPj4Kc3RyZWFtCkJUCjcwIDUwIFRECi9GMSAxMiBUZgooSGVsbG8sIHdvcmxkISkgVGoKRVQKZW5kc3RyZWFtCmVuZG9iagoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDEwIDAwMDAwIG4gCjAwMDAwMDAwNzkgMDAwMDAgbiAKMDAwMDAwMDE3MyAwMDAwMCBuIAowMDAwMDAwMzAxIDAwMDAwIG4gCjAwMDAwMDAzODAgMDAwMDAgbiAKdHJhaWxlcgo8PAogIC9TaXplIDYKICAvUm9vdCAxIDAgUgo+PgpzdGFydHhyZWYKNDkyCiUlRU9G" + }, + { + "id": "53066674-9e89-41e9-95d9-8eaf24b41ea6", + "resourceType": "DocumentReference", + "status": "current", + "category": [ + { + "coding": [ + { + "system": "http://loinc.org", + "code": "11488-4", + "display": "Consult Note" + } + ], + "text": "Consult Note" + } + ], + "content": [ + { + "attachment": { + "contentType": "application/pdf", + "url": "urn:uuid:4e2611e4-df0d-4dae-ad32-1c90537b32af", + "title": "test attachment" + } + } + ], + "context": { + "encounter": [{ + "reference": "Encounter/4e4e6346-2350-47c0-ba73-ee0fdaf3a8a7" + }] + } + } + ] +} diff --git a/frontend/src/app/components/medical-record-wizard-add-attachment/medical-record-wizard-add-attachment.component.html b/frontend/src/app/components/medical-record-wizard-add-attachment/medical-record-wizard-add-attachment.component.html index c086344c..f5e97822 100644 --- a/frontend/src/app/components/medical-record-wizard-add-attachment/medical-record-wizard-add-attachment.component.html +++ b/frontend/src/app/components/medical-record-wizard-add-attachment/medical-record-wizard-add-attachment.component.html @@ -30,7 +30,7 @@
- +
diff --git a/frontend/src/app/components/medical-record-wizard-add-attachment/medical-record-wizard-add-attachment.component.ts b/frontend/src/app/components/medical-record-wizard-add-attachment/medical-record-wizard-add-attachment.component.ts index ed39600b..c94ed3b4 100644 --- a/frontend/src/app/components/medical-record-wizard-add-attachment/medical-record-wizard-add-attachment.component.ts +++ b/frontend/src/app/components/medical-record-wizard-add-attachment/medical-record-wizard-add-attachment.component.ts @@ -41,15 +41,16 @@ export class MedicalRecordWizardAddAttachmentComponent implements OnInit { console.log("onAttachmentFileChange") let fileInput = $event.target as HTMLInputElement; if (fileInput.files && fileInput.files[0]) { + let processingFile = fileInput.files[0] let reader = new FileReader(); reader.onloadend = () => { // use a regex to remove data url part const base64String = (reader.result as string).replace('data:', '').replace(/^.+,/, ''); this.newAttachmentForm.get('file_content').setValue(base64String) }; - reader.readAsDataURL(fileInput.files[0]); - this.newAttachmentForm.get('file_name').setValue(fileInput.files[0].name) - this.newAttachmentForm.get('file_size').setValue(fileInput.files[0].size) + reader.readAsDataURL(processingFile); + this.newAttachmentForm.get('file_name').setValue(processingFile.name) + this.newAttachmentForm.get('file_size').setValue(processingFile.size) } } diff --git a/frontend/src/app/components/medical-record-wizard/medical-record-wizard.utilities.ts b/frontend/src/app/components/medical-record-wizard/medical-record-wizard.utilities.ts index 80569ee2..fbbd4ff4 100644 --- a/frontend/src/app/components/medical-record-wizard/medical-record-wizard.utilities.ts +++ b/frontend/src/app/components/medical-record-wizard/medical-record-wizard.utilities.ts @@ -371,13 +371,12 @@ function resourceAttachmentToR4DocumentReference(resourceStorage: ResourceStorag } } ], - context: [ - { - encounter: { - reference: generateReferenceUriFromResourceOrReference(encounterResource) //Encounter - }, - } - ] + context: { + encounter: [{ + reference: generateReferenceUriFromResourceOrReference(encounterResource) //Encounter + }], + } + // date: `${new Date(resourceDocumentReference.date.year,resourceDocumentReference.date.month-1,resourceDocumentReference.date.day).toISOString()}`, } as DocumentReference resourceStorage['DocumentReference'][documentReferenceResource.id] = documentReferenceResource diff --git a/frontend/src/app/pages/medical-sources/medical-sources.component.html b/frontend/src/app/pages/medical-sources/medical-sources.component.html index ed1266e2..dcc3390b 100644 --- a/frontend/src/app/pages/medical-sources/medical-sources.component.html +++ b/frontend/src/app/pages/medical-sources/medical-sources.component.html @@ -19,7 +19,7 @@

In Sandbox mode Fasten Health cannot access real patient information. You must use Sandbox credentials when authenticating to healthcare sources. - These credentials are available on Github + These credentials are available in our Sandbox Guide diff --git a/frontend/src/assets/favicon/android-chrome-300x300.png b/frontend/src/assets/favicon/android-chrome-300x300.png new file mode 100644 index 0000000000000000000000000000000000000000..c5ae4f845edd755808d741ca880cb7b488784b46 GIT binary patch literal 10622 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 GVgCot!{C(w literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod index bdb38408..c3c331ab 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/dave/jennifer v1.6.1 github.com/dominikbraun/graph v0.15.0 github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3 - github.com/fastenhealth/fasten-sources v0.5.5 + github.com/fastenhealth/fasten-sources v0.5.6 github.com/fastenhealth/gofhir-models v0.0.6 github.com/gin-gonic/gin v1.9.0 github.com/go-gormigrate/gormigrate/v2 v2.1.1 diff --git a/go.sum b/go.sum index 7678d3bc..f1e1a216 100644 --- a/go.sum +++ b/go.sum @@ -101,8 +101,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fastenhealth/fasten-sources v0.5.5 h1:+vOIG7R/J7QxEZrrfPFfaBzqYU5eDu7x/bc/cgOjvW4= -github.com/fastenhealth/fasten-sources v0.5.5/go.mod h1:hUQATAu5KrxKbACJoVt4iEKIGnRtmiOmHz+5TLfyiCM= +github.com/fastenhealth/fasten-sources v0.5.6 h1:F4Qmw9ABLSkqkWncoSnChBRDVWLrzkJv+z4z/Ue/fdc= +github.com/fastenhealth/fasten-sources v0.5.6/go.mod h1:hUQATAu5KrxKbACJoVt4iEKIGnRtmiOmHz+5TLfyiCM= github.com/fastenhealth/gofhir-models v0.0.6 h1:yJYYaV1eJtHiGEfA1rXLsyOm/9hIi6s2cGoZzGfW1tM= github.com/fastenhealth/gofhir-models v0.0.6/go.mod h1:xB8ikGxu3bUq2b1JYV+CZpHqBaLXpOizFR0eFBCunis= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=