itriagetestrail 0.8.2 → 0.8.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b876df769a0fbd9b03c3494089ae057fc9aadb0e
4
- data.tar.gz: e2992943a385c0af1d7b29b4671851a0bedb95ff
3
+ metadata.gz: cf91591aef40e30e0e07cbdd4d67d92672052a48
4
+ data.tar.gz: 9b06e2ad6ff898a76e7698aaa5534e71d859e56d
5
5
  SHA512:
6
- metadata.gz: b40a75bbb24dfb40749f8bbea91ac14f580d92dd654c3287d0c6425ae105d70de9716173c95aeafd387e74b835c8708e62b63d3cd8288e6f0324234b6d1c8ef2
7
- data.tar.gz: 211d987bce947b84199297e341dc87ce8fe99b5051f247c187a48c74413634206265d9a7fcc4e7314962c7c7b64ab039195a51f07e59582a08af0eff26ea2541
6
+ metadata.gz: 8066804b33b5bdb0f06e7aebcf8eb2c8341084b5202eda9ce0e064de6d229932defac95b4a960158681dfb12663b435f7e8f6a6f0c6761099abe427bdaf8a5a7
7
+ data.tar.gz: 73f687aa9bd611fc4c82f9b87c58ce7a9fe30530e5ccd39898a9a386098e53fe9033894bb9b4b57474c225e8db472d5122dd81b54a994fb339a9d20332dfaa25
@@ -2,14 +2,424 @@ require_relative 'itriagetestrail/version'
2
2
  require_relative 'itriagetestrail/testrail_binding'
3
3
 
4
4
  require_relative 'itriagetestrail/pool'
5
- require_relative 'itriagetestrail/helpers'
6
5
 
7
6
  require 'tzinfo'
8
7
 
9
8
  module Itriagetestrail
