Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FI-2937 inferno execute #517

Merged
merged 93 commits into from
Sep 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
f9021af
create execute.rb
Shaumik-Ashraf Jul 18, 2024
7d8b8d5
move docker compose option into cli/execute.rb
Shaumik-Ashraf Jul 19, 2024
5a72514
wip
Shaumik-Ashraf Jul 26, 2024
625400d
IT WORKS
Shaumik-Ashraf Jul 31, 2024
72fb726
add force_synchronous kwarg to Jobs
Shaumik-Ashraf Aug 1, 2024
4588c3f
add colorized ascii output
Shaumik-Ashraf Aug 2, 2024
de3849d
suppress migration output
Shaumik-Ashraf Aug 2, 2024
6a917f6
create dev_validator_suite
Shaumik-Ashraf Aug 5, 2024
d5fbe40
create_params and print_messages functions
Shaumik-Ashraf Aug 6, 2024
ea9e592
factorize persist_inputs and verify_runnable functions
Shaumik-Ashraf Aug 6, 2024
71cf9af
add exit codes
Shaumik-Ashraf Aug 7, 2024
ff68b3b
add inputs and outputs to verbose
Shaumik-Ashraf Aug 7, 2024
df1a988
add long help and fix thor depreciation notice
Shaumik-Ashraf Aug 7, 2024
c397a2c
wip rspec
Shaumik-Ashraf Aug 7, 2024
aad9453
wip rspec
Shaumik-Ashraf Aug 8, 2024
095117b
debugging
Shaumik-Ashraf Aug 8, 2024
35334b9
debug
Shaumik-Ashraf Aug 8, 2024
7ef1523
rename fetch_test_id to format_id
Shaumik-Ashraf Aug 8, 2024
2df72f3
cleaning
Shaumik-Ashraf Aug 8, 2024
d44d408
cop
Shaumik-Ashraf Aug 8, 2024
e5670e4
more cop
Shaumik-Ashraf Aug 9, 2024
5c05a7d
Merge remote-tracking branch 'origin/main' into fi-2937-inferno-execute
Shaumik-Ashraf Aug 9, 2024
3ee2b50
verify runnable spec
Shaumik-Ashraf Aug 9, 2024
3bac5e1
fix persist_inputs spec
Shaumik-Ashraf Aug 9, 2024
8038d40
clean
Shaumik-Ashraf Aug 9, 2024
d1c5a11
rspec format_result and print_color_results
Shaumik-Ashraf Aug 9, 2024
b3b3ac6
cop
Shaumik-Ashraf Aug 9, 2024
2d6ae5a
increase codecov
Shaumik-Ashraf Aug 9, 2024
845f43b
add execute run test
Shaumik-Ashraf Aug 9, 2024
726f1dd
debug
Shaumik-Ashraf Aug 9, 2024
5914d31
add --help to inferno execute; adjust exit codes
Shaumik-Ashraf Aug 13, 2024
25ee150
suppress fhir client logger output
Shaumik-Ashraf Aug 13, 2024
a0d2bcb
impl suite options
Shaumik-Ashraf Aug 14, 2024
bcc109b
impl group/test execution
Shaumik-Ashraf Aug 14, 2024
d0e3b4c
factoring
Shaumik-Ashraf Aug 15, 2024
e361b8d
debugging rspec
Shaumik-Ashraf Aug 15, 2024
51f6cf2
rubocopping and cleaning
Shaumik-Ashraf Aug 15, 2024
88c2412
create cli boot via dry-rb system
Shaumik-Ashraf Aug 19, 2024
46be4f7
debug validator sessions loading error
Shaumik-Ashraf Aug 25, 2024
f3605be
cop
Shaumik-Ashraf Aug 26, 2024
2ff92e6
the big brain play
Shaumik-Ashraf Aug 27, 2024
ef4d8eb
rename cli booter to executor
Shaumik-Ashraf Aug 28, 2024
747d484
lint
Shaumik-Ashraf Aug 28, 2024
150464b
more rspec
Shaumik-Ashraf Aug 28, 2024
e3efab0
Merge branch 'main' into fi-2937-inferno-execute
Shaumik-Ashraf Aug 28, 2024
5c85015
In execute_spec.rb rename legit JSON to valid JSON
Shaumik-Ashraf Aug 29, 2024
d132650
address util spec, reword test titles, remove useless defined test
Shaumik-Ashraf Aug 29, 2024
23b448e
rename execute_spec#print_color_results test
Shaumik-Ashraf Aug 29, 2024
d19b8a8
fix execute.rb multi-line reverse condition
Shaumik-Ashraf Aug 29, 2024
f772642
execute_spec make #format_messages tests case sensitive
Shaumik-Ashraf Aug 29, 2024
45353d4
wrap execute help message
Shaumik-Ashraf Aug 29, 2024
729ae9d
factorize format_input and format_output into format_session_data and…
Shaumik-Ashraf Aug 29, 2024
d6fef8b
execute_spec JSON parse validation
Shaumik-Ashraf Aug 29, 2024
88709a5
execute_spec remove all stubbed_instance variables
Shaumik-Ashraf Aug 29, 2024
a1f9622
execute_spec#set_runnable remove useless test
Shaumik-Ashraf Aug 29, 2024
4162814
fix rubocop but on stderr test
Shaumik-Ashraf Aug 29, 2024
e54444a
remove stderr suppression from Execute.suppress_output
Shaumik-Ashraf Aug 29, 2024
209ef99
replace set_runnable with better runnable and runnable_type getters
Shaumik-Ashraf Aug 29, 2024
c3ec5f6
rm redundant rspec test_session_inst
Shaumik-Ashraf Aug 30, 2024
efb9983
execute.rb fix results title
Shaumik-Ashraf Sep 3, 2024
43b4f53
make --help exit with 0
Shaumik-Ashraf Sep 3, 2024
da7acd4
cop
Shaumik-Ashraf Sep 3, 2024
7c36858
replace format_id with format_tag
Shaumik-Ashraf Sep 3, 2024
424d2e2
rspec and cop format_tag
Shaumik-Ashraf Sep 3, 2024
41d7af0
Merge branch 'main' into fi-2937-inferno-execute
Shaumik-Ashraf Sep 4, 2024
7cab803
add yard private tag to new utils
Shaumik-Ashraf Sep 4, 2024
c47714a
impl console outputter class
Shaumik-Ashraf Sep 4, 2024
86db812
debugging
Shaumik-Ashraf Sep 4, 2024
fa657c7
Merge branch 'fi-2937-inferno-execute' of github.com:inferno-framewor…
Shaumik-Ashraf Sep 4, 2024
94d6a79
debug
Shaumik-Ashraf Sep 4, 2024
641496c
cop
Shaumik-Ashraf Sep 4, 2024
7fbd564
refactor code to take short ids
Shaumik-Ashraf Sep 10, 2024
e481fca
cleaning
Shaumik-Ashraf Sep 10, 2024
40073f8
debug
Shaumik-Ashraf Sep 10, 2024
3609646
move repo methods to bottom
Shaumik-Ashraf Sep 10, 2024
8dbe385
resort execute methods in call order
Shaumik-Ashraf Sep 10, 2024
9619e74
wip rspec
Shaumik-Ashraf Sep 10, 2024
6aaf29c
wip rspec
Shaumik-Ashraf Sep 11, 2024
df0d205
wip rspec
Shaumik-Ashraf Sep 11, 2024
18e4bbe
wip rspec
Shaumik-Ashraf Sep 11, 2024
098212c
wip rspec
Shaumik-Ashraf Sep 11, 2024
6819b1e
Merge remote-tracking branch 'origin/main' into fi-2937-inferno-execute
Shaumik-Ashraf Sep 12, 2024
dcc0463
fix rspec
Shaumik-Ashraf Sep 12, 2024
1969015
remove validator boot from executor boot
Shaumik-Ashraf Sep 12, 2024
9ac3c19
replace -o alias with -u for suite options
Shaumik-Ashraf Sep 12, 2024
e973097
Merge branch 'main' into fi-2937-inferno-execute
Shaumik-Ashraf Sep 13, 2024
474dcc5
Merge branch 'main' into fi-2937-inferno-execute
Shaumik-Ashraf Sep 18, 2024
9cb3d39
Merge branch 'main' into fi-2937-inferno-execute
Shaumik-Ashraf Sep 21, 2024
e120034
Merge branch 'main' into fi-2937-inferno-execute
Shaumik-Ashraf Sep 25, 2024
e690d77
remove bang from find_by_short_id name
Shaumik-Ashraf Sep 25, 2024
cd674c0
remove exception raises from abstract methods in abstract outputter
Shaumik-Ashraf Sep 25, 2024
8833d97
yank abstract outputter
Shaumik-Ashraf Sep 25, 2024
f796e1d
Merge branch 'main' into fi-2937-inferno-execute
Shaumik-Ashraf Sep 27, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ PATH
hanami-controller (= 2.0.0)
hanami-router (= 2.0.0)
oj (= 3.11.0)
pastel (~> 0.8.0)
pry
pry-byebug
puma (~> 5.6.7)
Expand Down
58 changes: 58 additions & 0 deletions dev_suites/dev_validator_suite/validator_suite.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# frozen_string_literal: true

