Class: USCoreTestKit::Generator::GroupGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/us_core_test_kit/generator/group_generator.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(group_metadata, base_output_dir) ⇒ GroupGenerator

Returns a new instance of GroupGenerator.



17
18
19
20
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 17

def initialize(, base_output_dir)
  self. = 
  self.base_output_dir = base_output_dir
end

Instance Attribute Details

#base_output_dirObject

Returns the value of attribute base_output_dir.



15
16
17
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 15

def base_output_dir
  @base_output_dir
end

#group_metadataObject

Returns the value of attribute group_metadata.



15
16
17
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 15

def 
  @group_metadata
end

Class Method Details

.generate(ig_metadata, base_output_dir) ⇒ Object



8
9
10
11
12
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 8

def generate(, base_output_dir)
  .ordered_groups
    .reject { |group| SpecialCases.exclude_group? group }
    .each { |group| new(group, base_output_dir).generate }
end

Instance Method Details

#add_special_testsObject



110
111
112
113
114
115
116
117
118
119
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 110

def add_special_tests
  return if .reformatted_version == 'v311'

  if .resource == 'DocumentReference'
    .add_test(
      id: 'us_core_v400_document_reference_custodian_test',
      file_name: '../../custom_groups/v4.0.0/document_reference_custodian_test.rb'
    )
  end
end

#base_metadata_file_nameObject



34
35
36
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 34

def 
  "metadata.yml"
end

#base_output_file_nameObject



30
31
32
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 30

def base_output_file_name
  "#{class_name.underscore}.rb"
end

#class_nameObject



38
39
40
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 38

def class_name
  "#{Naming.upper_camel_case_for_profile()}Group"
end

#descriptionObject



175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 175

def description
  <<~DESCRIPTION
  # Background

  The US Core #{title} sequence verifies that the system under test is
  able to provide correct responses for #{resource_type} queries. These queries
  must contain resources conforming to the #{profile_name} as
  specified in the US Core #{.version} Implementation Guide.

  # Testing Methodology
  #{search_description}

  ## Must Support
  Each profile contains elements marked as "must support". This test
  sequence expects to see each of these elements at least once. If at
  least one cannot be found, the test will fail. The test will look
  through the #{resource_type} resources found in the first test for these
  elements.

  ## Profile Validation
  Each resource returned from the first search is expected to conform to
  the [#{profile_name}](#{profile_url}). Each element is checked against
  teminology binding and cardinality requirements.

  Elements with a required binding are validated against their bound
  ValueSet. If the code/system in the element is not part of the ValueSet,
  then the test will fail.

  ## Reference Validation
  At least one instance of each external reference in elements marked as
  "must support" within the resources provided by the system must resolve.
  The test will attempt to read each reference found and will fail if no
  read succeeds.
  DESCRIPTION
end

#generateObject



102
103
104
105
106
107
108
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 102

def generate
  add_special_tests
  File.open(output_file_name, 'w') { |f| f.write(output) }
  .id = group_id
  .file_name = base_output_file_name
  File.open(, 'w') { |f| f.write(YAML.dump(.to_hash)) }
end

#group_idObject



66
67
68
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 66

def group_id
  "us_core_#{.reformatted_version}_#{profile_identifier}"
end

#metadata_file_nameObject



58
59
60
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 58

def 
  File.join(base_output_dir, profile_identifier, )
end

#module_nameObject



42
43
44
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 42

def module_name
  "USCore#{.reformatted_version.upcase}"
end

#optional?Boolean

Returns:

  • (Boolean)


97
98
99
100
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 97

def optional?
  SpecialCases::OPTIONAL_RESOURCES.include?(resource_type) ||
  SpecialCases::OPTIONAL_PROFILES.include?(profile_url)
end

#outputObject



26
27
28
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 26

def output
  @output ||= ERB.new(template).result(binding)
end

#output_file_nameObject



54
55
56
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 54

def output_file_name
  File.join(base_output_dir, base_output_file_name)
end

#profile_identifierObject



62
63
64
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 62

def profile_identifier
  Naming.snake_case_for_profile()
end

#profile_nameObject



88
89
90
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 88

def profile_name
  .profile_name
end

#profile_urlObject



92
93
94
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 92

def profile_url
  .profile_url
end

#required_searchesObject



134
135
136
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 134

def required_searches
  .searches.select { |search| search[:expectation] == 'SHALL' }
end

#resource_typeObject



70
71
72
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 70

def resource_type
  .resource
end

#search_descriptionObject



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 145

def search_description
  return '' if required_searches.blank?

  <<~SEARCH_DESCRIPTION
  ## Searching
  This test sequence will first perform each required search associated
  with this resource. This sequence will perform searches with the
  following parameters:

  #{search_param_name_string}

  ### Search Parameters
  The first search uses the selected patient(s) from the prior launch
  sequence. Any subsequent searches will look for its parameter values
  from the results of the first search. For example, the `identifier`
  search in the patient sequence is performed by looking for an existing
  `Patient.identifier` from any of the resources returned in the `_id`
  search. If a value cannot be found this way, the search is skipped.

  ### Search Validation
  Inferno will retrieve up to the first 20 bundle pages of the reply for
  #{search_validation_resource_type} and save them for subsequent tests. Each of
  these resources is then checked to see if it matches the searched
  parameters in accordance with [FHIR search
  guidelines](https://www.hl7.org/fhir/search.html). The test will fail,
  for example, if a Patient search for `gender=male` returns a `female`
  patient.
  SEARCH_DESCRIPTION
end

#search_param_name_stringObject



138
139
140
141
142
143
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 138

def search_param_name_string
  required_searches
    .map { |search| search[:names].join(' + ') }
    .map { |names| "* #{names}" }
    .join("\n")
end

#search_validation_resource_typeObject



74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 74

def search_validation_resource_type
  text = "#{resource_type} resources"
  if resource_type == 'Condition' && .reformatted_version == 'v501'
    case profile_url
    when 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition-encounter-diagnosis'
      text.concat(' with category `encounter-diagnosis`')
    when 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns'
      text.concat(' with category `problem-list-item | health-concern`')
    end
  end

  text
end

#short_descriptionObject



50
51
52
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 50

def short_description
  .short_description
end

#templateObject



22
23
24
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 22

def template
  @template ||= File.read(File.join(__dir__, 'templates', 'group.rb.erb'))
end

#test_file_listObject



126
127
128
129
130
131
132
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 126

def test_file_list
  @test_file_list ||=
    .tests.map do |test|
      name_without_suffix = test[:file_name].delete_suffix('.rb')
      name_without_suffix.start_with?('..') ? name_without_suffix : "#{profile_identifier}/#{name_without_suffix}"
    end
end

#test_id_listObject



121
122
123
124
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 121

def test_id_list
  @test_id_list ||=
    .tests.map { |test| test[:id] }
end

#titleObject



46
47
48
# File 'lib/us_core_test_kit/generator/group_generator.rb', line 46

def title
  .title
end