moto 1.0.7 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b968b33356b5ded74aa5f2fc317bd573aa49012a
4
- data.tar.gz: f0a9e4c04b7039a3f709fe4ab46dbaa19e3433d9
3
+ metadata.gz: edd2e049b0e7dba56343581d50e61e9a88026eb7
4
+ data.tar.gz: 17e66c69f025ae75cf1b42c019024bd91812a715
5
5
  SHA512:
6
- metadata.gz: 8e1a15ea13bf8b97a41ac473170bc5e535f70f99b5584823ff35044504a9b8aa80ed4bfea8f4f9c5a8112ac5075ed3e9e7129e3da89f56828ae2fccd881e79d6
7
- data.tar.gz: 3ace513d0a6bb0a989b03c1a6e6d7f6e48810f6139d3d18121a01e498532eb5e81f1914916966635a640c8096d89d09e09a09a9505bfcf2f38b40935a2467367
6
+ metadata.gz: 5e34d0f3514791a3ddc4ff69820bbb81ceb7d1f3308925cb66aabd34db31c76b0e54ac03ad410685a23674a0009e6abaf7705566c0838497544c1adde822efe0
7
+ data.tar.gz: cc84b318230866656c81e91594dcce32e27d3538b375af3d5c0cb20d7d7303d86dd66c4cfda9afcce5e18ef5721457ce72d3b322fd3fb3b63228f022c7e5c976
@@ -65,9 +65,8 @@ module Moto
65
65
 
66
66
  def prepare_test_reporter(parsed_arguments)
67
67
  run_params = {}
68
- run_params[:run_name] = parsed_arguments[:run_name]
69
- run_params[:suite_name] = parsed_arguments[:suite_name]
70
- run_params[:assignee] = parsed_arguments[:assignee]
68
+ run_params[:mwui_path] = parsed_arguments[:mwui_path]
69
+ run_params[:mwui_assignee_id] = parsed_arguments[:mwui_assignee_id]
71
70
 
72
71
  Moto::Reporting::TestReporter.new(parsed_arguments[:listeners], run_params)
73
72
  end
@@ -49,13 +49,19 @@ module Moto
49
49
  @test_metadata = @tests_metadata.shift
50
50
  end
51
51
 
52
+ test_metadata = Marshal.load(Marshal.dump(@test_metadata))
53
+
54
+ if test_metadata
55
+ test_metadata.test_repeat = @current_test_repeat
56
+ end
57
+
52
58
  if @current_test_repeat == @test_repeats
53
59
  @current_test_repeat = 1
54
60
  else
55
61
  @current_test_repeat += 1
56
62
  end
57
63
 
58
- @test_metadata
64
+ test_metadata
59
65
  end
60
66
  private :get_test_metadata
61
67
 
@@ -68,9 +68,8 @@ module Moto
68
68
  # Default options
69
69
  options = {}
70
70
  options[:listeners] = []
71
- options[:run_name] = nil
72
- options[:suite_name] = nil
73
- options[:assignee] = nil
71
+ options[:mwui_path] = nil
72
+ options[:mwui_assignee_id] = nil
74
73
  options[:stop_on] = {error: false, fail: false, skip: false}
75
74
 
76
75
  # Parse arguments
@@ -81,9 +80,8 @@ module Moto
81
80
  opts.on('-g', '--tags Tags', Array) {|v| options[:tags] = v}
82
81
  opts.on('-f', '--filters Filters', Array) {|v| options[:filters] = v}
83
82
  opts.on('-l', '--listeners Listeners', Array) {|v| options[:listeners] = v}
84
- opts.on('-r', '--runname RunName') {|v| options[:run_name] = v}
85
- opts.on('-s', '--suitename SuiteName') {|v| options[:suite_name] = v}
86
- opts.on('-a', '--assignee Assignee') {|v| options[:assignee] = v}
83
+ opts.on('--mwui-path MwuiPath') {|v| options[:mwui_path] = v}
84
+ opts.on('--mwui-assignee-id MwuiAssignee') {|v| options[:mwui_assignee_id] = v}
87
85
  opts.on('-c', '--config Config') {|v| options[:config_name] = v}
88
86
  opts.on('--threads ThreadCount', Integer) {|v| options[:threads] = v}
89
87
  opts.on('--attempts AttemptCount', Integer) {|v| options[:attempts] = v}
@@ -104,10 +102,6 @@ module Moto
104
102
  end
105
103
  end
106
104
 
107
- if options[:run_name].nil?
108
- options[:run_name] = evaluate_name(options[:tests], options[:tags], options[:filters])
109
- end
110
-
111
105
  # Runner configuration
112
106
 
113
107
  Moto::Lib::Config.moto[:test_runner][:thread_count] = options[:threads] if options[:threads]
