inferno_core 0.3.4 → 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/lib/inferno/apps/web/controllers/test_runs/create.rb +8 -4
  3. data/lib/inferno/apps/web/controllers/test_sessions/create.rb +6 -3
  4. data/lib/inferno/apps/web/router.rb +5 -0
  5. data/lib/inferno/apps/web/serializers/input.rb +6 -2
  6. data/lib/inferno/apps/web/serializers/suite_option.rb +13 -0
  7. data/lib/inferno/apps/web/serializers/test.rb +4 -1
  8. data/lib/inferno/apps/web/serializers/test_group.rb +12 -3
  9. data/lib/inferno/apps/web/serializers/test_session.rb +5 -3
  10. data/lib/inferno/apps/web/serializers/test_suite.rb +10 -2
  11. data/lib/inferno/config/boot/presets.rb +1 -1
  12. data/lib/inferno/db/migrations/007_add_suite_options.rb +5 -0
  13. data/lib/inferno/db/schema.rb +1 -0
  14. data/lib/inferno/dsl/http_client.rb +14 -4
  15. data/lib/inferno/dsl/http_client_builder.rb +6 -1
  16. data/lib/inferno/dsl/input_output_handling.rb +55 -41
  17. data/lib/inferno/dsl/runnable.rb +12 -6
  18. data/lib/inferno/dsl/suite_option.rb +40 -0
  19. data/lib/inferno/entities/input.rb +2 -1
  20. data/lib/inferno/entities/test.rb +3 -1
  21. data/lib/inferno/entities/test_group.rb +4 -4
  22. data/lib/inferno/entities/test_session.rb +28 -0
  23. data/lib/inferno/entities/test_suite.rb +11 -4
  24. data/lib/inferno/public/72a5cd989e6aea904540824ec865a0f8.png +0 -0
  25. data/lib/inferno/public/bundle.js +15 -15
  26. data/lib/inferno/public/e09b16f5cb645eb05f90c8f38f3409fb.png +0 -0
  27. data/lib/inferno/repositories/presets.rb +10 -1
  28. data/lib/inferno/repositories/test_sessions.rb +24 -0
  29. data/lib/inferno/test_runner.rb +1 -1
  30. data/lib/inferno/version.rb +1 -1
  31. metadata +38 -7
  32. data/lib/inferno/public/bg-header-1920x170.png +0 -0
  33. data/lib/inferno/public/healthit.gov.logo.png +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5c905fd9a450198c42daa6a7f3119277d1eeb1e39acb788856d90c3817719d02
4
- data.tar.gz: e11d6fcfa8acb3c487c62d512b9210db18f5d7bba5c9148063587de8a3e78420
3
+ metadata.gz: 20fc2d3e3d1a42d30682916011622f3827b809089883dc591f799bfbf334b1f8
4
+ data.tar.gz: f606bb9364a4e08b29754706692fc1e525e3592c2c01490183574673201ee1be
5
5
  SHA512:
6
- metadata.gz: d62c7ebc7b9f9ac2024bfb933254cd54010b869fde72d15c77e935e7228096e2ba45844e3f8ba2f7b28f71315120d7a194b63d7e95675600e26efd1bbe822cc1
7
- data.tar.gz: ed6b0d392219155cd2cd6865e01d9ba838c067f36bfdd86ac10e80e923b51ddf688cff4f8e8a67e62e53a1d28c151f1c76d5e791166e920ff9832676fa1239c0
6
+ metadata.gz: 271a59774aa21e093feace017269194676539e0685d87805fdca2c409d1de568cbd99147c16e9484ce416ac32fe1db2c22d323178db5729b52e11e616dbf07db
7
+ data.tar.gz: eca623df2965155c9b4867c426e75fba81758214495160afd8236ada7e6930fda72cab708561673c2daffd45045fb3fa8994e7d2b7194272eb543f9664cf6018
@@ -11,8 +11,8 @@ module Inferno
11
11
 
