Skip to content

Commit

Permalink
feat: stratify breast cancer screening results based on questionnaire…
Browse files Browse the repository at this point in the history
… response (#365)
  • Loading branch information
Salaton committed Feb 17, 2024
1 parent 39e146d commit f39a76a
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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{},
Expand All @@ -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),
Expand Down
46 changes: 45 additions & 1 deletion pkg/clinical/usecases/clinical/questionnaire_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")
}
Expand Down
119 changes: 112 additions & 7 deletions pkg/clinical/usecases/clinical/questionnaire_response_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down

0 comments on commit f39a76a

Please sign in to comment.