@@ -139,24 +133,20 @@ module Moto
139
133
  # Default options
140
134
  options = {}
141
135
  options[:listeners] = []
142
- options[:run_name] = nil
143
- options[:suite_name] = nil
144
- options[:assignee] = nil
145
136
 
146
137
  # Parse arguments
147
138
  OptionParser.new do |opts|
148
- opts.on('-c', '--config Config') {|v| options[:config_name] = v}
149
- opts.on('-t', '--tests Tests', Array) {|v| options[:tests] = v}
150
- opts.on('-g', '--tags Tags', Array) {|v| options[:tags] = v}
151
- opts.on('-f', '--filters Filters', Array) {|v| options[:filters] = v}
152
- opts.on('-l', '--listeners Listeners', Array) {|v| options[:listeners] = v}
153
- opts.on('-r', '--runname RunName') {|v| options[:run_name] = v}
154
- opts.on('-s', '--suitename SuiteName') {|v| options[:suite_name] = v}
155
- opts.on('-a', '--assignee Assignee') {|v| options[:assignee] = v}
156
- opts.on('-p', '--tagregexpos RegexPositive') {|v| options[:validator_regex_positive] = v}
157
- opts.on('-n', '--tagregexneg RegexNegative') {|v| options[:validator_regex_negative] = v}
158
- opts.on('-h', '--hastags') {|v| options[:validate_has_tags] = v}
159
- opts.on('-d', '--hasdescription') {|v| options[:validate_has_description] = v}
139
+ opts.on('-c', '--config Config') {|v| options[:config_name] = v}
140
+ opts.on('-t', '--tests Tests', Array) {|v| options[:tests] = v}
141
+ opts.on('-g', '--tags Tags', Array) {|v| options[:tags] = v}
142
+ opts.on('-f', '--filters Filters', Array) {|v| options[:filters] = v}
143
+ opts.on('-l', '--listeners Listeners', Array) {|v| options[:listeners] = v}
144
+ opts.on('--mwui-path MwuiPath') {|v| options[:mwui_path] = v}
145
+ opts.on('--mwui-assignee-id MwuiAssignee') {|v| options[:mwui_assignee_id] = v}
146
+ opts.on('-p', '--tagregexpos RegexPositive') {|v| options[:validator_regex_positive] = v}
147
+ opts.on('-n', '--tagregexneg RegexNegative') {|v| options[:validator_regex_negative] = v}
148
+ opts.on('-h', '--hastags') {|v| options[:validate_has_tags] = v}
149
+ opts.on('-d', '--hasdescription') {|v| options[:validate_has_description] = v}
160
150
  opts.on('-w', '--tagwhitelist TagWhitelist', Array) {|v| options[:tag_whitelist] = v}
161
151
  end.parse!
162
152
 
@@ -168,32 +158,9 @@ module Moto
168
158
  end
169
159
  end
170
160
 
171
- if options[:run_name].nil?
172
- options[:run_name] = evaluate_name(options[:tests], options[:tags], options[:filters])
173
- end
174
-
175
161
  return options
176
162
  end
177
163
 
178
- # Generate default name based on input parameters
179
- def self.evaluate_name(tests, tags, filters)
180
- name = ''
181
-
182
- if tests
183
- name << "Tests: #{tests.join(',')} "
184
- end
185
-
186
- if tags
187
- name << "Tags: #{tags.join(',')} "
188
- end
189
-
190
- if filters
191
- name << "Filters: #{filters.join(',')} "
192
- end
193
-
194
- return name
195
- end
196
-
197
164
  # Parses attributes passed to the application when run by 'moto generate'
198
165
  def self.generate_parse(argv)
199
166
  options = {}
@@ -13,7 +13,6 @@ module Moto
13
13
  errors: run_status.tests_error.length,
14
14
  failures: run_status.tests_failed.length,
15
15
  skipped: run_status.tests_skipped.length,
16
- name: run_params[:run_name],
17
16
  tests: run_status.tests_all.length,
18
17
  time: run_status.duration,
19
18
  timestamp: Time.at(run_status.time_start)
@@ -9,92 +9,36 @@ module Moto
9
9
 
10
10
  REST_MAX_TRIES = 1
11
11
  REST_TIMEOUT = 15
12
+ REST_RESULTS_AT_ONCE = 500
12
13
 
13
14
  def initialize(run_params)
14
15
  super
15
16
 
16
- if run_params[:suite_name].nil?
17
- raise 'ERROR: Please specify suite name (-s SUITE_NAME) when using MotoWebUI as one of the listeners.'
17
+ if run_params[:mwui_path].nil?
18
+ raise 'ERROR: Please specify directory path (--mwui-path /EXAMPLE/PATH) when using MotoWebUI as one of the listeners.'
19
+ else
20
+ @mwui_path = run_params[:mwui_path]
18
21
  end
