Skip to content

Commit

Permalink
feat: patch patient last menstrual period observation
Browse files Browse the repository at this point in the history
- This patches patient's LMP entries
  • Loading branch information
EspiraMarvin committed Feb 1, 2024
1 parent c0e53bc commit a6335e7
Show file tree
Hide file tree
Showing 6 changed files with 282 additions and 6 deletions.
14 changes: 11 additions & 3 deletions pkg/clinical/presentation/graph/clinical.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,11 @@ extend type Query {
# Media
listPatientMedia(patientID: ID!, pagination: Pagination!): MediaConnection

# Questionnaire
listQuestionnaires(searchParam: String, pagination: Pagination!): QuestionnaireConnection!
# Questionnaire
listQuestionnaires(
searchParam: String
pagination: Pagination!
): QuestionnaireConnection!
}

extend type Mutation {
Expand Down Expand Up @@ -198,10 +201,15 @@ extend type Mutation {
patchPatientPulseRate(id: String!, value: String!): Observation!
patchPatientViralLoad(id: String!, value: String!): Observation!
patchPatientMuac(id: String!, value: String!): Observation!
patchPatientLastMenstrualPeriod(id: String!, value: String!): Observation!

# Consent
recordConsent(input: ConsentInput!): ConsentOutput!

# questionnaireResponse
createQuestionnaireResponse(questionnaireID: String!, encounterID: String! input: QuestionnaireResponseInput!): QuestionnaireResponse!
createQuestionnaireResponse(
questionnaireID: String!
encounterID: String!
input: QuestionnaireResponseInput!
): QuestionnaireResponse!
}
6 changes: 6 additions & 0 deletions pkg/clinical/presentation/graph/clinical.resolvers.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

132 changes: 129 additions & 3 deletions pkg/clinical/presentation/graph/generated/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions pkg/clinical/usecases/clinical/observation.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,11 @@ func (c *UseCasesClinicalImpl) PatchPatientMuac(ctx context.Context, id string,
return c.PatchPatientObservations(ctx, id, value)
}

// patchPatientLastMenstrualPeriod patches the last menstrual record of a patient
func (c *UseCasesClinicalImpl) PatchPatientLastMenstrualPeriod(ctx context.Context, id string, value string) (*dto.Observation, error) {
return c.PatchPatientObservations(ctx, id, value)
}

// RecordWeight records a patient's weight
func (c *UseCasesClinicalImpl) RecordWeight(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) {
weightObservation, err := c.RecordObservation(ctx, input, common.WeightCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
Expand Down
130 changes: 130 additions & 0 deletions pkg/clinical/usecases/clinical/observation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5652,6 +5652,136 @@ func TestUseCasesClinicalImpl_RecordLastMenstrualPeriod(t *testing.T) {
}
}

func TestUseCasesClinicalImpl_PatchPatientLastMenstrualPeriod(t *testing.T) {
type args struct {
ctx context.Context
id string
value string
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "Happy Case - successfully patch patient observation",
args: args{
ctx: context.Background(),
id: gofakeit.UUID(),
value: "160",
},
wantErr: false,
},
{
name: "Sad Case - missing observation ID",
args: args{
ctx: context.Background(),
value: "160",
},
wantErr: true,
},
{
name: "Sad Case - Fail validation nil value",
args: args{
ctx: context.Background(),
id: gofakeit.UUID(),
value: "",
},
wantErr: true,
},
{
name: "Sad Case - fail to get observation",
args: args{
ctx: context.Background(),
id: gofakeit.UUID(),
value: "160",
},
wantErr: true,
},
{
name: "Sad Case: fail to get encounter",
args: args{
ctx: context.Background(),
id: gofakeit.UUID(),
value: "160",
},
wantErr: true,
},
{
name: "Sad Case: fail on finished encounter",
args: args{
ctx: context.Background(),
id: gofakeit.UUID(),
value: "160",
},
wantErr: true,
},
{
name: "Sad Case - fail to patch patient last menstrual period observation",
args: args{
ctx: context.Background(),
id: gofakeit.UUID(),
value: "160",
},
wantErr: true,
},
}
for _, tt := range tests {
fakeExt := fakeExtMock.NewFakeBaseExtensionMock()
fakeFHIR := fakeFHIRMock.NewFHIRMock()
fakeOCL := fakeOCLMock.NewFakeOCLMock()
fakePubSub := fakePubSubMock.NewPubSubServiceMock()

fakeUpload := fakeUploadMock.NewFakeUploadMock()

infra := infrastructure.NewInfrastructureInteractor(fakeExt, fakeFHIR, fakeOCL, fakeUpload, fakePubSub)
u := clinicalUsecase.NewUseCasesClinicalImpl(infra)

if tt.name == "Sad Case - fail to get observation" {
fakeFHIR.MockGetFHIRObservationFn = func(ctx context.Context, id string) (*domain.FHIRObservationRelayPayload, error) {
return nil, fmt.Errorf("an error occurred")
}
}

if tt.name == "Sad Case: fail to get encounter" {
fakeFHIR.MockGetFHIREncounterFn = func(ctx context.Context, id string) (*domain.FHIREncounterRelayPayload, error) {
return nil, fmt.Errorf("an error occurred")
}
}

if tt.name == "Sad Case: fail on finished encounter" {
fakeFHIR.MockGetFHIREncounterFn = func(ctx context.Context, id string) (*domain.FHIREncounterRelayPayload, error) {
UUID := uuid.New().String()
PatientRef := "Patient/" + uuid.NewString()
return &domain.FHIREncounterRelayPayload{
Resource: &domain.FHIREncounter{
ID: &UUID,
Text: &domain.FHIRNarrative{},
Identifier: []*domain.FHIRIdentifier{},
Status: domain.EncounterStatusEnum(domain.EncounterStatusEnumFinished),
Subject: &domain.FHIRReference{
ID: &UUID,
Reference: &PatientRef,
},
},
}, nil
}
}

if tt.name == "Sad Case - fail to patch patient last menstrual period observation" {
fakeFHIR.MockPatchFHIRObservationFn = func(ctx context.Context, id string, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) {
return nil, fmt.Errorf("an error occurred")
}
}

_, err := u.PatchPatientLastMenstrualPeriod(tt.args.ctx, tt.args.id, tt.args.value)
if (err != nil) != tt.wantErr {
t.Errorf("UseCasesClinicalImpl.PatchPatientLastMenstrualPeriod() error = %v, wantErr %v", err, tt.wantErr)
return
}
}
}

func TestUseCasesClinicalImpl_GetPatientLastMenstrualPeriodEntries(t *testing.T) {
first := 10
ctx := context.Background()
Expand Down
1 change: 1 addition & 0 deletions pkg/clinical/usecases/usecases.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ type Clinical interface {
PatchPatientPulseRate(ctx context.Context, id string, value string) (*dto.Observation, error)
PatchPatientViralLoad(ctx context.Context, id string, value string) (*dto.Observation, error)
PatchPatientMuac(ctx context.Context, id string, value string) (*dto.Observation, error)
PatchPatientLastMenstrualPeriod(ctx context.Context, id string, value string) (*dto.Observation, error)
RecordHPV(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error)
RecordPapSmear(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error)

Expand Down

0 comments on commit a6335e7

Please sign in to comment.