results_keeper_rspec 0.2.0 → 0.3.0
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/lib/results_keeper_rspec.rb +7 -76
- data/lib/results_keeper_rspec/config.rb +38 -0
- data/lib/results_keeper_rspec/messages.rb +50 -0
- data/lib/results_keeper_rspec/results_sender.rb +88 -0
- data/lib/{string.rb → results_keeper_rspec/string.rb} +0 -0
- data/lib/results_keeper_rspec/test_data_generator.rb +40 -0
- metadata +14 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3cd9a3afd8dee63e52582d6c859e2ddfc512375
|
4
|
+
data.tar.gz: 278dd795b61ae28b30233b4236881a1fa07cac00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 370ec76222086a0a668aa4eefb3fbf1e5d1ea584bd1991d50f398c9c209ea713677de912ddbc102fb75333f739dca05d62ef6bb972f2825df06aed39b6177057
|
7
|
+
data.tar.gz: 2e1cebcd4d4ed7eb1f113238e14158b5ca9dc550d5751999d0bfd6f8ef503ec37cffd00cd7311e70c21d4f17d74efe47122bd5cba97fbb19149f0ba23c83c58d
|
data/lib/results_keeper_rspec.rb
CHANGED
@@ -1,96 +1,27 @@
|
|
1
|
-
|
2
|
-
require 'json'
|
3
|
-
require 'rest_client'
|
4
|
-
require_relative 'string'
|
1
|
+
require_relative 'results_keeper_rspec/results_sender'
|
5
2
|
require 'singleton'
|
6
3
|
require 'fileutils'
|
7
4
|
|
8
5
|
class ResultsKeeperRspec
|
9
6
|
include Singleton
|
10
7
|
|
11
|
-
attr_reader :
|
12
|
-
|
13
|
-
DEFAULT_PORT = 80
|
14
|
-
DEFAULT_HOST = 'results-keeper-api.herokuapp.com'
|
8
|
+
attr_reader :results_sender
|
15
9
|
|
16
10
|
def initialize
|
17
|
-
@
|
18
|
-
@revision_project = ENV['PROJECT_NAME'] || 'Default'
|
11
|
+
@results_sender = RkRspec::ResultsSender.new
|
19
12
|
end
|
20
13
|
|
21
14
|
def send_revision
|
22
|
-
|
23
|
-
@revision = send_json(data, 'revisions')
|
15
|
+
@results_sender.send_revision
|
24
16
|
end
|
25
17
|
|
26
18
|
def send_revision_complete
|
27
|
-
|
28
|
-
send_json(data, 'revisions')
|
29
|
-
remove_screenshots
|
19
|
+
@results_sender.send_revision_complete
|
30
20
|
end
|
31
21
|
|
32
22
|
def send_test(scenario)
|
33
|
-
|
34
|
-
|
35
|
-
status = scenario.exception ? 'failed' : 'passed'
|
36
|
-
scenario_error = scenario.exception.message if scenario.exception
|
37
|
-
run_path = "rspec #{scenario.location}"
|
38
|
-
data = {
|
39
|
-
name: "#{scenario.example_group.description} - #{scenario.description}",
|
40
|
-
status: status,
|
41
|
-
feature_name: scenario.example_group.description,
|
42
|
-
run_path: run_path,
|
43
|
-
error: scenario_error,
|
44
|
-
revision_id: @revision['revision_id'],
|
45
|
-
duration: test_duration
|
46
|
-
}
|
47
|
-
@test = send_json(data, 'tests')
|
48
|
-
send_screenshot(@screenshot_path) if @screenshot_path
|
49
|
-
end
|
50
|
-
|
51
|
-
def save_screenshot(scenario)
|
52
|
-
if scenario.exception
|
53
|
-
screenshot_name = "#{Time.now.to_i}_#{rand(1000..9999)}.png"
|
54
|
-
@file_path = "tmp/screenshots/#{screenshot_name}"
|
55
|
-
Capybara.page.save_screenshot(@file_path)
|
56
|
-
@file_path
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def send_json(body, path)
|
61
|
-
@host = ENV['REPORT_SERVER_HOST'] || DEFAULT_HOST
|
62
|
-
@port = ENV['REPORT_SERVER_PORT'] || DEFAULT_PORT
|
63
|
-
|
64
|
-
body['secret_key'] = ENV['RK_SECRET_KEY']
|
65
|
-
@path = "/api/#{path}"
|
66
|
-
@body = body.to_json
|
67
|
-
|
68
|
-
request = Net::HTTP::Post.new(@path, initheader = {'Content-Type' =>'application/json'})
|
69
|
-
request.body = @body
|
70
|
-
response = Net::HTTP.new(@host, @port).start {|http| http.request(request) }
|
71
|
-
puts " RK: #{response.code} - #{response.message}".blue
|
72
|
-
result_hash = JSON.parse(response.body) rescue console_message('There seems to be a problem. Are you authorized?')
|
73
|
-
result_hash
|
74
|
-
end
|
75
|
-
|
76
|
-
def send_screenshot(screenshot_path)
|
77
|
-
if ENV['SEND_SCREENSHOTS']
|
78
|
-
params = { project: @revision['project_id'], revision: @revision['revision_id'], test: @test['id'] }
|
79
|
-
RestClient.post("http://#{@host}:#{@port}/api/tests/upload_screenshot",
|
80
|
-
:name_of_file_param => File.new(screenshot_path), :body => params)
|
81
|
-
FileUtils.rm(screenshot_path)
|
23
|
+
unless @results_sender.send_test(scenario)
|
24
|
+
@results_sender.add_test_to_tmp(scenario)
|
82
25
|
end
|
83
26
|
end
|
84
|
-
|
85
|
-
def project_name
|
86
|
-
ENV['PROJECT_NAME']
|
87
|
-
end
|
88
|
-
|
89
|
-
def console_message(text)
|
90
|
-
puts " RK: #{text}".blue
|
91
|
-
end
|
92
|
-
|
93
|
-
def remove_screenshots
|
94
|
-
FileUtils.rm_rf(Dir.glob('tmp/screenshots/*'))
|
95
|
-
end
|
96
27
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module RkRspec
|
2
|
+
class Config
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def default
|
6
|
+
{
|
7
|
+
project_name: 'Default',
|
8
|
+
report_server_host: 'results-keeper.com',
|
9
|
+
report_server_port: 80,
|
10
|
+
api: {
|
11
|
+
revision_path: 'revisions',
|
12
|
+
test_path: 'tests'
|
13
|
+
}
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def config
|
18
|
+
opts = {}
|
19
|
+
opts[:report_server_host] = ENV['RK_REPORT_SERVER_HOST'] if ENV['RK_REPORT_SERVER_HOST']
|
20
|
+
opts[:report_server_port] = ENV['RK_REPORT_SERVER_PORT'] if ENV['RK_REPORT_SERVER_PORT']
|
21
|
+
opts[:project_name] = ENV['RK_PROJECT_NAME'] || default_project_name
|
22
|
+
opts[:revision_name] = ENV['RK_REVISION_NAME'] || ENV['RK_REVISION_NAME'] = "Result for #{Time.now}"
|
23
|
+
opts[:secret_key] = ENV['RK_SECRET_KEY'] || raise(RkRspec::Messages.no_secret_key)
|
24
|
+
default.merge!(opts)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def default_project_name
|
30
|
+
begin
|
31
|
+
`pwd`.strip.split('/').last
|
32
|
+
rescue
|
33
|
+
'Default'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require_relative 'string'
|
2
|
+
require_relative 'config'
|
3
|
+
|
4
|
+
module RkRspec
|
5
|
+
class Messages
|
6
|
+
class << self
|
7
|
+
|
8
|
+
# ERROR
|
9
|
+
def take_screenshot_error
|
10
|
+
console_warning_message('Could not take a screenshot :(')
|
11
|
+
end
|
12
|
+
|
13
|
+
def error_send_screenshot
|
14
|
+
console_warning_message("Could not send screenshot, there seems to be a problem with #{RkRspec::Config.config[:report_server_host]}:#{RkRspec::Config.config[:report_server_port]}")
|
15
|
+
end
|
16
|
+
|
17
|
+
def error_not_sent_scenario(amount)
|
18
|
+
console_warning_message("Not sent scenarios amount: #{amount}")
|
19
|
+
end
|
20
|
+
|
21
|
+
def no_secret_key
|
22
|
+
'RK_SECRET_KEY env var not found. Please use export RK_SECRET_KEY=<your secret key> to set it.'
|
23
|
+
end
|
24
|
+
|
25
|
+
# INFO
|
26
|
+
def info_trying_resend(scenario_name)
|
27
|
+
console_message("Trying to re-send '#{scenario_name}' once more")
|
28
|
+
end
|
29
|
+
|
30
|
+
def info_message_to_client(response, message_to_client=nil)
|
31
|
+
message_to_client ? console_message("#{message_to_client} - #{response.code} - #{response.message}") : console_message("#{response.code} - #{response.message}")
|
32
|
+
end
|
33
|
+
|
34
|
+
# WARN
|
35
|
+
def warn_problem_with_rk
|
36
|
+
console_warning_message("There seems to be a problem with #{RkRspec::Config.config[:report_server_host]}:#{RkRspec::Config.config[:report_server_port]}, make sure your RK_SECRET_KEY is correct and server is up.")
|
37
|
+
end
|
38
|
+
|
39
|
+
def console_message(text)
|
40
|
+
private
|
41
|
+
puts " Results Keeper: #{text}".blue unless ENV['HIDE_RK_MESSAGES'] == 'true'
|
42
|
+
end
|
43
|
+
|
44
|
+
def console_warning_message(text)
|
45
|
+
private
|
46
|
+
puts " Results Keeper: #{text}".yellow unless ENV['HIDE_RK_MESSAGES'] == 'true'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'json'
|
3
|
+
require 'rest_client'
|
4
|
+
require 'pry'
|
5
|
+
require_relative 'messages'
|
6
|
+
require_relative 'config'
|
7
|
+
require_relative 'test_data_generator'
|
8
|
+
|
9
|
+
module RkRspec
|
10
|
+
class ResultsSender
|
11
|
+
|
12
|
+
attr_reader :tmp_data
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@data_generator = RkRspec::TestDataGenerator.new
|
16
|
+
@tmp_data ||= {}
|
17
|
+
@tmp_data[:tests] ||= []
|
18
|
+
end
|
19
|
+
|
20
|
+
def send_revision
|
21
|
+
@revision = send_json(@data_generator.revision_data,
|
22
|
+
RkRspec::Config.default[:api][:revision_path],
|
23
|
+
"#{RkRspec::Config.config[:project_name]} > #{RkRspec::Config.config[:revision_name]} started")
|
24
|
+
end
|
25
|
+
|
26
|
+
def send_revision_complete
|
27
|
+
send_not_sent_scenarios
|
28
|
+
send_json(@data_generator.revision_completed_data,
|
29
|
+
RkRspec::Config.default[:api][:revision_path],
|
30
|
+
"#{RkRspec::Config.config[:revision_name]} completed")
|
31
|
+
end
|
32
|
+
|
33
|
+
def send_test(scenario)
|
34
|
+
# In case if the host is not available we need to send revision once more (when it comes back)
|
35
|
+
send_revision unless @revision
|
36
|
+
return unless @revision
|
37
|
+
screenshot_path = @data_generator.save_screenshot(scenario) if ENV['RK_SEND_SCREENSHOTS']
|
38
|
+
@test = send_json(@data_generator.test_data(scenario, @revision),
|
39
|
+
RkRspec::Config.default[:api][:test_path], nil)
|
40
|
+
send_screenshot(screenshot_path) if screenshot_path
|
41
|
+
@test
|
42
|
+
end
|
43
|
+
|
44
|
+
def send_screenshot(screenshot_path)
|
45
|
+
begin
|
46
|
+
params = { project: @revision['project_id'], revision: @revision['revision_id'], test: @test['id'] }
|
47
|
+
RestClient.post("http://#{RkRspec::Config.config[:report_server_host]}:#{RkRspec::Config.config[:report_server_port]}/api/tests/upload_screenshot",
|
48
|
+
:name_of_file_param => File.new(screenshot_path), :body => params)
|
49
|
+
File.delete(screenshot_path)
|
50
|
+
rescue
|
51
|
+
RkRspec::Messages.error_send_screenshot
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def send_json(body, path, message_to_client=nil)
|
56
|
+
body['secret_key'] = RkRspec::Config.config[:secret_key]
|
57
|
+
@path = "/api/#{path}"
|
58
|
+
@body = body.to_json
|
59
|
+
begin
|
60
|
+
request = Net::HTTP::Post.new(@path, initheader = {'Content-Type' => 'application/json'})
|
61
|
+
request.body = @body
|
62
|
+
response = Net::HTTP.new(RkRspec::Config.config[:report_server_host],
|
63
|
+
RkRspec::Config.config[:report_server_port]).start { |http| http.request(request) }
|
64
|
+
|
65
|
+
RkRspec::Messages.info_message_to_client(response, message_to_client) if message_to_client
|
66
|
+
JSON.parse(response.body)
|
67
|
+
rescue
|
68
|
+
false
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def send_not_sent_scenarios
|
73
|
+
if @revision
|
74
|
+
@tmp_data[:tests].each do |s|
|
75
|
+
s[:revision_id] = @revision['revision_id'] unless s[:revision_id]
|
76
|
+
RkRspec::Messages.info_trying_resend(s[:name])
|
77
|
+
send_json(s, RkRspec::Config.default[:api][:test_path]) if @revision
|
78
|
+
end
|
79
|
+
else
|
80
|
+
false
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def add_test_to_tmp(scenario)
|
85
|
+
@tmp_data[:tests] << @data_generator.test_data(scenario, @revision)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
File without changes
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require_relative 'config'
|
2
|
+
|
3
|
+
module RkRspec
|
4
|
+
class TestDataGenerator
|
5
|
+
|
6
|
+
def revision_data
|
7
|
+
{ revision: RkRspec::Config.config[:revision_name], project: RkRspec::Config.config[:project_name] }
|
8
|
+
end
|
9
|
+
|
10
|
+
def revision_completed_data
|
11
|
+
{ revision: RkRspec::Config.config[:revision_name], project: RkRspec::Config.config[:project_name], completed: 1 }
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_data(scenario, revision)
|
15
|
+
revision ||= { revision_id: nil }
|
16
|
+
test_duration = Time.now - scenario.metadata[:execution_result].started_at
|
17
|
+
status = scenario.exception ? 'failed' : 'passed'
|
18
|
+
scenario_error = scenario.exception.message if scenario.exception
|
19
|
+
run_path = "rspec #{scenario.location}"
|
20
|
+
{
|
21
|
+
name: "#{scenario.example_group.description} - #{scenario.description}",
|
22
|
+
status: status,
|
23
|
+
feature_name: scenario.example_group.description,
|
24
|
+
run_path: run_path,
|
25
|
+
error: scenario_error,
|
26
|
+
revision_id: revision['revision_id'],
|
27
|
+
duration: test_duration
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def save_screenshot(scenario)
|
32
|
+
if scenario.exception
|
33
|
+
screenshot_name = "#{Time.now.to_i}_#{rand(1000..9999)}.png"
|
34
|
+
@file_path = "tmp/screenshots/#{screenshot_name}"
|
35
|
+
Capybara.page.save_screenshot(@file_path)
|
36
|
+
@file_path
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: results_keeper_rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Kozakov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-11-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: flickraw
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rest-client
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
description: Results Keeper is a application which can help you to track and manage
|
@@ -46,7 +46,11 @@ extensions: []
|
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
48
|
- lib/results_keeper_rspec.rb
|
49
|
-
- lib/
|
49
|
+
- lib/results_keeper_rspec/config.rb
|
50
|
+
- lib/results_keeper_rspec/messages.rb
|
51
|
+
- lib/results_keeper_rspec/results_sender.rb
|
52
|
+
- lib/results_keeper_rspec/string.rb
|
53
|
+
- lib/results_keeper_rspec/test_data_generator.rb
|
50
54
|
homepage: https://bitbucket.org/results_keeper/results_keeper_rspec/
|
51
55
|
licenses:
|
52
56
|
- MIT
|
@@ -57,17 +61,17 @@ require_paths:
|
|
57
61
|
- lib
|
58
62
|
required_ruby_version: !ruby/object:Gem::Requirement
|
59
63
|
requirements:
|
60
|
-
- -
|
64
|
+
- - ">="
|
61
65
|
- !ruby/object:Gem::Version
|
62
66
|
version: '0'
|
63
67
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
68
|
requirements:
|
65
|
-
- -
|
69
|
+
- - ">="
|
66
70
|
- !ruby/object:Gem::Version
|
67
71
|
version: '0'
|
68
72
|
requirements: []
|
69
73
|
rubyforge_project:
|
70
|
-
rubygems_version: 2.
|
74
|
+
rubygems_version: 2.6.14
|
71
75
|
signing_key:
|
72
76
|
specification_version: 4
|
73
77
|
summary: Result Keeper Gem For Rspec Tests
|