19
22
 
20
- if run_params[:assignee]
21
- @assignee = run_params[:assignee]
23
+ if run_params[:mwui_assignee_id]
24
+ @assignee = run_params[:mwui_assignee_id]
22
25
  else
23
26
  @assignee = config[:default_assignee]
24
27
  end
25
28
 
26
29
  @tests = {}
27
- @url = "#{config[:url]}/api"
30
+ @url = URI.escape("#{config[:url]}/api/motoresults")
28
31
  @send_log_on_pass = config[:send_log_on_pass]
29
32
  end
30
33
 
31
34
  def start_run
32
-
33
- # Create Suite, if it did exist already nothing new will be created and existing data will be sent in the response
34
- url_suites = "#{@url}/suites"
35
- suite_data = {name: run_params[:suite_name]}.to_json
36
-
37
- response = try {
38
- RestClient::Request.execute(method: :post,
39
- url: URI.escape(url_suites),
40
- payload: suite_data,
41
- timeout: REST_TIMEOUT,
42
- headers: {content_type: :json, accept: :json})
43
- }
44
- suite = JSON.parse(response, symbolize_names: true)
45
-
46
- # Store ID of current Suite
47
- @suite_id = suite[:id]
48
-
49
- # Prepare data for new TestRun
50
- url_runs = "#{@url}/suites/#{@suite_id}/runs"
51
- run_data = {
52
- name: run_params[:run_name],
53
- start_time: Time.now
54
- }
55
-
56
- if @assignee
57
- run_data[:tester_id] = @assignee
58
- end
59
-
60
- run_data = run_data.to_json
61
-
62
- # Create new TestRun based on prepared data
63
- response = try {
64
- RestClient::Request.execute(method: :post,
65
- url: URI.escape(url_runs),
66
- payload: run_data,
67
- timeout: REST_TIMEOUT,
68
- headers: {content_type: :json, accept: :json})
69
- }
70
-
71
- @run = JSON.parse(response, symbolize_names: true)
72
- end
73
-
74
-
75
- def end_run(run_status)
76
-
77
- url_run = "#{@url}/suites/#{@suite_id}/runs/#{@run[:id]}"
78
- run_data = {
79
- duration: (Time.now.to_f - run_status.time_start).to_i
80
- }.to_json
81
-
82
- response = try {
83
- RestClient::Request.execute(method: :put,
84
- url: URI.escape(url_run),
85
- payload: run_data,
86
- timeout: REST_TIMEOUT,
87
- headers: {content_type: :json, accept: :json})
88
- }
89
- @run = JSON.parse(response, symbolize_names: true)
90
35
  end
91
36
 
92
37
  def start_test(test_status, test_metadata)
93
38
 
94
39
  # Prepare data for new Test
95
- url_tests = "#{@url}/suites/#{@suite_id}/runs/#{@run[:id]}/tests"
96
40
  test_data = {
97
- name: test_status.display_name, #test_status.test_class_name
41
+ name: test_status.display_name,
98
42
  start_time: Time.now
99
43
  }
100
44
 
@@ -110,62 +54,65 @@ module Moto
110
54
  test_data[:description] = test_metadata.description
111
55
  end
112
56
 
113
- test_data = test_data.to_json
114
-
115
- # Create new Test based on prepared data
116
- response = try {
117
- RestClient::Request.execute(method: :post,
118
- url: URI.escape(url_tests),
119
- payload: test_data,
120
- timeout: REST_TIMEOUT,
121
- headers: {content_type: :json, accept: :json})
122
- }
123
-
124
- test = JSON.parse(response, symbolize_names: true)
125
-
126
- # Store Test in a hash with its name as key so later it can be accessed and server side ID can be retrieved
127
- @tests[test[:name]] = test
57
+ # Store Test in a hash with its name as key so later it can be accessed
58
+ @tests[test_data[:name]] = test_data
128
59
  end
129
60
 
130
61
 
131
62
  def end_test(test_status)
132
-
133
- url_test = "#{@url}/suites/#{@suite_id}/runs/#{@run[:id]}/tests/#{@tests[test_status.display_name][:id]}"
134
63
  test_data = {
135
64
  duration: (Time.now.to_f - test_status.time_start).to_i,
136
65
  error_message: test_status.results.last.code == Moto::Test::Result::ERROR ? test_status.results.last.message : nil,
137
66
  fail_message: test_failures(test_status),
138
67
  result_id: webui_result_id(test_status.results.last.code)
139
- }.to_json
140
-
141
- # Create new Test based on prepared data
142
- response = try {
143
- RestClient::Request.execute(method: :put,
144
- url: URI.escape(url_test),
145
- payload: test_data,
146
- timeout: REST_TIMEOUT,
147
- headers: {content_type: :json, accept: :json})
148
68
  }
