turnip_formatter 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rspec/core/formatters/turnip_formatter.rb +7 -34
- data/lib/turnip_formatter/ext/turnip/rspec.rb +2 -0
- data/lib/turnip_formatter/printer/index.rb +29 -0
- data/lib/turnip_formatter/printer/runtime_error.rb +41 -0
- data/lib/turnip_formatter/printer/scenario.rb +20 -0
- data/lib/turnip_formatter/printer/step.rb +34 -0
- data/lib/turnip_formatter/printer/step_extra_args.rb +21 -0
- data/lib/turnip_formatter/printer/tab_feature_statistics.rb +47 -0
- data/lib/turnip_formatter/printer/tab_speed_statistics.rb +34 -0
- data/lib/turnip_formatter/printer/tab_tag_statistics.rb +72 -0
- data/lib/turnip_formatter/printer.rb +34 -0
- data/lib/turnip_formatter/template/exception.erb +9 -25
- data/lib/turnip_formatter/template/index.erb +65 -0
- data/lib/turnip_formatter/template/runtime_exception.erb +16 -0
- data/lib/turnip_formatter/template/scenario.erb +9 -8
- data/lib/turnip_formatter/template/step.erb +4 -0
- data/lib/turnip_formatter/template/tab_feature_statistics.erb +24 -0
- data/lib/turnip_formatter/template/tab_speed_statistics.erb +18 -0
- data/lib/turnip_formatter/template/tab_tag_statistics.erb +24 -0
- data/lib/turnip_formatter/template/turnip_formatter.js +51 -0
- data/lib/turnip_formatter/{formatter.scss → template/turnip_formatter.scss} +0 -0
- data/lib/turnip_formatter/template.rb +21 -254
- data/lib/turnip_formatter/version.rb +1 -1
- data/lib/turnip_formatter.rb +1 -1
- data/spec/rspec/core/formatters/turnip_formatter_spec.rb +11 -28
- data/spec/turnip_formatter/printer/scenario_spec.rb +33 -0
- data/spec/turnip_formatter/printer/step_extra_args_spec.rb +32 -0
- data/spec/turnip_formatter/printer/step_spec.rb +86 -0
- data/spec/turnip_formatter/printer/tab_feature_statistics_spec.rb +83 -0
- data/spec/turnip_formatter/printer/tab_speed_statistics_spec.rb +51 -0
- data/spec/turnip_formatter/printer/tab_tag_statistics_spec.rb +90 -0
- data/spec/turnip_formatter/template_spec.rb +0 -173
- data/turnip_formatter.gemspec +2 -0
- metadata +63 -14
- data/lib/turnip_formatter/formatter.css +0 -205
- data/lib/turnip_formatter/template/scenario_tags.erb +0 -5
- data/lib/turnip_formatter/template/tab/feature_statistics.rb +0 -78
- data/lib/turnip_formatter/template/tab/speed_statistics.rb +0 -61
- data/lib/turnip_formatter/template/tab/tag_statistics.rb +0 -101
- data/spec/turnip_formatter/template/tab/feature_statistics_spec.rb +0 -87
- data/spec/turnip_formatter/template/tab/speed_statistics_spec.rb +0 -56
- data/spec/turnip_formatter/template/tab/tag_statistics_spec.rb +0 -88
@@ -1,78 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
require 'turnip_formatter/template'
|
4
|
-
|
5
|
-
module TurnipFormatter
|
6
|
-
class Template
|
7
|
-
module Tab
|
8
|
-
class FeatureStatistics
|
9
|
-
attr_reader :features
|
10
|
-
|
11
|
-
#
|
12
|
-
# @param [Array] passed_examples Array of TurnipFormatter::Scenario
|
13
|
-
#
|
14
|
-
def initialize(scenarios)
|
15
|
-
@features = scenarios.group_by { |s| s.feature_name }
|
16
|
-
end
|
17
|
-
|
18
|
-
def build
|
19
|
-
html = <<-EOS
|
20
|
-
<table>
|
21
|
-
<thead>
|
22
|
-
<tr>
|
23
|
-
<th>Feature</th>
|
24
|
-
<th>Scearios</th>
|
25
|
-
<th>passed</th>
|
26
|
-
<th>failed</th>
|
27
|
-
<th>pending</th>
|
28
|
-
<th>status</th>
|
29
|
-
</tr>
|
30
|
-
</thead>
|
31
|
-
<tbody>
|
32
|
-
EOS
|
33
|
-
|
34
|
-
html += @features.map do |feature_name, scenarios|
|
35
|
-
info = feature_analysis(feature_name, scenarios)
|
36
|
-
build_tr(info)
|
37
|
-
end.join
|
38
|
-
|
39
|
-
html += '</tbody></table>'
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def feature_analysis(name, scenarios)
|
45
|
-
status_group = scenarios.group_by { |s| s.status }
|
46
|
-
|
47
|
-
info = {
|
48
|
-
name: name,
|
49
|
-
scenarios: scenarios.count,
|
50
|
-
passed: status_count(status_group["passed"]),
|
51
|
-
failed: status_count(status_group["failed"]),
|
52
|
-
pending: status_count(status_group["pending"])
|
53
|
-
}
|
54
|
-
info[:status] = info[:failed].zero? ? (info[:pending].zero? ? 'passed' : 'pending') : 'failed'
|
55
|
-
|
56
|
-
info
|
57
|
-
end
|
58
|
-
|
59
|
-
def status_count(scenarios)
|
60
|
-
scenarios.nil? ? 0 : scenarios.count
|
61
|
-
end
|
62
|
-
|
63
|
-
def build_tr(info)
|
64
|
-
<<-EOS
|
65
|
-
<tr>
|
66
|
-
<td>#{info[:name]}</td>
|
67
|
-
<td>#{info[:scenarios]}</td>
|
68
|
-
<td>#{info[:passed]}</td>
|
69
|
-
<td>#{info[:failed]}</td>
|
70
|
-
<td>#{info[:pending]}</td>
|
71
|
-
<td class="#{info[:status]}">#{info[:status]}</td>
|
72
|
-
</tr>
|
73
|
-
EOS
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
require 'turnip_formatter/template'
|
4
|
-
require 'ostruct'
|
5
|
-
|
6
|
-
module TurnipFormatter
|
7
|
-
class Template
|
8
|
-
module Tab
|
9
|
-
class SpeedStatistics
|
10
|
-
attr_reader :scenarios
|
11
|
-
|
12
|
-
#
|
13
|
-
# @param [Array] passed_examples Array of TurnipFormatter::Scenario::Pass
|
14
|
-
#
|
15
|
-
def initialize(passed_scenarios)
|
16
|
-
@scenarios = passed_scenarios.map do |s|
|
17
|
-
OpenStruct.new(
|
18
|
-
{
|
19
|
-
id: s.id,
|
20
|
-
feature_name: s.feature_name,
|
21
|
-
name: s.name,
|
22
|
-
run_time: s.run_time
|
23
|
-
}
|
24
|
-
)
|
25
|
-
end.sort { |a, b| a.run_time <=> b.run_time }
|
26
|
-
end
|
27
|
-
|
28
|
-
def build
|
29
|
-
html = <<-EOS
|
30
|
-
<table>
|
31
|
-
<thead>
|
32
|
-
<tr>
|
33
|
-
<th>Feature</th>
|
34
|
-
<th>Scenario</th>
|
35
|
-
<th>Duration</th>
|
36
|
-
</tr>
|
37
|
-
</thead>
|
38
|
-
<tbody>
|
39
|
-
EOS
|
40
|
-
|
41
|
-
html += scenarios.map do |scenario|
|
42
|
-
<<-EOS
|
43
|
-
<tr>
|
44
|
-
<td><span>#{scenario.feature_name}</span></td>
|
45
|
-
<td><a href=\"\##{scenario.id}\">#{scenario.name}</a></td>
|
46
|
-
<td><span>#{scenario.run_time}</span> sec</td>
|
47
|
-
</tr>
|
48
|
-
EOS
|
49
|
-
end.join
|
50
|
-
|
51
|
-
html += <<-EOS
|
52
|
-
</tbody>
|
53
|
-
</table>
|
54
|
-
EOS
|
55
|
-
|
56
|
-
html
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,101 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
require 'turnip_formatter/template'
|
4
|
-
|
5
|
-
module TurnipFormatter
|
6
|
-
class Template
|
7
|
-
module Tab
|
8
|
-
class TagStatistics
|
9
|
-
attr_reader :scenarios
|
10
|
-
|
11
|
-
#
|
12
|
-
# @param [Array] passed_examples Array of TurnipFormatter::Scenario
|
13
|
-
#
|
14
|
-
def initialize(scenarios)
|
15
|
-
@scenarios = scenarios
|
16
|
-
end
|
17
|
-
|
18
|
-
def build
|
19
|
-
html = <<-EOS
|
20
|
-
<table>
|
21
|
-
<thead>
|
22
|
-
<tr>
|
23
|
-
<th>Tag</th>
|
24
|
-
<th>Scearios</th>
|
25
|
-
<th>passed</th>
|
26
|
-
<th>failed</th>
|
27
|
-
<th>pending</th>
|
28
|
-
<th>status</th>
|
29
|
-
</tr>
|
30
|
-
</thead>
|
31
|
-
<tbody>
|
32
|
-
EOS
|
33
|
-
|
34
|
-
html += tag_analysis.map { |info| build_tr(info) }.join
|
35
|
-
html += '</tbody></table>'
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def tag_analysis
|
41
|
-
group_by_tag.map do |tag, scenarios|
|
42
|
-
status_group = scenarios.group_by { |s| s[:scenario].status }
|
43
|
-
info = OpenStruct.new(
|
44
|
-
name: tag,
|
45
|
-
scenarios: scenarios.count,
|
46
|
-
passed: status_count(status_group["passed"]),
|
47
|
-
failed: status_count(status_group["failed"]),
|
48
|
-
pending: status_count(status_group["pending"]),
|
49
|
-
status: 'failed'
|
50
|
-
)
|
51
|
-
info.status = (info.pending.zero? ? 'passed' : 'pending') if info.failed.zero?
|
52
|
-
info
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
#
|
57
|
-
# Image...
|
58
|
-
#
|
59
|
-
# [
|
60
|
-
# { tags: [:a, :b], val: 3 },
|
61
|
-
# { tags: [:a], val: 4 },
|
62
|
-
# { tags: [:b], val: 5 },
|
63
|
-
# ]
|
64
|
-
# # => [
|
65
|
-
# a: [3, 4],
|
66
|
-
# b: [3, 5]
|
67
|
-
# ]
|
68
|
-
#
|
69
|
-
#
|
70
|
-
def group_by_tag
|
71
|
-
scenarios.map do |scenario|
|
72
|
-
if scenario.tags.empty?
|
73
|
-
{ name: 'turnip', scenario: scenario }
|
74
|
-
else
|
75
|
-
scenario.tags.map do |tag|
|
76
|
-
{ name: '@' + tag, scenario: scenario }
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end.flatten.group_by { |s| s[:name] }.sort
|
80
|
-
end
|
81
|
-
|
82
|
-
def status_count(scenarios)
|
83
|
-
scenarios.nil? ? 0 : scenarios.count
|
84
|
-
end
|
85
|
-
|
86
|
-
def build_tr(info)
|
87
|
-
<<-EOS
|
88
|
-
<tr>
|
89
|
-
<td>#{info.name}</td>
|
90
|
-
<td>#{info.scenarios}</td>
|
91
|
-
<td>#{info.passed}</td>
|
92
|
-
<td>#{info.failed}</td>
|
93
|
-
<td>#{info.pending}</td>
|
94
|
-
<td class="#{info.status}">#{info.status}</td>
|
95
|
-
</tr>
|
96
|
-
EOS
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'turnip_formatter/template/tab/feature_statistics'
|
3
|
-
|
4
|
-
module TurnipFormatter
|
5
|
-
class Template
|
6
|
-
module Tab
|
7
|
-
describe FeatureStatistics do
|
8
|
-
include_context 'turnip_formatter scenario setup'
|
9
|
-
include_context 'turnip_formatter standard scenario metadata'
|
10
|
-
|
11
|
-
let :base_scenario do
|
12
|
-
TurnipFormatter::Scenario::Pass.new(example)
|
13
|
-
end
|
14
|
-
|
15
|
-
let :statistics do
|
16
|
-
FeatureStatistics.new(scenarios)
|
17
|
-
end
|
18
|
-
|
19
|
-
context 'feature only passed scenario' do
|
20
|
-
let :scenarios do
|
21
|
-
# Feature: Hago (passed:2 failed:0, pending:0)
|
22
|
-
['passed', 'passed'].map do |status|
|
23
|
-
scenario = base_scenario.dup
|
24
|
-
scenario.stub(:status).and_return(status)
|
25
|
-
scenario
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe '#feature_analysis' do
|
30
|
-
it 'should get passed feature information' do
|
31
|
-
info = statistics.send(:feature_analysis, 'Hoge', scenarios)
|
32
|
-
expect(info[:name]).to eq 'Hoge'
|
33
|
-
expect(info[:passed]).to eq 2
|
34
|
-
expect(info[:failed]).to be_zero
|
35
|
-
expect(info[:pending]).to be_zero
|
36
|
-
expect(info[:status]).to eq 'passed'
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'feature with failed scenario' do
|
42
|
-
let :scenarios do
|
43
|
-
# Feature: Hoge (passed:1 failed:2, pending:0)
|
44
|
-
['passed', 'failed', 'failed'].map do |status|
|
45
|
-
scenario = base_scenario.dup
|
46
|
-
scenario.stub(:status).and_return(status)
|
47
|
-
scenario
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe '#feature_analysis' do
|
52
|
-
it 'should get failed feature information' do
|
53
|
-
info = statistics.send(:feature_analysis, 'Fuga', scenarios)
|
54
|
-
expect(info[:name]).to eq 'Fuga'
|
55
|
-
expect(info[:passed]).to eq 1
|
56
|
-
expect(info[:failed]).to eq 2
|
57
|
-
expect(info[:pending]).to be_zero
|
58
|
-
expect(info[:status]).to eq 'failed'
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
context 'feature with pending scenario' do
|
64
|
-
let :scenarios do
|
65
|
-
# Feature: Fuga (passed:1 failed:0, pending:1)
|
66
|
-
['passed', 'pending'].map do |status|
|
67
|
-
scenario = base_scenario.dup
|
68
|
-
scenario.stub(:status).and_return(status)
|
69
|
-
scenario
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe '#feature_analysis' do
|
74
|
-
it 'should get pending feature information' do
|
75
|
-
info = statistics.send(:feature_analysis, 'Hago', scenarios)
|
76
|
-
expect(info[:name]).to eq 'Hago'
|
77
|
-
expect(info[:passed]).to eq 1
|
78
|
-
expect(info[:failed]).to be_zero
|
79
|
-
expect(info[:pending]).to eq 1
|
80
|
-
expect(info[:status]).to eq 'pending'
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'turnip_formatter/template/tab/speed_statistics'
|
3
|
-
|
4
|
-
module TurnipFormatter
|
5
|
-
class Template
|
6
|
-
module Tab
|
7
|
-
describe SpeedStatistics do
|
8
|
-
include_context 'turnip_formatter scenario setup'
|
9
|
-
include_context 'turnip_formatter standard scenario metadata'
|
10
|
-
|
11
|
-
let :passed_scenarios do
|
12
|
-
([example] * 3).map do |ex|
|
13
|
-
TurnipFormatter::Scenario::Pass.new(ex)
|
14
|
-
end.each { |s| s.stub(:run_time).and_return(rand) }
|
15
|
-
end
|
16
|
-
|
17
|
-
let :statistics do
|
18
|
-
SpeedStatistics.new(passed_scenarios)
|
19
|
-
end
|
20
|
-
|
21
|
-
describe '#build' do
|
22
|
-
it 'should get string as HTML table' do
|
23
|
-
scenarios = statistics.scenarios
|
24
|
-
html = statistics.build
|
25
|
-
|
26
|
-
scenarios.each do |scenario|
|
27
|
-
tag_scenario_name = "<a href=\"\##{scenario.id}\">#{scenario.name}</a>"
|
28
|
-
tag_run_time = "<span>#{scenario.run_time}</span>"
|
29
|
-
tag_feature_name = "<span>#{scenario.feature_name}</span>"
|
30
|
-
|
31
|
-
expect_match = [
|
32
|
-
'<tr>',
|
33
|
-
"<td>#{tag_feature_name}</td>",
|
34
|
-
"<td>#{tag_scenario_name}</td>",
|
35
|
-
"<td>#{tag_run_time} sec</td>",
|
36
|
-
'</tr>'
|
37
|
-
].join('[[:space:]]+')
|
38
|
-
|
39
|
-
expect(html).to match %r(#{expect_match})
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe '#scenarios' do
|
45
|
-
it 'should get array of scenario' do
|
46
|
-
scenarios = statistics.scenarios
|
47
|
-
expect(scenarios).to have(3).elements
|
48
|
-
|
49
|
-
run_time_list = scenarios.map(&:run_time)
|
50
|
-
expect(run_time_list.sort).to eq run_time_list
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'turnip_formatter/template/tab/tag_statistics'
|
3
|
-
|
4
|
-
module TurnipFormatter
|
5
|
-
class Template
|
6
|
-
module Tab
|
7
|
-
describe TagStatistics do
|
8
|
-
include_context 'turnip_formatter scenario setup'
|
9
|
-
include_context 'turnip_formatter standard scenario metadata'
|
10
|
-
|
11
|
-
let :base_scenario do
|
12
|
-
TurnipFormatter::Scenario::Pass.new(example)
|
13
|
-
end
|
14
|
-
|
15
|
-
let :scenarios do
|
16
|
-
scenarios = []
|
17
|
-
|
18
|
-
# | tag | scenarios | passed | failed | pending | status |
|
19
|
-
# |-------+-----------+--------+--------+---------+---------|
|
20
|
-
# | none | 1 | 1 | 0 | 0 | status |
|
21
|
-
# | @bar | 2 | 0 | 1 | 1 | failed |
|
22
|
-
# | @foo | 1 | 0 | 1 | 0 | failed |
|
23
|
-
# | @hoge | 1 | 1 | 0 | 1 | pending |
|
24
|
-
|
25
|
-
# Failed scenario have tags @hoge and @fuga
|
26
|
-
scenario = base_scenario.dup
|
27
|
-
scenario.stub(:tags).and_return(['foo', 'bar'])
|
28
|
-
scenario.stub(:status).and_return('failed')
|
29
|
-
scenarios << scenario
|
30
|
-
|
31
|
-
# Passed scenario no have tags
|
32
|
-
scenario = base_scenario.dup
|
33
|
-
scenario.stub(:tags).and_return([])
|
34
|
-
scenario.stub(:status).and_return('passed')
|
35
|
-
scenarios << scenario
|
36
|
-
|
37
|
-
# Passed scenario have tags @hoge
|
38
|
-
scenario = base_scenario.dup
|
39
|
-
scenario.stub(:tags).and_return(['hoge'])
|
40
|
-
scenario.stub(:status).and_return('passed')
|
41
|
-
scenarios << scenario
|
42
|
-
|
43
|
-
# Pending scenario have tags @fuga and @hago
|
44
|
-
scenario = base_scenario.dup
|
45
|
-
scenario.stub(:tags).and_return(['bar', 'hoge'])
|
46
|
-
scenario.stub(:status).and_return('pending')
|
47
|
-
scenarios << scenario
|
48
|
-
end
|
49
|
-
|
50
|
-
let :statistics do
|
51
|
-
TagStatistics.new(scenarios)
|
52
|
-
end
|
53
|
-
|
54
|
-
describe '#tag_analysis' do
|
55
|
-
let :results do
|
56
|
-
statistics.send(:tag_analysis)
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'should get results sort by tag name' do
|
60
|
-
expect(results.map(&:name)).to eq ['@bar', '@foo', '@hoge', 'turnip']
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'should get count of each status' do
|
64
|
-
# @bar
|
65
|
-
res = results[0]
|
66
|
-
expect([res.passed, res.failed, res.pending]).to eq [0, 1, 1]
|
67
|
-
expect(res.status).to eq 'failed'
|
68
|
-
|
69
|
-
# @foo
|
70
|
-
res = results[1]
|
71
|
-
expect([res.passed, res.failed, res.pending]).to eq [0, 1, 0]
|
72
|
-
expect(res.status).to eq 'failed'
|
73
|
-
|
74
|
-
# @hoge
|
75
|
-
res = results[2]
|
76
|
-
expect([res.passed, res.failed, res.pending]).to eq [1, 0, 1]
|
77
|
-
expect(res.status).to eq 'pending'
|
78
|
-
|
79
|
-
# no tags (turnip)
|
80
|
-
res = results[3]
|
81
|
-
expect([res.passed, res.failed, res.pending]).to eq [1, 0, 0]
|
82
|
-
expect(res.status).to eq 'passed'
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|