From f39a76a91936852fe2196b35e1ed84ab62e54109 Mon Sep 17 00:00:00 2001 From: Salaton Date: Sat, 17 Feb 2024 16:47:32 +0300 Subject: [PATCH] feat: stratify breast cancer screening results based on questionnaire response (#365) --- .../cloudhealthcare/mock/fhir_mock.go | 5 +- .../clinical/questionnaire_response.go | 46 ++++++- .../clinical/questionnaire_response_test.go | 119 ++++++++++++++++-- 3 files changed, 160 insertions(+), 10 deletions(-) diff --git a/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go b/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go index 1db86b03..e03cd831 100644 --- a/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go +++ b/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go @@ -2000,6 +2000,7 @@ func NewFHIRMock() *FHIRMock { }, nil }, MockGetFHIRQuestionnaireFn: func(ctx context.Context, id string) (*domain.FHIRQuestionnaireRelayPayload, error) { + name := gofakeit.Name() resource := &domain.FHIRQuestionnaire{ ID: new(string), Meta: &domain.FHIRMetaInput{}, @@ -2010,8 +2011,8 @@ func NewFHIRMock() *FHIRMock { ModifierExtension: []*domain.Extension{}, Identifier: []*domain.FHIRIdentifier{}, Version: new(string), - Name: new(string), - Title: new(string), + Name: &name, + Title: &name, DerivedFrom: []*string{}, Experimental: new(bool), Publisher: new(string), diff --git a/pkg/clinical/usecases/clinical/questionnaire_response.go b/pkg/clinical/usecases/clinical/questionnaire_response.go index ed04cd6b..07907015 100644 --- a/pkg/clinical/usecases/clinical/questionnaire_response.go +++ b/pkg/clinical/usecases/clinical/questionnaire_response.go @@ -108,7 +108,7 @@ func (u *UseCasesClinicalImpl) generateQuestionnaireReviewSummary( return "", err } - switch *questionnaire.Resource.Name { + switch *questionnaire.Resource.Title { // TODO: Make this a controlled enum? case "Cervical Cancer Screening": var symptomsScore, riskFactorsScore, totalScore int @@ -160,6 +160,50 @@ func (u *UseCasesClinicalImpl) generateQuestionnaireReviewSummary( return "", err } } + + case "Breast Cancer Screening": + var riskScore int + + for _, item := range questionnaireResponse.Item { + if item.LinkID == "risk-assessment" { + for _, answer := range item.Item { + if answer.LinkID == "high-risk" { + for _, ans := range answer.Item { + if ans.LinkID == "high-risk-score" { + riskScore = *ans.Answer[0].ValueInteger + } + } + } + } + } + } + + if riskScore >= 1 { + riskLevel, err = u.recordRiskAssessment( + ctx, + encounter, + questionnaireResponseID, + common.HighRiskCIELCode, + "High Risk", + domain.BreastCancerScreeningTypeEnum.String(), + ) + if err != nil { + return "", err + } + } else { + riskLevel, err = u.recordRiskAssessment( + ctx, + encounter, + questionnaireResponseID, + common.HighRiskCIELCode, + "Average Risk", + domain.BreastCancerScreeningTypeEnum.String(), + ) + if err != nil { + return "", err + } + } + default: return "", fmt.Errorf("questionnaire does not exist") } diff --git a/pkg/clinical/usecases/clinical/questionnaire_response_test.go b/pkg/clinical/usecases/clinical/questionnaire_response_test.go index 89465c9f..068d1d7c 100644 --- a/pkg/clinical/usecases/clinical/questionnaire_response_test.go +++ b/pkg/clinical/usecases/clinical/questionnaire_response_test.go @@ -23,8 +23,9 @@ func setupMockFHIRFunctions(fakeFHIR *fakeFHIRMock.FHIRMock, score int) { questionnaireName := "Cervical Cancer Screening" return &domain.FHIRQuestionnaireRelayPayload{ Resource: &domain.FHIRQuestionnaire{ - ID: &ID, - Name: &questionnaireName, + ID: &ID, + Name: &questionnaireName, + Title: &questionnaireName, }, }, nil } @@ -183,6 +184,24 @@ func TestUseCasesClinicalImpl_CreateQuestionnaireResponse(t *testing.T) { }, wantErr: true, }, + { + name: "Happy Case - Create questionnaire response and generate review summary - Breast Cancer - High Risk", + args: args{ + ctx: context.Background(), + encounterID: gofakeit.UUID(), + questionnaireID: gofakeit.UUID(), + }, + wantErr: false, + }, + { + name: "Happy Case - Create questionnaire response and generate review summary - Breast Cancer - Low Risk", + args: args{ + ctx: context.Background(), + encounterID: gofakeit.UUID(), + questionnaireID: gofakeit.UUID(), + }, + wantErr: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -233,8 +252,9 @@ func TestUseCasesClinicalImpl_CreateQuestionnaireResponse(t *testing.T) { questionnaireName := "Cervical Cancer Screening" return &domain.FHIRQuestionnaireRelayPayload{ Resource: &domain.FHIRQuestionnaire{ - ID: &ID, - Name: &questionnaireName, + ID: &ID, + Name: &questionnaireName, + Title: &questionnaireName, }, }, nil } @@ -281,8 +301,9 @@ func TestUseCasesClinicalImpl_CreateQuestionnaireResponse(t *testing.T) { questionnaireName := "Cervical Cancer Screening" return &domain.FHIRQuestionnaireRelayPayload{ Resource: &domain.FHIRQuestionnaire{ - ID: &ID, - Name: &questionnaireName, + ID: &ID, + Name: &questionnaireName, + Title: &questionnaireName, }, }, nil } @@ -323,12 +344,96 @@ func TestUseCasesClinicalImpl_CreateQuestionnaireResponse(t *testing.T) { } } + if tt.name == "Happy Case - Create questionnaire response and generate review summary - Breast Cancer - High Risk" { + fakeFHIR.MockGetFHIRQuestionnaireFn = func(ctx context.Context, id string) (*domain.FHIRQuestionnaireRelayPayload, error) { + questionnaireName := "Breast Cancer Screening" + return &domain.FHIRQuestionnaireRelayPayload{ + Resource: &domain.FHIRQuestionnaire{ + ID: &ID, + Name: &questionnaireName, + Title: &questionnaireName, + }, + }, nil + } + + score := 3 + fakeFHIR.MockCreateFHIRQuestionnaireResponseFn = func(ctx context.Context, input *domain.FHIRQuestionnaireResponse) (*domain.FHIRQuestionnaireResponse, error) { + return &domain.FHIRQuestionnaireResponse{ + ID: &ID, + Item: []domain.FHIRQuestionnaireResponseItem{ + { + LinkID: "risk-assessment", + Item: []domain.FHIRQuestionnaireResponseItem{ + { + LinkID: "high-risk", + + Item: []domain.FHIRQuestionnaireResponseItem{ + { + LinkID: "high-risk-score", + Answer: []domain.FHIRQuestionnaireResponseItemAnswer{ + { + ValueInteger: &score, + }, + }, + }, + }, + }, + }, + }, + }, + }, nil + } + + } + + if tt.name == "Happy Case - Create questionnaire response and generate review summary - Breast Cancer - Low Risk" { + fakeFHIR.MockGetFHIRQuestionnaireFn = func(ctx context.Context, id string) (*domain.FHIRQuestionnaireRelayPayload, error) { + questionnaireName := "Breast Cancer Screening" + return &domain.FHIRQuestionnaireRelayPayload{ + Resource: &domain.FHIRQuestionnaire{ + ID: &ID, + Name: &questionnaireName, + Title: &questionnaireName, + }, + }, nil + } + + score := 0 + fakeFHIR.MockCreateFHIRQuestionnaireResponseFn = func(ctx context.Context, input *domain.FHIRQuestionnaireResponse) (*domain.FHIRQuestionnaireResponse, error) { + return &domain.FHIRQuestionnaireResponse{ + ID: &ID, + Item: []domain.FHIRQuestionnaireResponseItem{ + { + LinkID: "risk-assessment", + Item: []domain.FHIRQuestionnaireResponseItem{ + { + LinkID: "high-risk", + + Item: []domain.FHIRQuestionnaireResponseItem{ + { + LinkID: "high-risk-score", + Answer: []domain.FHIRQuestionnaireResponseItemAnswer{ + { + ValueInteger: &score, + }, + }, + }, + }, + }, + }, + }, + }, + }, nil + } + } + if tt.name == "Sad Case - non-existent fhir questionnaire" { randomName := gofakeit.BeerName() fakeFHIR.MockGetFHIRQuestionnaireFn = func(ctx context.Context, id string) (*domain.FHIRQuestionnaireRelayPayload, error) { return &domain.FHIRQuestionnaireRelayPayload{ Resource: &domain.FHIRQuestionnaire{ - Name: &randomName, + Name: &randomName, + Title: &randomName, }, }, nil }