module DevValidatorSuite
class ValidatorSuite < Inferno::TestSuite
title 'Validator Suite'
id :dev_validator
description 'Inferno Core Developer Suite that makes calls to the HL7 Validator.'

input :url,
title: 'FHIR Server Base Url'

input :access_token,
title: 'Bearer/Access Token',
optional: true

fhir_client do
url :url
bearer_token :access_token
end

fhir_resource_validator do
url 'http://localhost/hl7validatorapi'
end

group do
title 'Patient Test Group'
id :patient_group

input :patient_id,
title: 'Patient ID'

test do
title 'Patient Read Test'
id :patient_read_test

makes_request :patient_read

run do
fhir_read(:patient, patient_id, name: :patient_read)

assert_response_status 200
end
end

test do
title 'Patient Validate Test'
id :patient_validate_test

uses_request :patient_read

run do
assert_resource_type(:patient)
assert_valid_resource
end
end
end
end
end
1 change: 1 addition & 0 deletions inferno_core.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
spec.add_runtime_dependency 'hanami-controller', '2.0.0'
spec.add_runtime_dependency 'hanami-router', '2.0.0'
spec.add_runtime_dependency 'oj', '3.11.0'
spec.add_runtime_dependency 'pastel', '~> 0.8.0'
spec.add_runtime_dependency 'pry'
spec.add_runtime_dependency 'pry-byebug'
spec.add_runtime_dependency 'puma', '~> 5.6.7'
Expand Down
1 change: 0 additions & 1 deletion lib/inferno/apps/cli.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
require 'thor'

