inferno_core 0.0.4 → 0.0.8.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/inferno +7 -0
- data/lib/inferno/apps/cli/console.rb +12 -0
- data/lib/inferno/apps/cli/main.rb +18 -0
- data/lib/inferno/apps/cli/migration.rb +14 -0
- data/lib/inferno/apps/cli.rb +8 -0
- data/lib/inferno/apps/web/controllers/test_runs/create.rb +15 -2
- data/lib/inferno/apps/web/index.html.erb +1 -0
- data/lib/inferno/apps/web/serializers/hash_value_extractor.rb +11 -0
- data/lib/inferno/apps/web/serializers/test.rb +3 -4
- data/lib/inferno/apps/web/serializers/test_group.rb +4 -6
- data/lib/inferno/config/application.rb +4 -0
- data/lib/inferno/config/boot/db.rb +1 -9
- data/lib/inferno/config/boot/logging.rb +2 -0
- data/lib/inferno/config/boot/suites.rb +4 -6
- data/lib/inferno/dsl/assertions.rb +85 -0
- data/lib/inferno/dsl/configurable.rb +126 -0
- data/lib/inferno/dsl/fhir_client.rb +22 -16
- data/lib/inferno/dsl/fhir_client_builder.rb +3 -3
- data/lib/inferno/dsl/fhir_validation.rb +105 -1
- data/lib/inferno/dsl/http_client.rb +14 -12
- data/lib/inferno/dsl/http_client_builder.rb +3 -3
- data/lib/inferno/dsl/request_storage.rb +26 -17
- data/lib/inferno/dsl/results.rb +1 -1
- data/lib/inferno/dsl/resume_test_route.rb +10 -10
- data/lib/inferno/dsl/runnable.rb +104 -38
- data/lib/inferno/entities/header.rb +14 -7
- data/lib/inferno/entities/message.rb +16 -8
- data/lib/inferno/entities/request.rb +34 -21
- data/lib/inferno/entities/result.rb +36 -29
- data/lib/inferno/entities/session_data.rb +12 -6
- data/lib/inferno/entities/test.rb +29 -2
- data/lib/inferno/entities/test_group.rb +8 -0
- data/lib/inferno/entities/test_run.rb +29 -6
- data/lib/inferno/entities/test_session.rb +16 -10
- data/lib/inferno/exceptions.rb +12 -0
- data/lib/inferno/public/217.bundle.js +1 -1
- data/lib/inferno/public/bundle.js +154 -1
- data/lib/inferno/public/bundle.js.LICENSE.txt +15 -0
- data/lib/inferno/repositories/in_memory_repository.rb +1 -1
- data/lib/inferno/repositories/results.rb +1 -1
- data/lib/inferno/repositories/test_runs.rb +15 -0
- data/lib/inferno/spec_support.rb +1 -1
- data/lib/inferno/test_runner.rb +21 -19
- data/lib/inferno/utils/markdown_formatter.rb +15 -0
- data/lib/inferno/utils/middleware/request_logger.rb +9 -3
- data/lib/inferno/utils/migration.rb +17 -0
- data/lib/inferno/version.rb +1 -1
- data/lib/inferno.rb +0 -4
- data/spec/factories/request.rb +14 -7
- metadata +58 -8
- data/bin/inferno-console +0 -8
@@ -19,6 +19,12 @@ object-assign
|
|
19
19
|
* @license MIT
|
20
20
|
*/
|
21
21
|
|
22
|
+
/** @license MUI v5.2.0
|
23
|
+
*
|
24
|
+
* This source code is licensed under the MIT license found in the
|
25
|
+
* LICENSE file in the root directory of this source tree.
|
26
|
+
*/
|
27
|
+
|
22
28
|
/** @license React v0.20.2
|
23
29
|
* scheduler.production.min.js
|
24
30
|
*
|
@@ -55,6 +61,15 @@ object-assign
|
|
55
61
|
* LICENSE file in the root directory of this source tree.
|
56
62
|
*/
|
57
63
|
|
64
|
+
/** @license React v17.0.2
|
65
|
+
* react-jsx-runtime.production.min.js
|
66
|
+
*
|
67
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
68
|
+
*
|
69
|
+
* This source code is licensed under the MIT license found in the
|
70
|
+
* LICENSE file in the root directory of this source tree.
|
71
|
+
*/
|
72
|
+
|
58
73
|
/** @license React v17.0.2
|
59
74
|
* react.production.min.js
|
60
75
|
*
|
@@ -13,6 +13,14 @@ module Inferno
|
|
13
13
|
}
|
14
14
|
end
|
15
15
|
|
16
|
+
def build_entity(params)
|
17
|
+
super.tap do |test_run|
|
18
|
+
test_run&.results&.map! do |result|
|
19
|
+
result.is_a?(Entities::Result) ? result : Entities::Result.new(result)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
16
24
|
def results_for_test_run(test_run_id)
|
17
25
|
test_run_hash =
|
18
26
|
self.class::Model
|
@@ -107,6 +115,13 @@ module Inferno
|
|
107
115
|
super
|
108
116
|
end
|
109
117
|
end
|
118
|
+
|
119
|
+
def active_test_run_for_session?(test_session_id)
|
120
|
+
self.class::Model
|
121
|
+
.where(test_session_id: test_session_id)
|
122
|
+
.exclude(status: 'done')
|
123
|
+
.count.positive?
|
124
|
+
end
|
110
125
|
end
|
111
126
|
end
|
112
127
|
end
|
data/lib/inferno/spec_support.rb
CHANGED
data/lib/inferno/test_runner.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
+
require_relative './utils/markdown_formatter'
|
2
|
+
|
1
3
|
module Inferno
|
2
|
-
# @
|
4
|
+
# @private
|
3
5
|
class TestRunner
|
6
|
+
include Inferno::Utils::MarkdownFormatter
|
4
7
|
attr_reader :test_session, :test_run, :resuming
|
5
8
|
|
6
9
|
def initialize(test_session:, test_run:, resume: false)
|
@@ -35,13 +38,13 @@ module Inferno
|
|
35
38
|
run_results.values
|
36
39
|
end
|
37
40
|
|
38
|
-
def run(runnable)
|
41
|
+
def run(runnable, scratch = {})
|
39
42
|
if runnable < Entities::Test
|
40
|
-
return existing_test_result(runnable) || run_test(runnable) if resuming
|
43
|
+
return existing_test_result(runnable) || run_test(runnable, scratch) if resuming
|
41
44
|
|
42
|
-
run_test(runnable)
|
45
|
+
run_test(runnable, scratch)
|
43
46
|
else
|
44
|
-
run_group(runnable)
|
47
|
+
run_group(runnable, scratch)
|
45
48
|
end
|
46
49
|
end
|
47
50
|
|
@@ -49,22 +52,22 @@ module Inferno
|
|
49
52
|
results_repo.result_for_test_run(runnable.reference_hash.merge(test_run_id: test_run.id))
|
50
53
|
end
|
51
54
|
|
52
|
-
def run_test(test)
|
55
|
+
def run_test(test, scratch)
|
53
56
|
inputs = load_inputs(test)
|
54
57
|
|
55
58
|
input_json_string = JSON.generate(inputs)
|
56
|
-
test_instance = test.new(inputs: inputs, test_session_id: test_session.id)
|
59
|
+
test_instance = test.new(inputs: inputs, test_session_id: test_session.id, scratch: scratch)
|
57
60
|
|
58
61
|
result = begin
|
59
62
|
test_instance.load_named_requests
|
60
63
|
test_instance.instance_eval(&test.block)
|
61
64
|
'pass'
|
62
65
|
rescue Exceptions::TestResultException => e
|
63
|
-
test_instance.result_message = e.message
|
66
|
+
test_instance.result_message = format_markdown(e.message)
|
64
67
|
e.result
|
65
68
|
rescue StandardError => e
|
66
69
|
Application['logger'].error(e.full_message)
|
67
|
-
test_instance.result_message = "Error: #{e.message}"
|
70
|
+
test_instance.result_message = format_markdown("Error: #{e.message}\n\n#{e.backtrace.first}")
|
68
71
|
'error'
|
69
72
|
end
|
70
73
|
|
@@ -95,10 +98,10 @@ module Inferno
|
|
95
98
|
test_result
|
96
99
|
end
|
97
100
|
|
98
|
-
def run_group(group)
|
101
|
+
def run_group(group, scratch)
|
99
102
|
results = []
|
100
103
|
group.children.each do |child|
|
101
|
-
result = run(child)
|
104
|
+
result = run(child, scratch)
|
102
105
|
results << result
|
103
106
|
break if results.last.waiting?
|
104
107
|
end
|
@@ -132,26 +135,25 @@ module Inferno
|
|
132
135
|
end
|
133
136
|
|
134
137
|
def load_inputs(runnable)
|
135
|
-
runnable.inputs.each_with_object({}) do |
|
136
|
-
|
137
|
-
input_hash[
|
138
|
+
runnable.inputs.each_with_object({}) do |input_identifier, input_hash|
|
139
|
+
input_alias = runnable.config.input_name(input_identifier)
|
140
|
+
input_hash[input_identifier] = session_data_repo.load(test_session_id: test_session.id, name: input_alias)
|
138
141
|
end
|
139
142
|
end
|
140
143
|
|
141
144
|
def save_outputs(runnable_instance)
|
142
145
|
outputs =
|
143
|
-
runnable_instance.
|
146
|
+
runnable_instance.outputs_to_persist.map do |output_identifier, value|
|
144
147
|
{
|
145
|
-
name: output_name,
|
146
|
-
value:
|
148
|
+
name: runnable_instance.class.config.output_name(output_identifier),
|
149
|
+
value: value
|
147
150
|
}
|
148
151
|
end
|
152
|
+
|
149
153
|
outputs.compact!
|
150
154
|
outputs.each do |output|
|
151
155
|
session_data_repo.save(output.merge(test_session_id: test_session.id))
|
152
156
|
end
|
153
|
-
|
154
|
-
outputs
|
155
157
|
end
|
156
158
|
|
157
159
|
def persist_result(params)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Inferno
|
2
|
+
module Utils
|
3
|
+
# @private
|
4
|
+
module MarkdownFormatter
|
5
|
+
def format_markdown(markdown) # rubocop:disable Metrics/CyclomaticComplexity
|
6
|
+
lines = markdown.lines
|
7
|
+
|
8
|
+
return markdown if lines.any? { |line| line.match?(/^\S/) }
|
9
|
+
|
10
|
+
natural_indent = lines.collect { |l| l.index(/[^ ]/) }.select { |l| !l.nil? && l.positive? }.min || 0
|
11
|
+
markdown.lines.map { |l| l[natural_indent..] || "\n" }.join
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Inferno
|
2
2
|
module Utils
|
3
|
-
# @
|
3
|
+
# @private
|
4
4
|
module Middleware
|
5
5
|
class RequestLogger
|
6
6
|
attr_reader :app
|
@@ -9,6 +9,10 @@ module Inferno
|
|
9
9
|
@app = app
|
10
10
|
end
|
11
11
|
|
12
|
+
def verbose_logging?
|
13
|
+
@verbose_logging ||= ENV['VERBOSE_REQUEST_LOGGING']&.downcase == true
|
14
|
+
end
|
15
|
+
|
12
16
|
def logger
|
13
17
|
@logger ||= Application['logger']
|
14
18
|
end
|
@@ -35,7 +39,9 @@ module Inferno
|
|
35
39
|
logger.info("#{status} in #{elapsed.in_milliseconds} ms")
|
36
40
|
return unless body.present?
|
37
41
|
|
38
|
-
|
42
|
+
body = body.is_a?(Array) ? body.join : body
|
43
|
+
|
44
|
+
if body.length > 100 && !verbose_logging?
|
39
45
|
logger.info("#{body[0..100]}...")
|
40
46
|
else
|
41
47
|
logger.info(body)
|
@@ -56,7 +62,7 @@ module Inferno
|
|
56
62
|
|
57
63
|
return unless body.present?
|
58
64
|
|
59
|
-
if body.length > 100
|
65
|
+
if body.length > 100 && !verbose_logging?
|
60
66
|
logger.info("#{body[0..100]}...")
|
61
67
|
else
|
62
68
|
logger.info(body)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Inferno
|
2
|
+
module Utils
|
3
|
+
class Migration
|
4
|
+
def run
|
5
|
+
db = Inferno::Application['db.connection']
|
6
|
+
migration_path = File.join(Inferno::Application.root, 'lib', 'inferno', 'db', 'migrations')
|
7
|
+
Sequel::Migrator.run(db, migration_path)
|
8
|
+
|
9
|
+
if ENV['APP_ENV'] == 'development' # rubocop:disable Style/GuardClause
|
10
|
+
schema_path = File.join(Inferno::Application.root, 'lib', 'inferno', 'db', 'schema.rb')
|
11
|
+
db.extension :schema_dumper
|
12
|
+
File.open(schema_path, 'w') { |f| f.print(db.dump_schema_migration) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/inferno/version.rb
CHANGED
data/lib/inferno.rb
CHANGED
data/spec/factories/request.rb
CHANGED
@@ -12,6 +12,20 @@ FactoryBot.define do
|
|
12
12
|
name { nil }
|
13
13
|
status { 200 }
|
14
14
|
direction { 'outgoing' }
|
15
|
+
headers do
|
16
|
+
[
|
17
|
+
{
|
18
|
+
type: 'request',
|
19
|
+
name: 'Request-Header',
|
20
|
+
value: 'REQUEST HEADER VALUE'
|
21
|
+
},
|
22
|
+
{
|
23
|
+
type: 'response',
|
24
|
+
name: 'Response-Header',
|
25
|
+
value: 'RESPONSE HEADER VALUE'
|
26
|
+
}
|
27
|
+
]
|
28
|
+
end
|
15
29
|
|
16
30
|
request_body { nil }
|
17
31
|
|
@@ -24,12 +38,5 @@ FactoryBot.define do
|
|
24
38
|
to_create do |instance|
|
25
39
|
Inferno::Repositories::Requests.new.create(instance.to_hash)
|
26
40
|
end
|
27
|
-
|
28
|
-
after(:create) do |instance, evaluator|
|
29
|
-
instance.instance_variable_set(
|
30
|
-
:@headers,
|
31
|
-
repo_create_list(:header, evaluator.header_count, request_id: instance.index)
|
32
|
-
)
|
33
|
-
end
|
34
41
|
end
|
35
42
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inferno_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen MacVicar
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-08
|
13
|
+
date: 2021-12-08 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -54,6 +54,20 @@ dependencies:
|
|
54
54
|
- - "~>"
|
55
55
|
- !ruby/object:Gem::Version
|
56
56
|
version: '2.7'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: dry-configurable
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - '='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 0.12.0
|
64
|
+
type: :runtime
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - '='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 0.12.0
|
57
71
|
- !ruby/object:Gem::Dependency
|
58
72
|
name: dry-system
|
59
73
|
requirement: !ruby/object:Gem::Requirement
|
@@ -88,14 +102,14 @@ dependencies:
|
|
88
102
|
requirements:
|
89
103
|
- - "~>"
|
90
104
|
- !ruby/object:Gem::Version
|
91
|
-
version: '
|
105
|
+
version: '5.0'
|
92
106
|
type: :runtime
|
93
107
|
prerelease: false
|
94
108
|
version_requirements: !ruby/object:Gem::Requirement
|
95
109
|
requirements:
|
96
110
|
- - "~>"
|
97
111
|
- !ruby/object:Gem::Version
|
98
|
-
version: '
|
112
|
+
version: '5.0'
|
99
113
|
- !ruby/object:Gem::Dependency
|
100
114
|
name: fhir_models
|
101
115
|
requirement: !ruby/object:Gem::Requirement
|
@@ -222,6 +236,20 @@ dependencies:
|
|
222
236
|
- - "~>"
|
223
237
|
- !ruby/object:Gem::Version
|
224
238
|
version: '5.42'
|
239
|
+
- !ruby/object:Gem::Dependency
|
240
|
+
name: sidekiq
|
241
|
+
requirement: !ruby/object:Gem::Requirement
|
242
|
+
requirements:
|
243
|
+
- - "~>"
|
244
|
+
- !ruby/object:Gem::Version
|
245
|
+
version: 6.2.1
|
246
|
+
type: :runtime
|
247
|
+
prerelease: false
|
248
|
+
version_requirements: !ruby/object:Gem::Requirement
|
249
|
+
requirements:
|
250
|
+
- - "~>"
|
251
|
+
- !ruby/object:Gem::Version
|
252
|
+
version: 6.2.1
|
225
253
|
- !ruby/object:Gem::Dependency
|
226
254
|
name: sqlite3
|
227
255
|
requirement: !ruby/object:Gem::Requirement
|
@@ -236,6 +264,20 @@ dependencies:
|
|
236
264
|
- - "~>"
|
237
265
|
- !ruby/object:Gem::Version
|
238
266
|
version: '1.4'
|
267
|
+
- !ruby/object:Gem::Dependency
|
268
|
+
name: thor
|
269
|
+
requirement: !ruby/object:Gem::Requirement
|
270
|
+
requirements:
|
271
|
+
- - "~>"
|
272
|
+
- !ruby/object:Gem::Version
|
273
|
+
version: 1.1.0
|
274
|
+
type: :runtime
|
275
|
+
prerelease: false
|
276
|
+
version_requirements: !ruby/object:Gem::Requirement
|
277
|
+
requirements:
|
278
|
+
- - "~>"
|
279
|
+
- !ruby/object:Gem::Version
|
280
|
+
version: 1.1.0
|
239
281
|
- !ruby/object:Gem::Dependency
|
240
282
|
name: codecov
|
241
283
|
requirement: !ruby/object:Gem::Requirement
|
@@ -409,13 +451,17 @@ description: Inferno Core is an open source tool for testing data exchanges enab
|
|
409
451
|
email:
|
410
452
|
- inferno@groups.mitre.org
|
411
453
|
executables:
|
412
|
-
- inferno
|
454
|
+
- inferno
|
413
455
|
extensions: []
|
414
456
|
extra_rdoc_files: []
|
415
457
|
files:
|
416
458
|
- LICENSE
|
417
|
-
- bin/inferno
|
459
|
+
- bin/inferno
|
418
460
|
- lib/inferno.rb
|
461
|
+
- lib/inferno/apps/cli.rb
|
462
|
+
- lib/inferno/apps/cli/console.rb
|
463
|
+
- lib/inferno/apps/cli/main.rb
|
464
|
+
- lib/inferno/apps/cli/migration.rb
|
419
465
|
- lib/inferno/apps/web/application.rb
|
420
466
|
- lib/inferno/apps/web/controllers/controller.rb
|
421
467
|
- lib/inferno/apps/web/controllers/requests/show.rb
|
@@ -431,6 +477,7 @@ files:
|
|
431
477
|
- lib/inferno/apps/web/controllers/test_suites/show.rb
|
432
478
|
- lib/inferno/apps/web/index.html.erb
|
433
479
|
- lib/inferno/apps/web/router.rb
|
480
|
+
- lib/inferno/apps/web/serializers/hash_value_extractor.rb
|
434
481
|
- lib/inferno/apps/web/serializers/header.rb
|
435
482
|
- lib/inferno/apps/web/serializers/input.rb
|
436
483
|
- lib/inferno/apps/web/serializers/message.rb
|
@@ -458,6 +505,7 @@ files:
|
|
458
505
|
- lib/inferno/db/schema.rb
|
459
506
|
- lib/inferno/dsl.rb
|
460
507
|
- lib/inferno/dsl/assertions.rb
|
508
|
+
- lib/inferno/dsl/configurable.rb
|
461
509
|
- lib/inferno/dsl/fhir_client.rb
|
462
510
|
- lib/inferno/dsl/fhir_client_builder.rb
|
463
511
|
- lib/inferno/dsl/fhir_validation.rb
|
@@ -508,7 +556,9 @@ files:
|
|
508
556
|
- lib/inferno/repositories/validate_runnable_reference.rb
|
509
557
|
- lib/inferno/spec_support.rb
|
510
558
|
- lib/inferno/test_runner.rb
|
559
|
+
- lib/inferno/utils/markdown_formatter.rb
|
511
560
|
- lib/inferno/utils/middleware/request_logger.rb
|
561
|
+
- lib/inferno/utils/migration.rb
|
512
562
|
- lib/inferno/version.rb
|
513
563
|
- spec/factories/header.rb
|
514
564
|
- spec/factories/message.rb
|
@@ -538,9 +588,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
538
588
|
version: 2.7.0
|
539
589
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
540
590
|
requirements:
|
541
|
-
- - "
|
591
|
+
- - ">"
|
542
592
|
- !ruby/object:Gem::Version
|
543
|
-
version:
|
593
|
+
version: 1.3.1
|
544
594
|
requirements: []
|
545
595
|
rubygems_version: 3.1.6
|
546
596
|
signing_key:
|