Skip to content

Commit f387d2f

Browse files
authored
Merge pull request #3902 from nhsuk/cli-generate-fhir-record
Create CLI tool to generate the FHIR record for a given vaccination record
2 parents 8e5323e + bfe5e78 commit f387d2f

3 files changed

Lines changed: 151 additions & 0 deletions

File tree

app/lib/mavis_cli.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@ def self.progress_bar(total)
2525
require_relative "mavis_cli/gias/download"
2626
require_relative "mavis_cli/gias/import"
2727
require_relative "mavis_cli/vaccination_records/sync"
28+
require_relative "mavis_cli/vaccination_records/generate_fhir"
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# frozen_string_literal: true
2+
3+
module MavisCLI
4+
module VaccinationRecords
5+
class GenerateFHIR < Dry::CLI::Command
6+
desc "Generate FHIR record for a given vaccination record"
7+
argument :vaccination_record_id, desc: "The ID of the vaccination record"
8+
9+
def call(vaccination_record_id:, **)
10+
MavisCLI.load_rails
11+
12+
vaccination_record =
13+
::VaccinationRecord.find_by(id: vaccination_record_id)
14+
15+
if vaccination_record.nil?
16+
puts "Error: Vaccination record with ID #{vaccination_record_id} not found"
17+
return
18+
end
19+
20+
if vaccination_record.not_administered?
21+
outcome = vaccination_record.outcome.humanize
22+
puts "Error: Vaccination record with ID #{vaccination_record_id} was not administered (Outcome: #{outcome})"
23+
return
24+
end
25+
26+
fhir_record = vaccination_record.fhir_record
27+
fhir_json = fhir_record.to_json
28+
29+
puts JSON.pretty_generate(JSON.parse(fhir_json))
30+
end
31+
end
32+
end
33+
34+
register "vaccination-records" do |prefix|
35+
prefix.register "generate-fhir", VaccinationRecords::GenerateFHIR
36+
end
37+
end
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# frozen_string_literal: true
2+
3+
require_relative "../../app/lib/mavis_cli"
4+
5+
describe "mavis vaccination-records generate-fhir" do
6+
context "when the vaccination record exists and is administered" do
7+
it "generates and displays the FHIR record" do
8+
given_a_vaccination_record_exists
9+
when_i_run_the_generate_fhir_command
10+
then_the_fhir_record_is_displayed
11+
end
12+
end
13+
14+
context "when the vaccination record does not exist" do
15+
it "displays an error message" do
16+
when_i_run_the_generate_fhir_command_with_an_invalid_id
17+
then_an_error_message_is_displayed
18+
end
19+
end
20+
21+
context "when the vaccination record was not administered" do
22+
it "displays an error message with the reason" do
23+
given_a_not_administered_vaccination_record_exists
24+
when_i_run_the_generate_fhir_command_for_not_administered_record
25+
then_the_not_administered_error_message_is_displayed
26+
end
27+
end
28+
29+
private
30+
31+
def given_a_vaccination_record_exists
32+
organisation = create(:organisation)
33+
programme = create(:programme, type: "hpv")
34+
patient = create(:patient, organisation:)
35+
vaccine = create(:vaccine, :gardasil, programme:)
36+
batch = create(:batch, vaccine:, expiry: "2023-03-20", name: "X8U375AL")
37+
38+
@vaccination_record =
39+
create(
40+
:vaccination_record,
41+
patient:,
42+
programme:,
43+
vaccine:,
44+
batch:,
45+
outcome: "administered"
46+
)
47+
end
48+
49+
def given_a_not_administered_vaccination_record_exists
50+
organisation = create(:organisation)
51+
programme = create(:programme, type: "hpv")
52+
patient = create(:patient, organisation:)
53+
54+
@not_administered_vaccination_record =
55+
create(:vaccination_record, patient:, programme:, outcome: "refused")
56+
end
57+
58+
def when_i_run_the_generate_fhir_command
59+
@output =
60+
capture_output do
61+
Dry::CLI.new(MavisCLI).call(
62+
arguments: [
63+
"vaccination-records",
64+
"generate-fhir",
65+
@vaccination_record.id
66+
]
67+
)
68+
end
69+
end
70+
71+
def when_i_run_the_generate_fhir_command_with_an_invalid_id
72+
@output =
73+
capture_output do
74+
Dry::CLI.new(MavisCLI).call(
75+
arguments: %w[vaccination-records generate-fhir 999999]
76+
)
77+
end
78+
end
79+
80+
def when_i_run_the_generate_fhir_command_for_not_administered_record
81+
@output =
82+
capture_output do
83+
Dry::CLI.new(MavisCLI).call(
84+
arguments: [
85+
"vaccination-records",
86+
"generate-fhir",
87+
@not_administered_vaccination_record.id
88+
]
89+
)
90+
end
91+
end
92+
93+
def then_the_fhir_record_is_displayed
94+
expect(@output).to include("resourceType")
95+
expect(@output).to include("Immunization")
96+
# We expect the JSON output to be pretty-printed
97+
expect(@output).to include("{\n")
98+
end
99+
100+
def then_an_error_message_is_displayed
101+
expect(@output).to include(
102+
"Error: Vaccination record with ID 999999 not found"
103+
)
104+
end
105+
106+
def then_the_not_administered_error_message_is_displayed
107+
outcome = @not_administered_vaccination_record.outcome.humanize
108+
expect(@output).to include(
109+
"Error: Vaccination record with ID #{@not_administered_vaccination_record.id} was not " \
110+
"administered (Outcome: #{outcome})"
111+
)
112+
end
113+
end

0 commit comments

Comments
 (0)