inferno_core 0.0.2 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/inferno/apps/web/controllers/test_runs/create.rb +30 -10
- data/lib/inferno/apps/web/controllers/test_runs/show.rb +10 -0
- data/lib/inferno/apps/web/controllers/test_sessions/create.rb +1 -0
- data/lib/inferno/apps/web/controllers/test_sessions/last_test_run.rb +22 -0
- data/lib/inferno/apps/web/controllers/test_sessions/results/index.rb +6 -1
- data/lib/inferno/apps/web/controllers/test_sessions/session_data/index.rb +21 -0
- data/lib/inferno/apps/web/router.rb +15 -0
- data/lib/inferno/apps/web/serializers/hash_value_extractor.rb +11 -0
- data/lib/inferno/apps/web/serializers/request.rb +1 -0
- data/lib/inferno/apps/web/serializers/result.rb +8 -0
- data/lib/inferno/apps/web/serializers/session_data.rb +10 -0
- data/lib/inferno/apps/web/serializers/test.rb +3 -6
- data/lib/inferno/apps/web/serializers/test_group.rb +5 -8
- data/lib/inferno/apps/web/serializers/test_run.rb +1 -0
- data/lib/inferno/apps/web/serializers/test_session.rb +1 -1
- data/lib/inferno/apps/web/serializers/test_suite.rb +1 -0
- data/lib/inferno/config/application.rb +5 -2
- data/lib/inferno/config/boot/db.rb +10 -1
- data/lib/inferno/config/boot/sidekiq.rb +11 -0
- data/lib/inferno/config/boot/suites.rb +4 -6
- data/lib/inferno/config/boot.rb +2 -0
- data/lib/inferno/db/migrations/001_create_initial_structure.rb +0 -21
- data/lib/inferno/db/migrations/002_add_wait_support.rb +7 -0
- data/lib/inferno/db/migrations/003_update_session_data.rb +18 -0
- data/lib/inferno/db/migrations/004_add_request_results_table.rb +9 -0
- data/lib/inferno/db/migrations/005_add_updated_at_index_to_results.rb +5 -0
- data/lib/inferno/db/schema.rb +154 -0
- data/lib/inferno/dsl/assertions.rb +20 -0
- data/lib/inferno/dsl/configurable.rb +126 -0
- data/lib/inferno/dsl/fhir_client.rb +4 -2
- data/lib/inferno/dsl/fhir_client_builder.rb +16 -0
- data/lib/inferno/dsl/http_client.rb +10 -8
- data/lib/inferno/dsl/request_storage.rb +30 -9
- data/lib/inferno/dsl/results.rb +49 -0
- data/lib/inferno/dsl/resume_test_route.rb +89 -0
- data/lib/inferno/dsl/runnable.rb +153 -16
- data/lib/inferno/dsl.rb +1 -3
- data/lib/inferno/entities/header.rb +7 -7
- data/lib/inferno/entities/message.rb +8 -6
- data/lib/inferno/entities/request.rb +42 -16
- data/lib/inferno/entities/result.rb +34 -18
- data/lib/inferno/entities/session_data.rb +33 -0
- data/lib/inferno/entities/test.rb +35 -8
- data/lib/inferno/entities/test_group.rb +8 -0
- data/lib/inferno/entities/test_run.rb +13 -6
- data/lib/inferno/entities/test_session.rb +8 -8
- data/lib/inferno/entities.rb +1 -1
- data/lib/inferno/exceptions.rb +24 -0
- data/lib/inferno/jobs/execute_test_run.rb +14 -0
- data/lib/inferno/jobs/resume_test_run.rb +14 -0
- data/lib/inferno/jobs.rb +16 -0
- data/lib/inferno/public/bundle.js +1 -1
- data/lib/inferno/repositories/repository.rb +13 -0
- data/lib/inferno/repositories/requests.rb +5 -4
- data/lib/inferno/repositories/results.rb +151 -3
- data/lib/inferno/repositories/session_data.rb +47 -0
- data/lib/inferno/repositories/test_runs.rb +81 -0
- data/lib/inferno/test_runner.rb +125 -31
- data/lib/inferno/utils/markdown_formatter.rb +15 -0
- data/lib/inferno/utils/middleware/request_logger.rb +16 -3
- data/lib/inferno/version.rb +1 -1
- data/lib/inferno.rb +4 -0
- data/spec/factories/header.rb +19 -0
- data/spec/factories/message.rb +17 -0
- data/spec/factories/request.rb +42 -0
- data/spec/factories/result.rb +45 -0
- data/spec/factories/test_run.rb +24 -0
- data/spec/factories/test_session.rb +11 -0
- data/spec/fixtures/basic_test_group.rb +9 -0
- data/spec/fixtures/basic_test_suite.rb +8 -0
- metadata +57 -5
- data/lib/inferno/dsl/fhir_manipulation.rb +0 -25
- data/lib/inferno/entities/test_input.rb +0 -20
data/lib/inferno/dsl.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require_relative 'dsl/assertions'
|
2
2
|
require_relative 'dsl/fhir_client'
|
3
|
-
require_relative 'dsl/fhir_manipulation'
|
4
3
|
require_relative 'dsl/fhir_validation'
|
5
4
|
require_relative 'dsl/http_client'
|
6
5
|
require_relative 'dsl/results'
|
@@ -14,8 +13,7 @@ module Inferno
|
|
14
13
|
FHIRClient,
|
15
14
|
HTTPClient,
|
16
15
|
Results,
|
17
|
-
FHIRValidation
|
18
|
-
FHIRManipulation
|
16
|
+
FHIRValidation
|
19
17
|
].freeze
|
20
18
|
|
21
19
|
EXTENDABLE_DSL_MODULES = [
|
@@ -2,13 +2,13 @@ module Inferno
|
|
2
2
|
module Entities
|
3
3
|
# A `Header` represents an HTTP request/response header
|
4
4
|
#
|
5
|
-
# @
|
6
|
-
# @
|
7
|
-
# @
|
8
|
-
# @
|
9
|
-
# @
|
10
|
-
# @
|
11
|
-
# @
|
5
|
+
# @attr_accessor [String] id of the header
|
6
|
+
# @attr_accessor [String] request_id index of the HTTP request
|
7
|
+
# @attr_accessor [String] name header name
|
8
|
+
# @attr_accessor [String] value header value
|
9
|
+
# @attr_accessor [String] type request/response
|
10
|
+
# @attr_accessor [Time] created_at
|
11
|
+
# @attr_accessor [Time] updated_at
|
12
12
|
class Header < Entity
|
13
13
|
ATTRIBUTES = [:id, :request_id, :name, :type, :value, :created_at, :updated_at].freeze
|
14
14
|
|
@@ -2,12 +2,14 @@ module Inferno
|
|
2
2
|
module Entities
|
3
3
|
# A `Message` represents a message generated during a test.
|
4
4
|
#
|
5
|
-
# @
|
6
|
-
# @
|
7
|
-
# @
|
8
|
-
# @
|
9
|
-
# @
|
10
|
-
# @
|
5
|
+
# @attr_accessor [String] id of the message
|
6
|
+
# @attr_accessor [String] index of the message. Used for ordering.
|
7
|
+
# @attr_accessor [String] result_id
|
8
|
+
# @attr_accessor [Inferno::Entities::Result] result
|
9
|
+
# @attr_accessor [String] type
|
10
|
+
# @attr_accessor [String] message
|
11
|
+
# @attr_accessor [Time] created_at
|
12
|
+
# @attr_accessor [Time] updated_at
|
11
13
|
class Message < Entity
|
12
14
|
ATTRIBUTES = [:id, :index, :message, :result_id, :result, :type, :created_at, :updated_at].freeze
|
13
15
|
TYPES = ['error', 'warning', 'info'].freeze
|
@@ -2,21 +2,21 @@ module Inferno
|
|
2
2
|
module Entities
|
3
3
|
# A `Request` represents a request and response issued during a test.
|
4
4
|
#
|
5
|
-
# @
|
6
|
-
# @
|
7
|
-
# @
|
8
|
-
# @
|
9
|
-
# @
|
10
|
-
# @
|
11
|
-
# @
|
12
|
-
# @
|
13
|
-
# @
|
14
|
-
# @
|
5
|
+
# @attr_accessor [String] id of the request
|
6
|
+
# @attr_accessor [String] index of the request. Used for ordering.
|
7
|
+
# @attr_accessor [String] verb http verb
|
8
|
+
# @attr_accessor [String] url request url
|
9
|
+
# @attr_accessor [String] direction incoming/outgoing
|
10
|
+
# @attr_accessor [String] name name for the request
|
11
|
+
# @attr_accessor [String] status http response status code
|
12
|
+
# @attr_accessor [String] request_body body of the http request
|
13
|
+
# @attr_accessor [String] response_body body of the http response
|
14
|
+
# @attr_accessor [Array<Inferno::Entities::Header>] headers http
|
15
15
|
# request/response headers
|
16
|
-
# @
|
17
|
-
# @
|
18
|
-
# @
|
19
|
-
# @
|
16
|
+
# @attr_accessor [String] result_id id of the result for this request
|
17
|
+
# @attr_accessor [String] test_session_id id of the test session for this request
|
18
|
+
# @attr_accessor [Time] created_at creation timestamp
|
19
|
+
# @attr_accessor [Time] updated_at update timestamp
|
20
20
|
class Request < Entity
|
21
21
|
ATTRIBUTES = [
|
22
22
|
:id, :index, :verb, :url, :direction, :name, :status,
|
@@ -36,12 +36,17 @@ module Inferno
|
|
36
36
|
@headers = params[:headers]&.map { |header| header.is_a?(Hash) ? Header.new(header) : header } || []
|
37
37
|
end
|
38
38
|
|
39
|
+
# @return [Hash<String, String>]
|
40
|
+
def query_parameters
|
41
|
+
Addressable::URI.parse(url).query_values || {}
|
42
|
+
end
|
43
|
+
|
39
44
|
# Find a response header
|
40
45
|
#
|
41
46
|
# @param name [String] the header name
|
42
47
|
# @return [Inferno::Entities::RequestHeader, nil]
|
43
48
|
def response_header(name)
|
44
|
-
response_headers.find { |header| header.name
|
49
|
+
response_headers.find { |header| header.name.casecmp(name).zero? }
|
45
50
|
end
|
46
51
|
|
47
52
|
# Find a request header
|
@@ -49,7 +54,7 @@ module Inferno
|
|
49
54
|
# @param name [String] the header name
|
50
55
|
# @return [Inferno::Entities::RequestHeader, nil]
|
51
56
|
def request_header(name)
|
52
|
-
request_headers.find { |header| header.name
|
57
|
+
request_headers.find { |header| header.name.casecmp(name).zero? }
|
53
58
|
end
|
54
59
|
|
55
60
|
# All of the request headers
|
@@ -117,6 +122,27 @@ module Inferno
|
|
117
122
|
end
|
118
123
|
|
119
124
|
class << self
|
125
|
+
# @api private
|
126
|
+
def from_rack_env(env, name: nil)
|
127
|
+
rack_request = env['router.request'].rack_request
|
128
|
+
url = "#{rack_request.base_url}#{rack_request.path}"
|
129
|
+
url += "?#{rack_request.query_string}" if rack_request.query_string.present?
|
130
|
+
request_headers =
|
131
|
+
env
|
132
|
+
.select { |key, _| key.start_with? 'HTTP_' }
|
133
|
+
.transform_keys { |key| key.delete_prefix('HTTP_').tr('_', '-').downcase }
|
134
|
+
.map { |header_name, value| Header.new(name: header_name, value: value, type: 'request') }
|
135
|
+
|
136
|
+
new(
|
137
|
+
verb: rack_request.request_method.downcase,
|
138
|
+
url: url,
|
139
|
+
direction: 'incoming',
|
140
|
+
name: name,
|
141
|
+
request_body: rack_request.body.string,
|
142
|
+
headers: request_headers
|
143
|
+
)
|
144
|
+
end
|
145
|
+
|
120
146
|
# @api private
|
121
147
|
def from_http_response(response, test_session_id:, direction: 'outgoing', name: nil)
|
122
148
|
request_headers =
|
@@ -3,32 +3,42 @@ module Inferno
|
|
3
3
|
# A `Result` represents the result of running a `Test`, `TestGroup`,
|
4
4
|
# or `TestSuite`
|
5
5
|
#
|
6
|
-
# @
|
7
|
-
# @
|
8
|
-
# @
|
9
|
-
# @
|
10
|
-
# (`Test`, `TestGroup`, or `TestSuite`)
|
11
|
-
# @
|
12
|
-
#
|
13
|
-
# @
|
14
|
-
# @
|
15
|
-
#
|
16
|
-
# @
|
17
|
-
#
|
6
|
+
# @attr_accessor [String] id id of the session
|
7
|
+
# @attr_accessor [Time] created_at creation timestamp
|
8
|
+
# @attr_accessor [Time] updated_at update timestamp
|
9
|
+
# @attr_accessor [String] reference_type type of entity this result belongs
|
10
|
+
# to (`Test`, `TestGroup`, or `TestSuite`)
|
11
|
+
# @attr_accessor [String, nil] test_id id of the `Test` this result belongs
|
12
|
+
# to
|
13
|
+
# @attr_accessor [Test, nil] test the `Test` this result belongs to
|
14
|
+
# @attr_accessor [String, nil] test_group_id id of the `TestGroup` this
|
15
|
+
# result belongs to
|
16
|
+
# @attr_accessor [TestGroup, nil] test_group the `TestGroup` this result
|
17
|
+
# belongs to
|
18
|
+
# @attr_accessor [String, nil] test_suite_id id of the `TestSuite` this
|
19
|
+
# result belongs to
|
20
|
+
# @attr_accessor [TestSuite, nil] test_suite the `TestSuite` this result
|
21
|
+
# belongs to
|
22
|
+
# @attr_accessor [String] result the result (`pass`, `fail`, `skip`, `omit`,
|
18
23
|
# `error`, `running`, `wait`, `cancel`)
|
19
|
-
# @
|
20
|
-
# @
|
21
|
-
# @
|
24
|
+
# @attr_accessor [String] result_message summary message for this result
|
25
|
+
# @attr_accessor [String] test_run_id the `TestRun` this result belongs to
|
26
|
+
# @attr_accessor [String] test_session_id the `TestSession` this result
|
22
27
|
# belongs to
|
23
|
-
# @
|
28
|
+
# @attr_accessor [Array<Inferno::Entities::Message>] messages additional
|
24
29
|
# messages for this result
|
25
|
-
# @
|
30
|
+
# @attr_accessor [Array<Inferno::Entities::Request>] request_summaries
|
26
31
|
# summaries of the requests associated with this result
|
32
|
+
# @attr_accessor [String] input_json JSON string of the inputs used for this
|
33
|
+
# result
|
34
|
+
# @attr_accessor [String] output_json JSON string of the outputs created by
|
35
|
+
# this result
|
27
36
|
class Result < Entity
|
28
37
|
ATTRIBUTES = [
|
29
38
|
:id, :created_at, :updated_at, :test_id, :test, :test_group_id,
|
30
39
|
:test_group, :test_suite_id, :test_suite, :test_run_id,
|
31
|
-
:test_session_id, :result, :result_message, :messages, :requests
|
40
|
+
:test_session_id, :result, :result_message, :messages, :requests,
|
41
|
+
:input_json, :output_json
|
32
42
|
].freeze
|
33
43
|
RESULT_OPTIONS = ['cancel', 'wait', 'running', 'error', 'fail', 'skip', 'omit', 'pass'].freeze
|
34
44
|
|
@@ -41,9 +51,15 @@ module Inferno
|
|
41
51
|
@requests = (params[:requests] || []).map { |request| Request.new(request) }
|
42
52
|
end
|
43
53
|
|
54
|
+
# @return [Inferno::Entities::Test, Inferno::Entities::TestGroup, Inferno::Entities::TestSuite]
|
44
55
|
def runnable
|
45
56
|
test || test_group || test_suite
|
46
57
|
end
|
58
|
+
|
59
|
+
# @return [Boolean]
|
60
|
+
def waiting?
|
61
|
+
result == 'wait'
|
62
|
+
end
|
47
63
|
end
|
48
64
|
end
|
49
65
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Inferno
|
2
|
+
module Entities
|
3
|
+
# `SessionData` represents a piece of saved state for a `TestSession`.
|
4
|
+
# These are used to store test inputs and outputs.
|
5
|
+
#
|
6
|
+
# @attr_accessor [String] id of the test input
|
7
|
+
# @attr_accessor [String] name
|
8
|
+
# @attr_accessor [String] value
|
9
|
+
# @attr_accessor [String] test_session_id
|
10
|
+
# @attr_accessor [Time] created_at
|
11
|
+
# @attr_accessor [Time] updated_at
|
12
|
+
class SessionData < Entity
|
13
|
+
ATTRIBUTES = [:id, :name, :value, :test_session_id, :created_at, :updated_at].freeze
|
14
|
+
|
15
|
+
include Inferno::Entities::Attributes
|
16
|
+
|
17
|
+
def initialize(params)
|
18
|
+
super(params, ATTRIBUTES)
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_hash
|
22
|
+
{
|
23
|
+
id: id,
|
24
|
+
name: name,
|
25
|
+
value: value,
|
26
|
+
test_session_id: test_session_id,
|
27
|
+
created_at: created_at,
|
28
|
+
updated_at: updated_at
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,19 +1,23 @@
|
|
1
1
|
require_relative '../dsl'
|
2
2
|
require_relative '../repositories/tests'
|
3
|
+
require_relative '../utils/markdown_formatter'
|
4
|
+
require 'pry'
|
3
5
|
|
4
6
|
module Inferno
|
5
7
|
module Entities
|
6
8
|
class Test
|
7
9
|
extend Forwardable
|
8
10
|
include DSL
|
11
|
+
include Inferno::Utils::MarkdownFormatter
|
9
12
|
|
10
13
|
def_delegators 'self.class', :title, :id, :block, :inputs, :outputs
|
11
14
|
|
12
15
|
attr_accessor :result_message
|
13
|
-
attr_reader :
|
16
|
+
attr_reader :test_session_id, :scratch
|
14
17
|
|
15
18
|
def initialize(**params)
|
16
|
-
|
19
|
+
params[:inputs]&.each { |key, value| instance_variable_set("@#{key}", value) }
|
20
|
+
@scratch = params[:scratch]
|
17
21
|
@test_session_id = params[:test_session_id]
|
18
22
|
end
|
19
23
|
|
@@ -22,7 +26,7 @@ module Inferno
|
|
22
26
|
end
|
23
27
|
|
24
28
|
def add_message(type, message)
|
25
|
-
messages << { type: type.to_s, message: message }
|
29
|
+
messages << { type: type.to_s, message: format_markdown(message) }
|
26
30
|
end
|
27
31
|
|
28
32
|
# Set output values. Once set, these values will be available to any
|
@@ -33,11 +37,21 @@ module Inferno
|
|
33
37
|
# @example
|
34
38
|
# output(patient_id: '5', bearer_token: 'ABC')
|
35
39
|
def output(outputs)
|
40
|
+
# TODO: update to track outputs that need to be updated
|
36
41
|
outputs.each do |key, value|
|
37
42
|
send("#{key}=", value)
|
43
|
+
outputs_to_persist[key] = value
|
38
44
|
end
|
39
45
|
end
|
40
46
|
|
47
|
+
# @api private
|
48
|
+
# A hash containing outputs that have been set during execution and need
|
49
|
+
# to be persisted. A test may not always update all outputs, so this is
|
50
|
+
# used to prevent overwriting an output with nil when it wasn't updated.
|
51
|
+
def outputs_to_persist
|
52
|
+
@outputs_to_persist ||= {}
|
53
|
+
end
|
54
|
+
|
41
55
|
# Add an informational message to the results of a test. If passed a
|
42
56
|
# block, a failed assertion will become an info message and test execution
|
43
57
|
# will continue.
|
@@ -102,15 +116,24 @@ module Inferno
|
|
102
116
|
class << self
|
103
117
|
# Define inputs for this Test
|
104
118
|
#
|
105
|
-
# @param
|
119
|
+
# @param name [Symbol] name of the input
|
120
|
+
# @param other_names [Symbol] array of symbols if specifying multiple inputs
|
121
|
+
# @param input_definition [Hash] options for input such as type, description, or title
|
122
|
+
# @option input_definition [String] :title Human readable title for input
|
123
|
+
# @option input_definition [String] :description Description for the input
|
124
|
+
# @option input_definition [String] :type 'text' | 'textarea'
|
106
125
|
# @return [void]
|
107
126
|
# @example
|
108
|
-
# input :
|
109
|
-
|
127
|
+
# input :patientid, title: 'Patient ID', description: 'The ID of the patient being searched for'
|
128
|
+
# @example
|
129
|
+
# input :textarea, title: 'Textarea Input Example', type: 'textarea'
|
130
|
+
def input(name, *other_names, **input_definition)
|
110
131
|
super
|
111
132
|
|
112
|
-
|
113
|
-
attr_reader input
|
133
|
+
if other_names.present?
|
134
|
+
[name, *other_names].each { |input| attr_reader input }
|
135
|
+
else
|
136
|
+
attr_reader name
|
114
137
|
end
|
115
138
|
end
|
116
139
|
|
@@ -153,6 +176,10 @@ module Inferno
|
|
153
176
|
}
|
154
177
|
end
|
155
178
|
|
179
|
+
def test_count
|
180
|
+
1
|
181
|
+
end
|
182
|
+
|
156
183
|
def method_missing(name, *args, &block)
|
157
184
|
parent_instance = parent&.new
|
158
185
|
if parent_instance.respond_to?(name)
|
@@ -2,13 +2,14 @@ module Inferno
|
|
2
2
|
module Entities
|
3
3
|
# A `TestRun` represents a request to execute an executable set of tests.
|
4
4
|
#
|
5
|
-
# @
|
6
|
-
# @
|
7
|
-
# @
|
8
|
-
# @
|
9
|
-
# @
|
10
|
-
# @
|
5
|
+
# @attr_accessor [String] id of the test input
|
6
|
+
# @attr_accessor [String] test_session_id
|
7
|
+
# @attr_accessor [String] status
|
8
|
+
# @attr_accessor [String] test_suite_id
|
9
|
+
# @attr_accessor [String] test_group_id
|
10
|
+
# @attr_accessor [String] test_id
|
11
11
|
class TestRun < Entity
|
12
|
+
STATUS_OPTIONS = ['queued', 'running', 'waiting', 'done'].freeze
|
12
13
|
ATTRIBUTES = [
|
13
14
|
:id,
|
14
15
|
:test_session_id,
|
@@ -21,6 +22,8 @@ module Inferno
|
|
21
22
|
:test_suite,
|
22
23
|
:inputs,
|
23
24
|
:results,
|
25
|
+
:identifier,
|
26
|
+
:wait_timeout,
|
24
27
|
:created_at,
|
25
28
|
:updated_at
|
26
29
|
].freeze
|
@@ -47,6 +50,10 @@ module Inferno
|
|
47
50
|
super.merge(test_session: test_session).compact
|
48
51
|
end
|
49
52
|
|
53
|
+
def test_count
|
54
|
+
@test_count ||= runnable.test_count
|
55
|
+
end
|
56
|
+
|
50
57
|
private
|
51
58
|
|
52
59
|
def load_runnable
|
@@ -2,19 +2,19 @@ module Inferno
|
|
2
2
|
module Entities
|
3
3
|
# A `TestSession` represents an individual testing session.
|
4
4
|
#
|
5
|
-
# @
|
6
|
-
# @
|
7
|
-
# @
|
8
|
-
# @
|
5
|
+
# @attr_accessor [String] id id of the session
|
6
|
+
# @attr_accessor [Time] created_at creation timestamp
|
7
|
+
# @attr_accessor [Time] updated_at update timestamp
|
8
|
+
# @attr_accessor [String] test_suite_id id of the `TestSuite` being run in
|
9
9
|
# this session
|
10
|
-
# @
|
10
|
+
# @attr_accessor [Inferno::Entities::TestSuite] test_suite the `TestSuite` being run in
|
11
11
|
# this session
|
12
|
-
# @
|
12
|
+
# @attr_accessor [Array<Inferno::Entities::TestRun>] test_runs the `TestRuns`
|
13
13
|
# associated with this session
|
14
|
-
# @
|
14
|
+
# @attr_accessor [Array<Inferno::Entities::TestResult>] results the
|
15
15
|
# `TestResults` associated with this session
|
16
16
|
class TestSession < Entity
|
17
|
-
ATTRIBUTES = [:id, :created_at, :updated_at, :test_suite_id, :test_suite, :test_runs, :
|
17
|
+
ATTRIBUTES = [:id, :created_at, :updated_at, :test_suite_id, :test_suite, :test_runs, :results].freeze
|
18
18
|
|
19
19
|
include Inferno::Entities::Attributes
|
20
20
|
|
data/lib/inferno/entities.rb
CHANGED
@@ -4,9 +4,9 @@ require_relative 'entities/header'
|
|
4
4
|
require_relative 'entities/message'
|
5
5
|
require_relative 'entities/request'
|
6
6
|
require_relative 'entities/result'
|
7
|
+
require_relative 'entities/session_data'
|
7
8
|
require_relative 'entities/test'
|
8
9
|
require_relative 'entities/test_group'
|
9
|
-
require_relative 'entities/test_input'
|
10
10
|
require_relative 'entities/test_run'
|
11
11
|
require_relative 'entities/test_session'
|
12
12
|
require_relative 'entities/test_suite'
|
data/lib/inferno/exceptions.rb
CHANGED
@@ -27,6 +27,18 @@ module Inferno
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
class WaitException < TestResultException
|
31
|
+
def result
|
32
|
+
'wait'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class CancelException < TestResultException
|
37
|
+
def result
|
38
|
+
'cancel'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
30
42
|
class ParentNotLoadedException < RuntimeError
|
31
43
|
def initialize(klass, id)
|
32
44
|
super("No #{klass.name.demodulize} found with id '#{id}'")
|
@@ -38,5 +50,17 @@ module Inferno
|
|
38
50
|
super("No '#{validator_name}' validator found")
|
39
51
|
end
|
40
52
|
end
|
53
|
+
|
54
|
+
class RequiredInputsNotFound < RuntimeError
|
55
|
+
def initialize(missing_inputs)
|
56
|
+
super("Missing the following required inputs: #{missing_inputs.join(', ')}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class NotUserRunnableException < RuntimeError
|
61
|
+
def initialize
|
62
|
+
super('The chosen runnable must be run as part of a group')
|
63
|
+
end
|
64
|
+
end
|
41
65
|
end
|
42
66
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Inferno
|
2
|
+
module Jobs
|
3
|
+
class ExecuteTestRun
|
4
|
+
include Sidekiq::Worker
|
5
|
+
|
6
|
+
def perform(test_run_id)
|
7
|
+
test_run = Inferno::Repositories::TestRuns.new.find(test_run_id)
|
8
|
+
test_session = Inferno::Repositories::TestSessions.new.find(test_run.test_session_id)
|
9
|
+
|
10
|
+
TestRunner.new(test_session: test_session, test_run: test_run).start
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Inferno
|
2
|
+
module Jobs
|
3
|
+
class ResumeTestRun
|
4
|
+
include Sidekiq::Worker
|
5
|
+
|
6
|
+
def perform(test_run_id)
|
7
|
+
test_run = Inferno::Repositories::TestRuns.new.find(test_run_id)
|
8
|
+
test_session = Inferno::Repositories::TestSessions.new.find(test_run.test_session_id)
|
9
|
+
|
10
|
+
TestRunner.new(test_session: test_session, test_run: test_run, resume: true).start
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/inferno/jobs.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'sidekiq'
|
2
|
+
|
3
|
+
require_relative 'jobs/execute_test_run'
|
4
|
+
require_relative 'jobs/resume_test_run'
|
5
|
+
|
6
|
+
module Inferno
|
7
|
+
module Jobs
|
8
|
+
def self.perform(job_klass, *params)
|
9
|
+
if Application['async_jobs']
|
10
|
+
job_klass.perform_async(*params)
|
11
|
+
else
|
12
|
+
job_klass.new.perform(*params)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|