9
+ module Projects
10
+ # populate projects instance variable with all projects objects in the testrail site
11
+ def projects
12
+ @projects ||= @client.send_get("get_projects")
13
+ end
14
+
15
+ def project_by_name(name)
16
+ res = -1
17
+ projects.each do |project|
18
+ res = project if project['name'] == name
19
+ end
20
+ res
21
+ end
22
+
23
+ # return the project object for a given project id
24
+ def project_by_id(id)
25
+ res = -1
26
+ projects.each do |project|
27
+ res = project if project['id'] == id.to_i
28
+ end
29
+ res
30
+ end
31
+
32
+ # set the project_id by a requested project from config/environment variable
33
+ def set_project
34
+ requested_id = @testrail_config[:projectId]
35
+ case requested_id
36
+ when nil, ''
37
+ # a project id was not provided, fetch it from TestRail by project name
38
+ res = project_by_name(@testrail_config[:projectName])
39
+ if res == -1
40
+ @execute = false
41
+ return
42
+ end
43
+ @project_id = res['id']
44
+ @suite_mode = res['suite_mode']
45
+ else
46
+ # use the requested project id
47
+ @project_id = requested_id
48
+ @suite_mode = project_by_id(@project_id)['suite_mode']
49
+ end
50
+ end
51
+ end
52
+
53
+ module Suites
54
+ # TestRail Suites
55
+ def testrail_suites
56
+ case @suite_mode
57
+ when 2,3
58
+ @suites = @client.send_get("get_suites/#{@project_id}")
59
+ end
60
+ end
61
+
62
+ def testrail_suite_id(suite_name)
63
+ res = -1
64
+ @suites.each do |suite|
65
+ res = suite['id'] if suite['name'] == suite_name
66
+ end
67
+ res
68
+ end
69
+
70
+ def add_testrail_suite(suite_name)
71
+ body = { name: suite_name }
72
+ res = @client.send_post("add_suite/#{@project_id}", body)
73
+ testrail_suite = res['id']
74
+
75
+ #re-establish suites
76
+ testrail_suites
77
+
78
+ testrail_suite
79
+ end
80
+ end
81
+
82
+ module Milestones
83
+
84
+ # Establish the milestone name based on origin passed in,
85
+ # usually origin represents a branch or environment
86
+ def normalize_milestone
87
+ case @testrail_config[:origin]
88
+ when 'prd', 'production', 'origin/production'
89
+ 'Production'
90
+ when 'stg', 'staging', 'origin/staging'
91
+ 'Staging'
92
+ when 'dev', 'development', 'origin/development'
93
+ 'Development'
94
+ when 'local', ''
95
+ 'Local'
96
+ when 'master', 'origin/master'
97
+ if @testrail_config[:masterMilestone].nil? || @testrail_config[:masterMilestone].empty?
98
+ 'Master'
99
+ else
100
+ @testrail_config[:masterMilestone]
101
+ end
102
+ else
103
+ 'Dev Branch'
104
+ end
105
+ end
106
+
107
+ # returns timestamp for begining of first day of current quarter
108
+ def milestone_period_start
109
+ time_zone = TZInfo::Timezone.get('America/Denver')
110
+ current_year = time_zone.now.year
111
+ month = time_zone.now.mon
112
+
113
+ # determine which quarter we are in
114
+ if month <= 3
115
+ time_zone.utc_to_local(Time.utc(current_year, 1, 1))
116
+ elsif month <= 6
117
+ time_zone.utc_to_local(Time.utc(current_year, 4, 1))
118
+ elsif month <= 9
119
+ time_zone.utc_to_local(Time.utc(current_year, 7, 1))
120
+ else
121
+ time_zone.utc_to_local(Time.utc(current_year, 10, 1))
122
+ end
123
+ end
124
+
125
+ # determine the due date (end of quarter) for a new milestone being added
126
+ def milestone_due_date
127
+ time_zone = TZInfo::Timezone.get('America/Denver')
128
+ current_year = time_zone.now.year
129
+ month = time_zone.now.mon
130
+
131
+ # determine which quarter we are in
132
+ if month <= 3
133
+ Time.utc(current_year, 3, 31).strftime('%s')
134
+ elsif month <= 6
135
+ Time.utc(current_year, 6, 30).strftime('%s')
136
+ elsif month <= 9
137
+ Time.utc(current_year, 9, 30).strftime('%s')
138
+ else
139
+ Time.new(current_year, 12, 31).strftime('%s')
140
+ end
141
+ end
142
+
143
+ # returns the id for a requested milestone by name, or creates one if the milestone does not exist
144
+ def fetch_milestone(requested_milestone_name)
145
+ milestones = @client.send_get("get_milestones/#{@project_id}")
146
+ res = -1
147
+ milestones.each do |milestone|
148
+ res = milestone['id'] if milestone['name'] == requested_milestone_name
149
+ end
150
+
151
+ if res == -1
152
+ # We need to add the milestone to TestRail
153
+
154
+ body = {
155
+ name: requested_milestone_name,
156
+ due_on: milestone_due_date
157
+ }
158
+
159
+ res = @client.send_post("add_milestone/#{@project_id}", body)['id']
160
+ end
161
+ res
162
+ end
163
+
164
+ # return a standardized name for a milestone to be archived
165
+ def milestone_archive_name(milestone_name, date)
166
+ year = date.year
167
+ month = date.mon
168
+
169
+ if month <= 3
170
+ "#{milestone_name} #{year}-Q1"
171
+ elsif month <= 6
172
+ "#{milestone_name} #{year}-Q2"
173
+ elsif month <= 9
174
+ "#{milestone_name} #{year}-Q3"
175
+ else
176
+ "#{milestone_name} #{year}-Q4"
177
+ end
178
+ end
179
+
180
+ # return all the runs associated with an existing milestone
181
+ def milestone_runs(milestone_name)
182
+ # use the matching milestone id for project
183
+ milestone_id = fetch_milestone(milestone_name)
184
+
185
+ # fetch all test runs associated with the milestone id for project
186
+ @client.send_get("get_runs/#{@project_id}&milestone_id=#{milestone_id}&is_completed=1") || []
187
+ end
188
+
189
+ # testrail call to rename a milestone (for archiving)
190
+ def rename_milestone(id, new_name)
191
+ # todo: rename milestone with previous_milestone
192
+ body = { name: new_name }
193
+ res = @client.send_post("update_milestone/#{id}", body)['id']
194
+ end
195
+
196
+ # this archives a milestone at the turn of a quarter and creates a new one in its place
197
+ def reset_milestone(milestone_name)
198
+ runs = milestone_runs(milestone_name)
199
+ if runs.size > 0
200
+ last_run_time = Time.at(runs.last['completed_on'])
201
+ if last_run_time < milestone_period_start
202
+ rename_milestone(@milestone_id, milestone_archive_name(milestone_name, last_run_time))
203
+ @milestone_id = fetch_milestone(@milestone_name)
204
+ end
205
+ end
206
+ end
207
+ end
208
+
209
+ module Sections
210
+ # TestRail Sections
211
+ def testrail_sections
212
+ case @suite_mode
213
+ when 2,3
214
+ @suite_id = testrail_suite_id(@suite_name)
215
+ @sections = @client.send_get("get_sections/#{@project_id}&suite_id=#{@suite_id}")
216
+ else
217
+ @sections = @client.send_get("get_sections/#{@project_id}")
218
+ end
219
+ end
220
+
221
+ def testrail_section_id(section_title)
222
+ res = -1
223
+ @sections.each do |section|
224
+ res = section['id'] if section['name'] == section_title
225
+ end
226
+ res
227
+ end
228
+
229
+ def add_testrail_section(section_title)
230
+ if @suite_name
231
+ body = {
232
+ name: section_title,
233
+ suite_id: testrail_suite_id(@suite_name)
234
+ }
235
+ else
236
+ body = {
237
+ name: section_title
238
+ }
239
+ end
240
+
241
+ res = @client.send_post("add_section/#{@project_id}", body)
242
+
243
+ testrail_section = res['id']
244
+
245
+ # re-establish sections
246
+ testrail_sections
247
+
248
+ testrail_section
249
+ end
250
+ end
251
+
252
+ module TestCases
253
+ # TestRail Cases
254
+ def testrail_ids
255
+ case @suite_mode
256
+ when 2,3
257
+ @test_cases = @client.send_get("get_cases/#{@project_id}&suite_id=#{@suite_id}&type_id=3")
258
+ else
259
+ @test_cases = @client.send_get("get_cases/#{@project_id}&type_id=3")
260
+ end
261
+
262
+ @test_case_ids = []
263
+
264
+ @test_cases.each { |test_case| @test_case_ids << test_case['id'] }
265
+ end
266
+
267
+ def testrail_test_case_id(external_id)
268
+ res = -1
269
+ @test_cases.each do |test_case|
270
+ if test_case['custom_external_case_id'] == external_id
271
+ res = test_case['id']
272
+ end
273
+ end
274
+ res
275
+ end
276
+
277
+ def associate_result(external_id)
278
+ test_case_id = testrail_test_case_id(external_id)
279
+ # store the test case id with the local result
280
+ @results[:results].each do |result|
281
+ next unless result[:external_id] == external_id
282
+ @external_results[:results] << { case_id: test_case_id,
283
+ status_id: result['status_id'],
284
+ comment: result['comment'] }
285
+ end
286
+ end
287
+
288
+ # add the test case if it doesn't exist
289
+ def add_testrail_test_case(scenario_title, external_id, scenario_steps, section_id)
290
+ body = {
291
+ title: scenario_title,
292
+ custom_external_case_id: external_id,
293
+ custom_steps: scenario_steps,
294
+ type_id: 3
295
+ }
296
+
297
+ @client.send_post("add_case/#{section_id}", body)
298
+
299
+ # refresh test case ids
300
+ testrail_ids
301
+ end
302
+
303
+ def test_name
304
+ label = ''
305
+ label += "App Version:#{@app_version}" unless @app_version.nil? || @app_version == ''
306
+ label += " Jenkins Build:#{@jenkins_build}" unless @jenkins_build .nil? || @jenkins_build == ''
307
+ label.strip!
308
+ label = 'Regression' if label == ''
309
+ label + ' (' + @time_zone.now.strftime('%-I:%M %p') + ')'
310
+ end
311
+ end
312
+
313
+ module TestRuns
314
+ def extend_testrail_run
315
+ # Reset test scope to include all cases
316
+ body = { include_all: true }
317
+ @client.send_post("update_run/#{@run_id}", body)
318
+ end
319
+
320
+ def existing_cases_from_description
321
+ # Grabs from testrail run description
322
+ run = @client.send_get("get_run/#{@run_id}")
323
+ @description = run["description"]
324
+ @description.nil? ? [] : @description.split(",")
325
+ end
326
+
327
+ def existing_cases_from_run
328
+
329
+ tests = @client.send_get("get_tests/#{@run_id}&status_id=1,2,4,5") || []
330
+
331
+ cases = []
332
+
333
+ tests.each do |test|
334
+
335
+ cases << test["case_id"]
336
+
337
+ end
338
+ cases
339
+ end
340
+
341
+ # open a test run to submit test results
342
+ def add_testrail_run
343
+ body = {
344
+ name: test_name,
345
+ description: '',
346
+ include_all: true,
347
+ milestone_id: @milestone_id
348
+ }
349
+
350
+ unless @testrail_config[:include_all] || true
351
+ body[:include_all] = false
352
+ body[:case_ids] = @test_case_ids
353
+ end
354
+
355
+ case @suite_mode
356
+ when 2,3
357
+ body[:suite_id] = @suite_id
358
+ end
359
+ res = @client.send_post("add_run/#{@project_id}", body)
360
+ @run_id = res['id']
361
+ end
362
+ end
363
+
364
+ module TestResults
365
+ def send_results_to_testrail
366
+ return unless @results[:results].size != 0
367
+ # copy what is in the results
368
+ @submitted[:results] << @results[:results]
369
+
370
+ begin
371
+ send = { results: @results[:results] }
372
+ res = @client.send_post("add_results_for_cases/#{@run_id}", send)
373
+ clear_results
374
+ rescue StandardError => e
375
+ raise e
376
+ end
377
+ end
378
+
379
+ def update_test_suite(scenario_title, external_id, scenario_steps)
380
+ feature = external_id.split(';')[0].split('#')[0]
381
+
382
+ # if the testrail case does not exist, update cases
383
+ if testrail_test_case_id(external_id) == -1
384
+
385
+ section_id = testrail_section_id(feature)
386
+
387
+ # if the testrail section does not exist, update sections
388
+ section_id = add_testrail_section(feature) if section_id == -1
389
+
390
+ add_testrail_test_case(scenario_title, external_id, scenario_steps, section_id)
391
+ sleep 1
392
+ end
393
+ # store the case id associated with the external_id
394
+ associate_result(external_id)
395
+ end
396
+
397
+ def store_result(scenario_title, external_id, scenario_steps, status_id, comment)
398
+ update_test_suite scenario_title, external_id, scenario_steps
399
+
400
+ case_id = testrail_test_case_id(external_id)
401
+ @results[:results] << {
402
+ case_id: case_id,
403
+ scenario_title: scenario_title,
404
+ external_id: external_id,
405
+ scenario_steps: scenario_steps,
406
+ status_id: status_id,
407
+ comment: comment,
408
+ custom_branch_name: @testrail_config[:origin]
409
+ }
410
+ end
411
+ end
10
412
 