require_relative 'cli/main'

module Inferno
Expand Down
227 changes: 227 additions & 0 deletions lib/inferno/apps/cli/execute.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
require 'pastel'
require 'active_support'
require_relative '../../utils/verify_runnable'
require_relative '../../utils/persist_inputs'
require_relative 'execute/console_outputter'

module Inferno
module CLI
class Execute
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This class is doing too much. Display and execution concerns should be separated. This would get even worse once we have multiple output formats.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you want to refactor it in this PR? I could also do it in a JSON-only-output PR.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

refactored!

include ::Inferno::Utils::VerifyRunnable
include ::Inferno::Utils::PersistInputs

attr_accessor :options

def self.suppress_output
begin
original_stdout = $stdout.clone
$stdout.reopen(File.new(File::NULL, 'w+'))
retval = yield
ensure
$stdout.reopen(original_stdout)
end
retval
end

def self.boot_full_inferno
ENV['NO_DB'] = 'false'

# Inferno boot flow triggers migration and logger outputs it
Inferno::CLI::Execute.suppress_output { require_relative '../../../inferno' }

Inferno::Application.start(:executor)
end

def run(options)
print_help_and_exit if options[:help]

self.options = options

outputter.print_start_message(options)

results = []
outputter.print_around_run(options) do
if selected_runnables.empty?
run_one(suite)
results = test_runs_repo.results_for_test_run(test_run(suite).id).reverse
else
selected_runnables.each do |runnable|
run_one(runnable)
results += test_runs_repo.results_for_test_run(test_run(runnable).id).reverse
end
end
end

outputter.print_results(options, results)

outputter.print_end_message(options)

exit(0) if results.all? { |result| result.result == 'pass' }

