Class: IpaTestKit::Generator::GroupGenerator
- Inherits:
-
Object
- Object
- IpaTestKit::Generator::GroupGenerator
- Defined in:
- lib/ipa_test_kit/generator/group_generator.rb
Instance Attribute Summary collapse
-
#base_output_dir ⇒ Object
Returns the value of attribute base_output_dir.
-
#group_metadata ⇒ Object
Returns the value of attribute group_metadata.
Class Method Summary collapse
Instance Method Summary collapse
- #add_special_tests ⇒ Object
- #base_metadata_file_name ⇒ Object
- #base_observation_group? ⇒ Boolean
- #base_output_file_name ⇒ Object
- #class_name ⇒ Object
- #description ⇒ Object
- #generate ⇒ Object
- #group_id ⇒ Object
-
#initialize(group_metadata, base_output_dir) ⇒ GroupGenerator
constructor
A new instance of GroupGenerator.
- #metadata_file_name ⇒ Object
- #module_name ⇒ Object
- #optional? ⇒ Boolean
- #output ⇒ Object
- #output_file_name ⇒ Object
- #profile_identifier ⇒ Object
- #profile_name ⇒ Object
- #profile_url ⇒ Object
- #read_all_resources?(id) ⇒ Boolean
- #required_searches ⇒ Object
- #resource_type ⇒ Object
- #search_description ⇒ Object
- #search_param_name_string ⇒ Object
- #search_validation_resource_type ⇒ Object
- #short_description ⇒ Object
- #template ⇒ Object
- #test_file_list ⇒ Object
- #test_id_list ⇒ Object
- #title ⇒ Object
Constructor Details
#initialize(group_metadata, base_output_dir) ⇒ GroupGenerator
Returns a new instance of GroupGenerator.
18 19 20 21 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 18 def initialize(, base_output_dir) self. = self.base_output_dir = base_output_dir end |
Instance Attribute Details
#base_output_dir ⇒ Object
Returns the value of attribute base_output_dir.
16 17 18 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 16 def base_output_dir @base_output_dir end |
#group_metadata ⇒ Object
Returns the value of attribute group_metadata.
16 17 18 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 16 def @group_metadata end |
Class Method Details
.generate(ig_metadata, base_output_dir) ⇒ Object
8 9 10 11 12 13 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 8 def generate(, base_output_dir) .ordered_groups .reject { |group| group.nil?} .reject { |group| SpecialCases.exclude_group? group } .each { |group| new(group, base_output_dir).generate } end |
Instance Method Details
#add_special_tests ⇒ Object
118 119 120 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 118 def add_special_tests end |
#base_metadata_file_name ⇒ Object
35 36 37 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 35 def "metadata.yml" end |
#base_observation_group? ⇒ Boolean
97 98 99 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 97 def base_observation_group? profile_url == 'http://hl7.org/fhir/uv/ipa/StructureDefinition/ipa-observation' end |
#base_output_file_name ⇒ Object
31 32 33 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 31 def base_output_file_name "#{class_name.underscore}.rb" end |
#class_name ⇒ Object
39 40 41 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 39 def class_name "#{Naming.upper_camel_case_for_profile()}Group" end |
#description ⇒ Object
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 210 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 176 def description <<~DESCRIPTION # Background The IPA #{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 IPA #{.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 |
#generate ⇒ Object
110 111 112 113 114 115 116 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 110 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_id ⇒ Object
67 68 69 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 67 def group_id "ipa_#{.reformatted_version}_#{profile_identifier}" end |
#metadata_file_name ⇒ Object
59 60 61 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 59 def File.join(base_output_dir, profile_identifier, ) end |
#module_name ⇒ Object
43 44 45 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 43 def module_name "Ipa#{.reformatted_version.upcase}" end |
#optional? ⇒ Boolean
101 102 103 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 101 def optional? resource_type == 'QuestionnaireResponse' end |
#output ⇒ Object
27 28 29 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 27 def output @output ||= ERB.new(template).result(binding) end |
#output_file_name ⇒ Object
55 56 57 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 55 def output_file_name File.join(base_output_dir, base_output_file_name) end |
#profile_identifier ⇒ Object
63 64 65 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 63 def profile_identifier Naming.snake_case_for_profile() end |
#profile_name ⇒ Object
89 90 91 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 89 def profile_name .profile_name end |
#profile_url ⇒ Object
93 94 95 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 93 def profile_url .profile_url end |
#read_all_resources?(id) ⇒ Boolean
105 106 107 108 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 105 def read_all_resources?(id) ['Medication', 'Practitioner', 'PractitionerRole'].include?(resource_type) && id.end_with?('read_test') end |
#required_searches ⇒ Object
135 136 137 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 135 def required_searches .searches.select { |search| search[:expectation] == 'SHALL' } end |
#resource_type ⇒ Object
71 72 73 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 71 def resource_type .resource end |
#search_description ⇒ Object
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 174 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 146 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_string ⇒ Object
139 140 141 142 143 144 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 139 def search_param_name_string required_searches .map { |search| search[:names].join(' + ') } .map { |names| "* #{names}" } .join("\n") end |
#search_validation_resource_type ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 75 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_description ⇒ Object
51 52 53 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 51 def short_description .short_description end |
#template ⇒ Object
23 24 25 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 23 def template @template ||= File.read(File.join(__dir__, 'templates', 'group.rb.erb')) end |
#test_file_list ⇒ Object
127 128 129 130 131 132 133 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 127 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_list ⇒ Object
122 123 124 125 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 122 def test_id_list @test_id_list ||= .tests.map { |test| test[:id] } end |
#title ⇒ Object
47 48 49 |
# File 'lib/ipa_test_kit/generator/group_generator.rb', line 47 def title .title end |