12
12
  PARAMS = [:test_session_id, :test_suite_id, :test_group_id, :test_id].freeze
13
13
 
14
- def verify_runnable(runnable, inputs)
15
- missing_inputs = runnable&.missing_inputs(inputs)
14
+ def verify_runnable(runnable, inputs, selected_suite_options)
15
+ missing_inputs = runnable&.missing_inputs(inputs, selected_suite_options)
16
16
  user_runnable = runnable&.user_runnable?
17
17
  raise Inferno::Exceptions::RequiredInputsNotFound, missing_inputs if missing_inputs&.any?
18
18
  raise Inferno::Exceptions::NotUserRunnableException unless user_runnable
@@ -26,7 +26,7 @@ module Inferno
26
26
  &.last
27
27
 
28
28
  if input.nil?
29
- Inferno::Application['logger'].warning(
29
+ Inferno::Application['logger'].warn(
30
30
  "Unknown input `#{input_params[:name]}` for #{test_run.runnable.id}: #{test_run.runnable.title}"
31
31
  )
32
32
  next
@@ -51,7 +51,11 @@ module Inferno
51
51
  return
52
52
  end
53
53
 
54
- verify_runnable(repo.build_entity(create_params(params)).runnable, params[:inputs])
54
+ verify_runnable(
55
+ repo.build_entity(create_params(params)).runnable,
56
+ params[:inputs],
57
+ test_session.suite_options
58
+ )
55
59
 
56
60
  test_run = repo.create(create_params(params).merge(status: 'queued'))
57
61
 
@@ -3,9 +3,12 @@ module Inferno
3
3
  module Controllers
4
4
  module TestSessions
5
5
  class Create < Controller
6
- PARAMS = [:test_suite_id].freeze
6
+ PARAMS = [:test_suite_id, :suite_options].freeze
7
+
8
+ def call(raw_params)
9
+ params = raw_params.to_h
10
+ params.merge!(JSON.parse(request.body.string).symbolize_keys) unless request.body.string.blank?
7
11
 
8
- def call(params)
9
12
  session = repo.create(create_params(params))
10
13
 
11
14
  repo.apply_preset(session.id, params[:preset_id]) if params[:preset_id].present?
@@ -21,7 +24,7 @@ module Inferno
21
24
  end
22
25
 
23
26
  def create_params(params)
24
- params.to_h.slice(*PARAMS)
27
+ params.slice(*PARAMS)
25
28
  end
26
29
  end
27
30
  end
@@ -51,6 +51,11 @@ module Inferno
51
51
  send(route[:method], path, to: route[:handler])
52
52
  end
53
53
  end
54
+
55
+ Inferno::Repositories::TestSuites.all.map { |suite| "/#{suite.id}" }.each do |suite_path|
56
+ Application['logger'].info("Registering suite route: #{suite_path}")
57
+ get suite_path, to: ->(_env) { [200, {}, [client_page]] }
58
+ end
54
59
  end
55
60
  end
56
61
  end
@@ -6,9 +6,13 @@ module Inferno
6
6
  class Input < Serializer
7
7
  identifier :name
8
8
 
9
- field :label, if: :field_present?
9
+ field :title, if: :field_present?
10
10
  field :description, if: :field_present?
11
- field :required, if: :field_present?
11
+ field :type, if: :field_present?
12
+ field :default, if: :field_present?
13
+ field :optional, if: :field_present?
14
+ field :options, if: :field_present?
15
+ field :locked, if: :field_present?
12
16
  field :value, if: :field_present?
13
17
  end
14
18
  end
@@ -0,0 +1,13 @@
1
+ module Inferno
2
+ module Web
3
+ module Serializers
4
+ class SuiteOption < Serializer
5
+ identifier :id
6
+ field :title, if: :field_present?
7
+ field :description, if: :field_present?
8
+ field :list_options, if: :field_present?
9
+ field :value, if: :field_present?
10
+ end
11
+ end
12
+ end
13
+ end
@@ -7,7 +7,10 @@ module Inferno
7
7
  field :short_id
8
8
  field :title
9
9
  field :short_title
10
- field :available_inputs, name: :inputs, extractor: HashValueExtractor, blueprint: Input
10
+ field :inputs do |test, options|
11
+ suite_options = options[:suite_options]
12
+ Input.render_as_hash(test.available_inputs(suite_options).values)
13
+ end
11
14
  field :output_definitions, name: :outputs, extractor: HashValueExtractor
12
15
  field :description
13
16
  field :short_description
@@ -15,9 +15,18 @@ module Inferno
15
15
  field :user_runnable?, name: :user_runnable
16
16
  field :optional?, name: :optional
17
17
 
18
- association :groups, name: :test_groups, blueprint: TestGroup
19
- association :tests, blueprint: Test
20
- field :available_inputs, name: :inputs, extractor: HashValueExtractor, blueprint: Input
18
+ field :test_groups do |group, options|
19
+ suite_options = options[:suite_options]
20
+ TestGroup.render_as_hash(group.groups(suite_options), suite_options: suite_options)
21
+ end
22
+ field :tests do |group, options|
23
+ suite_options = options[:suite_options]
24
+ Test.render_as_hash(group.tests(suite_options), suite_options: suite_options)
25
+ end
26
+ field :inputs do |group, options|
27
+ suite_options = options[:suite_options]
28
+ Input.render_as_hash(group.available_inputs(suite_options).values)
29
+ end
21
30
  field :output_definitions, name: :outputs, extractor: HashValueExtractor
22
31
  end
23
32
  end
@@ -1,3 +1,4 @@
1
+ require_relative 'suite_option'
1
2
  require_relative 'test_suite'
2
3
 
3
4
  module Inferno
@@ -7,10 +8,11 @@ module Inferno
7
8
  identifier :id
8
9
 
9
10
  field :test_suite_id
11
+ association :suite_options, blueprint: SuiteOption
10
12
 
11
- association :test_suite, blueprint: TestSuite, view: :full
12
- # association :test_runs, blueprint: TestRun
13
- # association :results, blueprint: Result
13
+ field :test_suite do |session, _options|
14
+ TestSuite.render_as_hash(session.test_suite, view: :full, suite_options: session.suite_options)
15
+ end
14
16
  end
15
17
  end
16
18
  end
@@ -11,14 +11,22 @@ module Inferno
11
11
  field :input_instructions
12
12
  field :test_count
13
13
  field :version
14
+ field :links
15
+ association :suite_options, blueprint: SuiteOption
14
16
  association :presets, view: :summary, blueprint: Preset
15
17
  end
16
18
 
17
19
  view :full do
18
20
  include_view :summary
19
- association :groups, name: :test_groups, blueprint: TestGroup
21
+ field :test_groups do |suite, options|
22
+ suite_options = options[:suite_options]
23
+ TestGroup.render_as_hash(suite.groups(suite_options), suite_options: suite_options)
24
+ end
20
25
  field :configuration_messages
21
- field :available_inputs, name: :inputs, extractor: HashValueExtractor, blueprint: Input
26
+ field :inputs do |suite, options|
27
+ suite_options = options[:suite_options]
28
+ Input.render_as_hash(suite.available_inputs(suite_options).values)
29
+ end
22
30
  end
23
31
  end
24
32
  end
@@ -4,7 +4,7 @@ Inferno::Application.boot(:presets) do
4
4
  init do
5
5
  use :suites
6
6
 
7
- files_to_load = Dir.glob(File.join(Dir.pwd, 'config', 'presets', '*.json'))
7
+ files_to_load = Dir.glob(['config/presets/*.json', 'config/presets/*.json.erb'])
8
8
  files_to_load.map! { |path| File.realpath(path) }
9
9
  presets_repo = Inferno::Repositories::Presets.new
10
10
 
@@ -0,0 +1,5 @@
1
+ Sequel.migration do
2
+ change do
3
+ add_column :test_sessions, :suite_options, String, text: true, size: 255
4
+ end
5
+ end
@@ -9,6 +9,7 @@ Sequel.migration do
9
9
  String :test_suite_id, :size=>255, :null=>false
10
10
  DateTime :created_at, :null=>false
11
11
  DateTime :updated_at, :null=>false
12
+ String :suite_options, :text=>true
12
13
 
13
14
  primary_key [:id]
14
15
  end
@@ -1,3 +1,5 @@
1
+ require 'faraday_middleware'
2
+
1
3
  require_relative 'request_storage'
2
4
  require_relative 'tcp_exception_handler'
3
5
 
@@ -75,7 +77,7 @@ module Inferno
75
77
  if client
76
78
  client.get(url, nil, options[:headers])
77
79
  elsif url.match?(%r{\Ahttps?://})
78
- Faraday.get(url, nil, options[:headers])
80
+ connection.get(url, nil, options[:headers])
79
81
  else
80
82
  raise StandardError, 'Must use an absolute url or define an HTTP client with a base url'
81
83
  end
@@ -83,6 +85,14 @@ module Inferno
83
85
  end
84
86
  end
85
87
 
88
+ # @private
89
+ def connection
90
+ Faraday.new do |f|
91
+ f.request :url_encoded
92
+ f.use FaradayMiddleware::FollowRedirects
93
+ end
94
+ end
95
+
86
96
  # Perform an HTTP POST request
87
97
  #
88
98
  # @param url [String] if this request is using a defined client, this will
@@ -103,7 +113,7 @@ module Inferno
103
113
  if client
104
114
  client.post(url, body, options[:headers])
105
115
  elsif url.match?(%r{\Ahttps?://})
106
- Faraday.post(url, body, options[:headers])
116
+ connection.post(url, body, options[:headers])
107
117
  else
108
118
  raise StandardError, 'Must use an absolute url or define an HTTP client with a base url'
109
119
  end
@@ -128,7 +138,7 @@ module Inferno
128
138
  if client
129
139
  client.delete(url, nil, options[:headers])
130
140
  elsif url.match?(%r{\Ahttps?://})
131
- Faraday.delete(url, nil, options[:headers])
141
+ connection.delete(url, nil, options[:headers])
132
142
  else
133
143
  raise StandardError, 'Must use an absolute url or define an HTTP client with a base url'
134
144
  end
@@ -167,7 +177,7 @@ module Inferno
167
177
  if client
168
178
  response = client.get(url, nil, options[:headers]) { |req| req.options.on_data = collector }
169
179
  elsif url.match?(%r{\Ahttps?://})
170
- response = Faraday.get(url, nil, options[:headers]) { |req| req.options.on_data = collector }
180
+ response = connection.get(url, nil, options[:headers]) { |req| req.options.on_data = collector }
171
181
  else
172
182
  raise StandardError, 'Must use an absolute url or define an HTTP client with a base url'
173
183
  end
@@ -1,3 +1,5 @@
1
+ require 'faraday_middleware'
2
+
1
3
  module Inferno
2
4
  module DSL
3
5
  # This module contains the HTTP DSL available to test writers.
@@ -12,7 +14,10 @@ module Inferno
12
14
  params = { url: url }
13
15
  params.merge!(headers: headers) if headers
14
16
 
15
- Faraday.new(params)
17
+ Faraday.new(params) do |f|
18
+ f.request :url_encoded
19
+ f.use FaradayMiddleware::FollowRedirects
20
+ end
16
21
  end
17
22
 
18
23
  # Define the base url for an HTTP client. A string or symbol can be
@@ -24,10 +24,20 @@ module Inferno
24
24
  [identifier, *other_identifiers].compact.each do |input_identifier|
25
25
  inputs << input_identifier
26
26
  config.add_input(input_identifier)
27
+ children
28
+ .reject { |child| child.inputs.include? input_identifier }
29
+ .each do |child|
30
+ child.input(input_identifier)
31
+ end
27
32
  end
28
33
  else
29
34
  inputs << identifier
30
35
  config.add_input(identifier, input_params)
36
+ children
37
+ .reject { |child| child.inputs.include? identifier }
38
+ .each do |child|
39
+ child.input(identifier, **input_params)
40
+ end
31
41
  end
32
42
  end
33
43
 
@@ -47,10 +57,20 @@ module Inferno
47
57
  [identifier, *other_identifiers].compact.each do |output_identifier|
48
58
  outputs << output_identifier
49
59
  config.add_output(output_identifier)
60
+ children
61
+ .reject { |child| child.outputs.include? output_identifier }
62
+ .each do |child|
63
+ child.output(output_identifier)
64
+ end
50
65
  end
51
66
  else
52
67
  outputs << identifier
53
68
  config.add_output(identifier, output_definition)
69
+ children
70
+ .reject { |child| child.outputs.include? identifier }
71
+ .each do |child|
72
+ child.output(identifier, **output_definition)
73
+ end
54
74
  end
55
75
  end
56
76
 
@@ -70,17 +90,17 @@ module Inferno
70
90
  end
71
91
 
72
92
  # @private
73
- def required_inputs
74
- available_inputs
93
+ def required_inputs(selected_suite_options)
94
+ available_inputs(selected_suite_options)
75
95
  .reject { |_, input| input.optional }
76
96
  .map { |_, input| input.name }
77
97
  end
78
98
 
79
99
  # @private
80
- def missing_inputs(submitted_inputs)
100
+ def missing_inputs(submitted_inputs, selected_suite_options)
81
101
  submitted_inputs = [] if submitted_inputs.nil?
82
102
 
83
- required_inputs.map(&:to_s) - submitted_inputs.map { |input| input[:name] }
103
+ required_inputs(selected_suite_options).map(&:to_s) - submitted_inputs.map { |input| input[:name] }
84
104
  end
85
105
 
86
106
  # Define a particular order for inputs to be presented in the API/UI
@@ -133,52 +153,46 @@ module Inferno
133
153
  # Inputs available for this runnable's children. A running list of outputs
134
154
  # created by the children is used to exclude any inputs which are provided
135
155
  # by an earlier child's output.
136
- def children_available_inputs
137
- @children_available_inputs ||=
138
- begin
139
- child_outputs = []
140
- all_children.each_with_object({}) do |child, definitions|
141
- new_definitions = child.available_inputs.map(&:dup)
142
- new_definitions.each do |input, new_definition|
143
- existing_definition = definitions[input]
144
-
145
- updated_definition =
146
- if existing_definition.present?
147
- existing_definition.merge_with_child(new_definition)
148
- else
149
- new_definition
150
- end
151
-
152
- next if child_outputs.include?(updated_definition.name.to_sym)
153
-
154
- definitions[updated_definition.name.to_sym] = updated_definition
156
+ def children_available_inputs(selected_suite_options = nil)
157
+ child_outputs = []
158
+ children(selected_suite_options).each_with_object({}) do |child, definitions|
159
+ new_definitions = child.available_inputs(selected_suite_options).map(&:dup)
160
+ new_definitions.each do |input, new_definition|
161
+ existing_definition = definitions[input]
162
+
163
+ updated_definition =
164
+ if existing_definition.present?
165
+ existing_definition.merge_with_child(new_definition)
166
+ else
167
+ new_definition
155
168
  end
156
169
 
157
- child_outputs.concat(child.all_outputs).uniq!
158
- end
170
+ next if child_outputs.include?(updated_definition.name.to_sym)
171
+
172
+ definitions[updated_definition.name.to_sym] = updated_definition
159
173
  end
174
+
175
+ child_outputs.concat(child.all_outputs).uniq!
176
+ end
160
177
  end
161
178
 
162
179
  # @private
163
180
  # Inputs available for the user for this runnable and all its children.
164
- def available_inputs
165
- @available_inputs ||=
166
- begin
167
- available_inputs =
168
- config.inputs
169
- .slice(*inputs)
170
- .each_with_object({}) do |(_, input), inputs|
171
- inputs[input.name.to_sym] = input
172
- end
173
-
174
- available_inputs.each do |input, current_definition|
175
- child_definition = children_available_inputs[input]
176
- current_definition.merge_with_child(child_definition)
181
+ def available_inputs(selected_suite_options = nil)
182
+ available_inputs =
183
+ config.inputs
184
+ .slice(*inputs)
185
+ .each_with_object({}) do |(_, input), inputs|
186
+ inputs[input.name.to_sym] = Entities::Input.new(input.to_hash)
177
187
  end
178
188
 
179
- available_inputs = children_available_inputs.merge(available_inputs)
180
- order_available_inputs(available_inputs)
181
- end
189
+ available_inputs.each do |input, current_definition|
190
+ child_definition = children_available_inputs(selected_suite_options)[input]
191
+ current_definition.merge_with_child(child_definition)
192
+ end
193
+
194
+ available_inputs = children_available_inputs(selected_suite_options).merge(available_inputs)
195
+ order_available_inputs(available_inputs)
182
196
  end
183
197
  end
184
198
  end
@@ -379,7 +379,7 @@ module Inferno
379
379
  end
380
380
 
381
381
  # @private
382
- def test_count(selected_suite_options = {})
382
+ def test_count(selected_suite_options = [])
383
383
  @test_counts ||= {}
384
384
 
385
385
  @test_counts[selected_suite_options] ||=
@@ -395,17 +395,23 @@ module Inferno
395
395
  end
396
396
 
397
397
  def required_suite_options(suite_option_requirements)
398
- @suite_option_requirements = suite_option_requirements
398
+ @suite_option_requirements =
399
+ suite_option_requirements.map do |key, value|
400
+ DSL::SuiteOption.new(id: key, value: value)
401
+ end
399
402
  end
400
403
 
401
- def children(selected_suite_options = nil)
404
+ def children(selected_suite_options = [])
402
405
  return all_children if selected_suite_options.blank?
403
406
 
404
407
  all_children.select do |child|
405
- requirements = child.suite_option_requirements || {}
408
+ requirements = child.suite_option_requirements
406
409
 
407
- # requirements are a subset of selected options or equal to selected options
408
- selected_suite_options >= requirements
410
+ if requirements.blank?
411
+ true
412
+ else
413
+ requirements.all? { |requirement| selected_suite_options.include? requirement }
414
+ end
409
415
  end
410
416
  end
411
417
  end
@@ -0,0 +1,40 @@
1
+ require_relative '../entities/attributes'
2
+
3
+ module Inferno
4
+ module DSL
5
+ class SuiteOption
6
+ ATTRIBUTES = [
7
+ :id,
8
+ :title,
9
+ :description,
10
+ :list_options,
11
+ :value
12
+ ].freeze
13
+
14
+ include Entities::Attributes
15
+
16
+ def initialize(raw_params)
17
+ params = raw_params.deep_symbolize_keys
18
+ bad_params = params.keys - ATTRIBUTES
19
+
20
+ raise Exceptions::UnknownAttributeException.new(bad_params, self.class) if bad_params.present?
21
+
22
+ params
23
+ .compact
24
+ .each { |key, value| send("#{key}=", value) }
25
+
26
+ self.id = id.to_sym if id.is_a? String
27
+ end
28
+
29
+ def ==(other)
30
+ id == other.id && value == other.value
31
+ end
32
+
33
+ def to_hash
34
+ self.class::ATTRIBUTES.each_with_object({}) do |attribute, hash|
35
+ hash[attribute] = send(attribute)
36
+ end.compact
37
+ end
38
+ end
39
+ end
40
+ end
@@ -13,7 +13,8 @@ module Inferno
13
13
  :default,
14
14
  :optional,
15
15
  :options,
16
- :locked
16
+ :locked,
17
+ :value
17
18
  ].freeze
18
19
  include Entities::Attributes
19
20
 
@@ -145,10 +145,12 @@ module Inferno
145
145
  # Define outputs for this Test
146
146
  #
147
147
  # @param output_definitions [Symbol]
148
+ # @param _output_params [Hash] Unused parameter. Just makes method
149
+ # signature compatible with `Inferno::DSL::InputOutputHandling.output`
148
150
  # @return [void]
149
151
  # @example
150
152
  # output :patient_id, :bearer_token
151
- def output(*output_definitions)
153
+ def output(*output_definitions, **_output_params)
152
154
  super
153
155
 
154
156
  output_definitions.each do |output|
@@ -31,12 +31,12 @@ module Inferno
31
31
  Inferno::Repositories::TestGroups.new
32
32
  end
33
33
 
34
- def groups
35
- all_children.select { |child| child < Inferno::Entities::TestGroup }
34
+ def groups(options = nil)
35
+ children(options).select { |child| child < Inferno::Entities::TestGroup }
36
36
  end
37
37
 
38
- def tests
39
- all_children.select { |child| child < Inferno::Entities::Test }
38
+ def tests(options = nil)
39
+ children(options).select { |child| child < Inferno::Entities::Test }
40
40
  end
41
41
 
42
42
  # Methods to configure Inferno::DSL::Runnable
@@ -37,6 +37,34 @@ module Inferno
37
37
 
38
38
  def initialize(params)
39
39
  super(params, ATTRIBUTES)
40
+
41
+ self.suite_options ||= []
42
+
43
+ test_suite.suite_options&.each do |option|
44
+ if suite_options.none? { |selected_option| selected_option.id == option.id }
45
+ suite_options << DSL::SuiteOption.new(id: option.id, value: option.list_options.first[:value])
46
+ end
47
+ end
48
+ end
49
+
50
+ def test_suite
51
+ @test_suite ||= Repositories::TestSuites.new.find(test_suite_id)
52
+ end
53
+
54
+ def to_hash
55
+ session_hash = (self.class::ATTRIBUTES - [:suite_options]).each_with_object({}) do |attribute, hash|
56
+ hash[attribute] = send(attribute)
57
+ end
58
+
59
+ session_hash[:suite_options] = suite_options&.map(&:to_hash) || []
60
+
61
+ session_hash.compact
62
+ end
63
+
64
+ def suite_options_hash
65
+ (suite_options || []).each_with_object({}) do |option, hash|
66
+ hash[option.id] = option.value
67
+ end
40
68
  end
41
69
  end
42
70
  end
@@ -1,5 +1,6 @@
1
1
  require_relative 'test_group'
2
2
  require_relative '../dsl/runnable'
3
+ require_relative '../dsl/suite_option'
3
4
  require_relative '../repositories/test_groups'
4
5
  require_relative '../repositories/test_suites'
5
6
 
@@ -30,8 +31,8 @@ module Inferno
30
31
  Inferno::Repositories::TestSuites.new
31
32
  end
32
33
 
33
- def groups
34
- all_children.select { |child| child < Inferno::Entities::TestGroup }
34
+ def groups(options = nil)
35
+ children(options).select { |child| child < Inferno::Entities::TestGroup }
35
36
  end
36
37
 
37
38
  # Methods to configure Inferno::DSL::Runnable
@@ -86,11 +87,17 @@ module Inferno
86
87
  end
87
88
 
88
89
  def suite_option(identifier, **input_params)
89
- suite_options[identifier] = input_params
90
+ suite_options << DSL::SuiteOption.new(input_params.merge(id: identifier))
90
91
  end
91
92
 
92
93
  def suite_options
93
- @suite_options ||= {}
94
+ @suite_options ||= []
95
+ end
96
+
97
+ def links(links = nil)
98
+ return @links if links.nil?
99
+
100
+ @links = links
94
101
  end
95
102
  end
96
103
  end