11
413
  class TestRailInterface
12
414
 
415
+ include Projects
416
+ include Suites
417
+ include Milestones
418
+ include Sections
419
+ include TestCases
420
+ include TestRuns
421
+ include TestResults
422
+
13
423
  attr_accessor :client
14
424
  attr_accessor :sections
15
425
  attr_accessor :test_cases
@@ -1,3 +1,3 @@
1
1
  module Itriagetestrail
2
- VERSION = '0.8.2'
2
+ VERSION = '0.8.3'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itriagetestrail
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - a801069
@@ -59,7 +59,6 @@ extensions: []
59
59
  extra_rdoc_files: []
60
60
  files:
61
61
  - lib/itriagetestrail.rb
62
- - lib/itriagetestrail/helpers.rb
63
62
  - lib/itriagetestrail/pool.rb
64
63
  - lib/itriagetestrail/testrail_binding.rb
65
64
  - lib/itriagetestrail/trcucumber13.rb
@@ -1,405 +0,0 @@
1
- module Itriagetestrail
2
- module Projects
3
- # populate projects instance variable with all projects objects in the testrail site
4
- def projects
5
- @projects ||= @client.send_get("get_projects")
6
- end
7
-
8
- def project_by_name(name)
9
- res = -1
10
- projects.each do |project|
11
- res = project if project['name'] == name
12
- end
13
- res
14
- end
15
-
16
- # return the project object for a given project id
17
- def project_by_id(id)
18
- res = -1
19
- projects.each do |project|
20
- res = project if project['id'] == id.to_i
21
- end
22
- res
23
- end
24
-
25
- # set the project_id by a requested project from config/environment variable
26
- def set_project
27
- requested_id = @testrail_config[:projectId]
28
- case requested_id
29
- when nil, ''
30
- # a project id was not provided, fetch it from TestRail by project name
31
- res = project_by_name(@testrail_config[:projectName])
32
- if res == -1
33
- @execute = false
34
- return
35
- end
36
- @project_id = res['id']
37
- @suite_mode = res['suite_mode']
38
- else
39
- # use the requested project id
40
- @project_id = requested_id
41
- @suite_mode = project_by_id(@project_id)['suite_mode']
42
- end
43
- end
44
- end
45
-
46
- module Suites
47
- # TestRail Suites
48
- def testrail_suites
49
- case @suite_mode
50
- when 2,3
51
- @suites = @client.send_get("get_suites/#{@project_id}")
52
- end
53
- end
54
-
55
- def testrail_suite_id(suite_name)
56
- res = -1
57
- @suites.each do |suite|
58
- res = suite['id'] if suite['name'] == suite_name
59
- end
60
- res
61
- end
62
-
63
- def add_testrail_suite(suite_name)
64
- body = { name: suite_name }
65
- res = @client.send_post("add_suite/#{@project_id}", body)
66
- testrail_suite = res['id']
67
-
68
- #re-establish suites
69
- testrail_suites
70
-
71
- testrail_suite
72
- end
73
- end
74
-
75
- module Milestones
76
-
77
- # Establish the milestone name based on origin passed in,
78
- # usually origin represents a branch or environment
79
- def normalize_milestone
80
- case @testrail_config[:origin]
81
- when 'prd', 'production', 'origin/production'
82
- 'Production'
83
- when 'stg', 'staging', 'origin/staging'
84
- 'Staging'
85
- when 'dev', 'development', 'origin/development'
86
- 'Development'
87
- when 'local', ''
88
- 'Local'
89
- when 'master', 'origin/master'
90
- if @testrail_config[:masterMilestone].nil? || @testrail_config[:masterMilestone].empty?
91
- 'Master'
92
- else
93
- @testrail_config[:masterMilestone]
94
- end
95
- else
96
- 'Dev Branch'
97
- end
98
- end
99
-
100
- # returns timestamp for begining of first day of current quarter
101
- def milestone_period_start
102
- time_zone = TZInfo::Timezone.get('America/Denver')
103
- current_year = time_zone.now.year
104
- month = time_zone.now.mon
105
-
106
- # determine which quarter we are in
107
- if month <= 3
108
- time_zone.utc_to_local(Time.utc(current_year, 1, 1))
109
- elsif month <= 6
110
- time_zone.utc_to_local(Time.utc(current_year, 4, 1))
111
- elsif month <= 9
112
- time_zone.utc_to_local(Time.utc(current_year, 7, 1))
113
- else
114
- time_zone.utc_to_local(Time.utc(current_year, 10, 1))
115
- end
116
- end
117
-
118
- # determine the due date (end of quarter) for a new milestone being added
119
- def milestone_due_date
120
- time_zone = TZInfo::Timezone.get('America/Denver')
121
- current_year = time_zone.now.year
122
- month = time_zone.now.mon
123
-
124
- # determine which quarter we are in
125
- if month <= 3
126
- Time.utc(current_year, 3, 31).strftime('%s')
127
- elsif month <= 6
128
- Time.utc(current_year, 6, 30).strftime('%s')
129
- elsif month <= 9
130
- Time.utc(current_year, 9, 30).strftime('%s')
131
- else
132
- Time.new(current_year, 12, 31).strftime('%s')
133
- end
134
- end
135
-
136
- # returns the id for a requested milestone by name, or creates one if the milestone does not exist
137
- def fetch_milestone(requested_milestone_name)
138
- milestones = @client.send_get("get_milestones/#{@project_id}")
139
- res = -1
140
- milestones.each do |milestone|
141
- res = milestone['id'] if milestone['name'] == requested_milestone_name
142
- end
143
-
144
- if res == -1
145
- # We need to add the milestone to TestRail
146
-
147
- body = {
148
- name: requested_milestone_name,
149
- due_on: milestone_due_date
150
- }
151
-
152
- res = @client.send_post("add_milestone/#{@project_id}", body)['id']
153
- end
154
- res
155
- end
156
-
157
- # return a standardized name for a milestone to be archived
158
- def milestone_archive_name(milestone_name, date)
159
- year = date.year
160
- month = date.mon
161
-
162
- if month <= 3
163
- "#{milestone_name} #{year}-Q1"
164
- elsif month <= 6
165
- "#{milestone_name} #{year}-Q2"
166
- elsif month <= 9
167
- "#{milestone_name} #{year}-Q3"
168
- else
169
- "#{milestone_name} #{year}-Q4"
170
- end
171
- end
172
-
173
- # return all the runs associated with an existing milestone
174
- def milestone_runs(milestone_name)
175
- # use the matching milestone id for project
176
- milestone_id = fetch_milestone(milestone_name)
177
-
178
- # fetch all test runs associated with the milestone id for project
179
- @client.send_get("get_runs/#{@project_id}&milestone_id=#{milestone_id}&is_completed=1") || []
180
- end
181
-
182
- # testrail call to rename a milestone (for archiving)
183
- def rename_milestone(id, new_name)
184
- # todo: rename milestone with previous_milestone
185
- body = { name: new_name }
186
- res = @client.send_post("update_milestone/#{id}", body)['id']
187
- end
188
-
189
- # this archives a milestone at the turn of a quarter and creates a new one in its place
190
- def reset_milestone(milestone_name)
191
- runs = milestone_runs(milestone_name)
192
- if runs.size > 0
193
- last_run_time = Time.at(runs.last['completed_on'])
194
- if last_run_time < milestone_period_start
195
- rename_milestone(@milestone_id, milestone_archive_name(milestone_name, last_run_time))
196
- @milestone_id = fetch_milestone(@milestone_name)
197
- end
198
- end
199
- end
200
- end
201
-
202
- module Sections
203
- # TestRail Sections
204
- def testrail_sections
205
- case @suite_mode
206
- when 2,3
207
- @suite_id = testrail_suite_id(@suite_name)
208
- @sections = @client.send_get("get_sections/#{@project_id}&suite_id=#{@suite_id}")
209
- else
210
- @sections = @client.send_get("get_sections/#{@project_id}")
211
- end
212
- end
213
-
214
- def testrail_section_id(section_title)
215
- res = -1
216
- @sections.each do |section|
217
- res = section['id'] if section['name'] == section_title
218
- end
219
- res
220
- end
221
-
222
- def add_testrail_section(section_title)
223
- if @suite_name
224
- body = {
225
- name: section_title,
226
- suite_id: testrail_suite_id(@suite_name)
227
- }
228
- else
229
- body = {
230
- name: section_title
231
- }
232
- end
233
-
234
- res = @client.send_post("add_section/#{@project_id}", body)
235
-
236
- testrail_section = res['id']
237
-
238
- # re-establish sections
239
- testrail_sections
240
-
241
- testrail_section
242
- end
243
- end
244
-
245
- module TestCases
246
- # TestRail Cases
247
- def testrail_ids
248
- case @suite_mode
249
- when 2,3
250
- @test_cases = @client.send_get("get_cases/#{@project_id}&suite_id=#{@suite_id}&type_id=3")
251
- else
252
- @test_cases = @client.send_get("get_cases/#{@project_id}&type_id=3")
253
- end
254
-
255
- @test_case_ids = []
256
-
257
- @test_cases.each { |test_case| @test_case_ids << test_case['id'] }
258
- end
259
-
260
- def testrail_test_case_id(external_id)
261
- res = -1
262
- @test_cases.each do |test_case|
263
- if test_case['custom_external_case_id'] == external_id
264
- res = test_case['id']
265
- end
266
- end
267
- res
268
- end
269
-
270
- def associate_result(external_id)
271
- test_case_id = testrail_test_case_id(external_id)
272
- # store the test case id with the local result
273
- @results[:results].each do |result|
274
- next unless result[:external_id] == external_id
275
- @external_results[:results] << { case_id: test_case_id,
276
- status_id: result['status_id'],
277
- comment: result['comment'] }
278
- end
279
- end
280
-
281
- # add the test case if it doesn't exist
282
- def add_testrail_test_case(scenario_title, external_id, scenario_steps, section_id)
283
- body = {
284
- title: scenario_title,
285
- custom_external_case_id: external_id,
286
- custom_steps: scenario_steps,
287
- type_id: 3
288
- }
289
-
290
- @client.send_post("add_case/#{section_id}", body)
291
-
292
- # refresh test case ids
293
- testrail_ids
294
- end
295
-
296
- def test_name
297
- label = ''
298
- label += "App Version:#{@app_version}" unless @app_version.nil? || @app_version == ''
299
- label += " Jenkins Build:#{@jenkins_build}" unless @jenkins_build .nil? || @jenkins_build == ''
300
- label.strip!
301
- label = 'Regression' if label == ''
302
- label + ' (' + @time_zone.now.strftime('%-I:%M %p') + ')'
303
- end
304
- end
305
-
306
- module TestRuns
307
- def extend_testrail_run
308
- # Reset test scope to include all cases
309
- body = { include_all: true }
310
- @client.send_post("update_run/#{@run_id}", body)
311
- end
312
-
313
- def existing_cases_from_description
314
- # Grabs from testrail run description
315
- run = @client.send_get("get_run/#{@run_id}")
316
- @description = run["description"]
317
- @description.nil? ? [] : @description.split(",")
318
- end
319
-
320
- def existing_cases_from_run
321
-
322
- tests = @client.send_get("get_tests/#{@run_id}&status_id=1,2,4,5") || []
323
-
324
- cases = []
325
-
326
- tests.each do |test|
327
-
328
- cases << test["case_id"]
329
-
330
- end
331
- cases
332
- end
333
-
334
- # open a test run to submit test results
335
- def add_testrail_run
336
- body = {
337
- name: test_name,
338
- description: '',
339
- include_all: true,
340
- milestone_id: @milestone_id
341
- }
342
-
343
- unless @testrail_config[:include_all] || true
344
- body[:include_all] = false
345
- body[:case_ids] = @test_case_ids
346
- end
347
-
348
- case @suite_mode
349
- when 2,3
350
- body[:suite_id] = @suite_id
351
- end
352
- res = @client.send_post("add_run/#{@project_id}", body)
353
- @run_id = res['id']
354
- end
355
- end
356
-
357
- module TestResults
358
- def send_results_to_testrail
359
- return unless @results[:results].size != 0
360
- # copy what is in the results
361
- @submitted[:results] << @results[:results]
362
-
363
- begin
364
- send = { results: @results[:results] }
365
- res = @client.send_post("add_results_for_cases/#{@run_id}", send)
366
- clear_results
367
- rescue StandardError => e
368
- raise e
369
- end
370
- end
371
-
372
- def update_test_suite(scenario_title, external_id, scenario_steps)
373
- feature = external_id.split(';')[0].split('#')[0]
374
-
375
- # if the testrail case does not exist, update cases
376
- if testrail_test_case_id(external_id) == -1
377
-
378
- section_id = testrail_section_id(feature)
379
-
380
- # if the testrail section does not exist, update sections
381
- section_id = add_testrail_section(feature) if section_id == -1
382
-
383
- add_testrail_test_case(scenario_title, external_id, scenario_steps, section_id)
384
- sleep 1
385
- end
386
- # store the case id associated with the external_id
387
- associate_result(external_id)
388
- end
389
-
390
- def store_result(scenario_title, external_id, scenario_steps, status_id, comment)
391
- update_test_suite scenario_title, external_id, scenario_steps
392
-
393
- case_id = testrail_test_case_id(external_id)
394
- @results[:results] << {
395
- case_id: case_id,
396
- scenario_title: scenario_title,
397
- external_id: external_id,
398
- scenario_steps: scenario_steps,
399
- status_id: status_id,
400
- comment: comment,
401
- custom_branch_name: @testrail_config[:origin]
402
- }
403
- end
404
- end
405
- end