149
69
 
150
- test = JSON.parse(response, symbolize_names: true)
151
-
152
- @tests[test_status.name] = test
70
+ @tests[test_status.display_name].merge!(test_data)
153
71
 
154
72
  # Add Log to already existing Test
155
- if (test_status.results.last.code == Moto::Test::Result::PASSED && @send_log_on_pass) || test_status.results.last.code != Moto::Test::Result::PASSED
73
+ # if (test_status.results.last.code == Moto::Test::Result::PASSED && @send_log_on_pass) || test_status.results.last.code != Moto::Test::Result::PASSED
74
+ #
75
+ # url_log = "#{url_test}/logs"
76
+ # log_data = { text: File.read(test_status.log_path) }.to_json
77
+ #
78
+ # response = try {
79
+ # RestClient::Request.execute(method: :post,
80
+ # url: URI.escape(url_log),
81
+ # payload: log_data,
82
+ # timeout: REST_TIMEOUT,
83
+ # headers: {content_type: :json, accept: :json})
84
+ # }
85
+ # response
86
+ # end
87
+
88
+ end
156
89
 
157
- url_log = "#{url_test}/logs"
158
- log_data = { text: File.read(test_status.log_path) }.to_json
90
+
91
+ def end_run(run_status)
92
+ # Ultimately converts Hash to Array, which is going to be way more useful at this point
93
+ # Assignment is done to the same variable, instead of new one, in order to conserve memory since effectively
94
+ # we're just duplicating the same data
95
+ @tests = @tests.values
96
+
97
+ while !@tests.empty?
98
+ partial_run_data = {
99
+ path: @mwui_path,
100
+ tester_id: @assignee,
101
+ tests: @tests.shift(REST_RESULTS_AT_ONCE)
102
+ }.to_json
159
103
 
160
104
  response = try {
161
105
  RestClient::Request.execute(method: :post,
162
- url: URI.escape(url_log),
163
- payload: log_data,
106
+ url: @url,
107
+ payload: partial_run_data,
164
108
  timeout: REST_TIMEOUT,
165
109
  headers: {content_type: :json, accept: :json})
166
110
  }
111
+
112
+ response = JSON.parse(response, symbolize_names: true)
167
113
  response
168
114
  end
115
+
169
116
  end
170
117
 
171
118
  # @return [String] string with messages of all failures in a test
@@ -10,10 +10,6 @@ module Moto
10
10
 
11
11
  # @param [Array] listeners An array of strings, which represent qualified names of classes (listeners) that will be instantiated.
12
12
  # empty array is passed then :default_listeners will be taken from config
13
- # @param[Hash] run_params Variables specified by the user when parametrizing current moto run
14
- # suite_name: String Name of the test suite
15
- # run_name: String Name of the test run, may be custom made or automatically generated
16
- # assignee: ID of person responsible for test run
17
13
  def initialize(listeners, run_params)
18
14
 
19
15
  if listeners.empty?
@@ -65,7 +61,7 @@ module Moto
65
61
  end
66
62
  end
67
63
 
68
- # Reports star of a test to all attached listeners
64
+ # Reports start of a test to all attached listeners
69
65
  # @param [Moto::Test::Status] test_status of test which's start is to be reported on
70
66
  # @param [Moto::Test::Metadata] test_metadata of test which's start is to be reported on
71
67
  def report_start_test(test_status, test_metadata)
data/lib/test/base.rb CHANGED
@@ -40,6 +40,7 @@ module Moto
40
40
  @status.test_class_name = self.class.name
41
41
  @status.display_name = @status.test_class_name.split('::')[2..-2].join(' > ')
42
42
  @status.display_name += "_#{@params_path.split('/')[-1].chomp('.param')}" if @params_path
43
+ @status.display_name += "(#{metadata.test_repeat})" if metadata.test_repeat > 1
43
44
  end
44
45
 
45
46
  # Setter for :log_path
data/lib/test/metadata.rb CHANGED
@@ -6,6 +6,9 @@ module Moto
6
6
  # Absolute test path
7
7
  attr_reader :test_path
8
8
 
9
+ # Indicates which repetition of the same test is represented by this metadata
10
+ attr_accessor :test_repeat
11
+
9
12
  # @param [String] test_path Absolute path to file with test
10
13
  def initialize(test_path)
11
14
  @test_path = test_path
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Moto
2
- VERSION = '1.0.7'
2
+ VERSION = '1.0.8'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moto
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bartek Wilczek
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2018-01-29 00:00:00.000000000 Z
14
+ date: 2018-01-31 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activesupport