# exit(1) is for Thor failures
# exit(2) is for shell builtin failures
exit(3)
rescue Sequel::ValidationFailed => e
print_error_and_exit(e, 4)
rescue Sequel::ForeignKeyConstraintViolation => e
print_error_and_exit(e, 5)
rescue Inferno::Exceptions::RequiredInputsNotFound => e
print_error_and_exit(e, 6)
rescue Inferno::Exceptions::NotUserRunnableException => e
print_error_and_exit(e, 7)
rescue StandardError => e
print_error_and_exit(e, 8)
end

def print_help_and_exit
puts `NO_DB=true bundle exec inferno help execute`
exit(0)
end

def outputter
# TODO: swap outputter based on options
@outputter ||= Inferno::CLI::Execute::ConsoleOutputter.new
end

def selected_runnables
groups + tests
end

def run_one(runnable)
verify_runnable(
suite,
thor_hash_to_inputs_array(options[:inputs]),
test_session.suite_options
)

persist_inputs(session_data_repo, create_params(test_session, suite), test_run(runnable))

dispatch_job(test_run(runnable))
end

def suite
@suite ||= Inferno::Repositories::TestSuites.new.find(options[:suite])

raise StandardError, "Test suite #{options[:suite]} not found" if @suite.nil?

@suite
end

def test_runs_repo
@test_runs_repo ||= Inferno::Repositories::TestRuns.new
end

def test_run(runnable_param)
@test_runs ||= {}

@test_runs[runnable_param] ||= test_runs_repo.create(
create_params(test_session, runnable_param).merge({ status: 'queued' })
)

@test_runs[runnable_param]
end

def test_groups_repo
@test_groups_repo ||= Inferno::Repositories::TestGroups.new
end

def tests_repo
@tests_repo ||= Inferno::Repositories::Tests.new
end

def test_sessions_repo
@test_sessions_repo ||= Inferno::Repositories::TestSessions.new
end

def session_data_repo
@session_data_repo ||= Inferno::Repositories::SessionData.new
end

def test_session
@test_session ||= test_sessions_repo.create({
test_suite_id: suite.id,
suite_options: thor_hash_to_suite_options_array(
options[:suite_options]
)
})
end

def create_params(test_session, runnable)
{
test_session_id: test_session.id,
runnable_id_key(runnable) => runnable.id,
inputs: thor_hash_to_inputs_array(options[:inputs])
}
end

def dispatch_job(test_run)
# TODO: move suppression to outputter? better suppression?
if options[:verbose]
Jobs.perform(Jobs::ExecuteTestRun, test_run.id, force_synchronous: true)
else
Inferno::CLI::Execute.suppress_output do
Jobs.perform(Jobs::ExecuteTestRun, test_run.id, force_synchronous: true)
end
end
end

def groups
return [] if options[:groups].blank?

@groups ||= options[:groups]&.map { |short_id| find_by_short_id(test_groups_repo, short_id) }
end

def tests
return [] if options[:tests].blank?

@tests ||= options[:tests]&.map { |short_id| find_by_short_id(tests_repo, short_id) }
end

def find_by_short_id(repo, short_id)
repo.all.each do |entity|
return entity if short_id == entity.short_id && suite.id == entity.suite.id
end
raise StandardError, "Group or test #{short_id} not found"
end

def thor_hash_to_suite_options_array(hash = {})
hash.to_a.map { |pair| Inferno::DSL::SuiteOption.new({ id: pair[0], value: pair[1] }) }
end

def thor_hash_to_inputs_array(hash = {})
hash.to_a.map { |pair| { name: pair[0], value: pair[1] } }
end

def print_error_and_exit(err, code)
outputter.print_error(options || {}, err)
rescue StandardError => e
puts "Caught exception #{e} while printing exception #{err}. Exiting."
ensure
exit(code)
end

def runnable_type(runnable)
if Inferno::TestSuite.subclasses.include? runnable
:suite
elsif Inferno::TestGroup.subclasses.include? runnable
:group
elsif Inferno::Test.subclasses.include? runnable
:test
else
raise StandardError, "Unidentified runnable #{runnable}"
end
end

def runnable_id_key(runnable)
case runnable_type(runnable)
when :suite
:test_suite_id
when :group
:test_group_id
else
:test_id
end
end
end
end
end
Loading
Loading