turnip_formatter 0.2.1 → 0.2.2
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.
- 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
@@ -0,0 +1,51 @@
|
|
1
|
+
$(function() {
|
2
|
+
var scenarioHeader = 'section.scenario header';
|
3
|
+
$(scenarioHeader).siblings().hide();
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Step folding/expanding
|
7
|
+
*/
|
8
|
+
$(scenarioHeader).click(function() {
|
9
|
+
$(this).siblings().slideToggle();
|
10
|
+
});
|
11
|
+
|
12
|
+
/**
|
13
|
+
* All step folding/expanding action
|
14
|
+
*/
|
15
|
+
$('#scenario_display_check').change(function() {
|
16
|
+
var steps = $(scenarioHeader).siblings();
|
17
|
+
|
18
|
+
if (this.checked) {
|
19
|
+
steps.slideUp();
|
20
|
+
} else {
|
21
|
+
steps.slideDown();
|
22
|
+
}
|
23
|
+
});
|
24
|
+
|
25
|
+
["passed", "failed", "pending"].forEach(function(status) {
|
26
|
+
$('#' + status + '_check').click(function() {
|
27
|
+
if (this.checked) {
|
28
|
+
$('.scenario.' + status).show();
|
29
|
+
} else {
|
30
|
+
$('.scenario.' + status).hide();
|
31
|
+
}
|
32
|
+
});
|
33
|
+
});
|
34
|
+
|
35
|
+
$(".scenario.passed").hide();
|
36
|
+
$(".scenario.pending").hide();
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Tabs
|
40
|
+
*/
|
41
|
+
$('div#main').tabs();
|
42
|
+
$('div#speed-statistics a').click(function() {
|
43
|
+
$('div#main').tabs("option", "active", 0);
|
44
|
+
});
|
45
|
+
|
46
|
+
$("div#speed-statistics table").tablesorter({
|
47
|
+
headers: {
|
48
|
+
1: { sorter: false }
|
49
|
+
}
|
50
|
+
});
|
51
|
+
});
|
File without changes
|
@@ -1,22 +1,28 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
require '
|
4
|
-
require 'rspec/core/formatters/helpers'
|
5
|
-
require 'turnip_formatter/template/tab/speed_statistics'
|
6
|
-
require 'turnip_formatter/template/tab/feature_statistics'
|
7
|
-
require 'turnip_formatter/template/tab/tag_statistics'
|
3
|
+
require 'turnip_formatter/template'
|
8
4
|
require 'sass'
|
5
|
+
require 'uglifier'
|
9
6
|
|
10
7
|
module TurnipFormatter
|
11
8
|
class Template
|
12
|
-
include ERB::Util
|
13
|
-
include RSpec::Core::BacktraceFormatter
|
14
|
-
|
15
9
|
class << self
|
16
10
|
def add_js(js_string)
|
17
11
|
js_list << js_string
|
18
12
|
end
|
19
13
|
|
14
|
+
def add_js_file(file)
|
15
|
+
js_list << Uglifier.compile(File.read(file))
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_scss(scss_string)
|
19
|
+
css_list << Sass::Engine.new(scss_string, scss_option).render
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_scss_file(path)
|
23
|
+
css_list << Sass::Engine.for_file(path, scss_option).render
|
24
|
+
end
|
25
|
+
|
20
26
|
def js_render
|
21
27
|
js_list.join("\n")
|
22
28
|
end
|
@@ -25,10 +31,6 @@ module TurnipFormatter
|
|
25
31
|
css_list.join("\n")
|
26
32
|
end
|
27
33
|
|
28
|
-
def add_scss(scss_string)
|
29
|
-
css_list << scss_compile(scss_string)
|
30
|
-
end
|
31
|
-
|
32
34
|
def js_list
|
33
35
|
@js_list ||= []
|
34
36
|
end
|
@@ -37,249 +39,14 @@ module TurnipFormatter
|
|
37
39
|
@css_list ||= []
|
38
40
|
end
|
39
41
|
|
40
|
-
def
|
41
|
-
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def print_header
|
46
|
-
<<-EOS
|
47
|
-
<!DOCTYPE html>
|
48
|
-
<html>
|
49
|
-
<head>
|
50
|
-
<meta charset="UTF-8">
|
51
|
-
<title>turnip formatter report</title>
|
52
|
-
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
|
53
|
-
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script>
|
54
|
-
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.9.1/jquery.tablesorter.min.js"></script>
|
55
|
-
|
56
|
-
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/themes/smoothness/jquery-ui.css">
|
57
|
-
<style>
|
58
|
-
#{File.read(File.dirname(__FILE__) + '/formatter.css')}
|
59
|
-
#{self.class.css_render}
|
60
|
-
</style>
|
61
|
-
|
62
|
-
<script>
|
63
|
-
$(function() {
|
64
|
-
var scenarioHeader = 'section.scenario header';
|
65
|
-
$(scenarioHeader).siblings().hide();
|
66
|
-
|
67
|
-
/**
|
68
|
-
* Step folding/expanding
|
69
|
-
*/
|
70
|
-
$(scenarioHeader).click(function() {
|
71
|
-
var steps = $(this).siblings();
|
72
|
-
steps.slideToggle();
|
73
|
-
});
|
74
|
-
|
75
|
-
/**
|
76
|
-
* All step folding/expanding action
|
77
|
-
*/
|
78
|
-
$('#scenario_display_check').change(function() {
|
79
|
-
var steps = $(scenarioHeader).siblings();
|
80
|
-
|
81
|
-
if (this.checked) {
|
82
|
-
steps.slideUp();
|
83
|
-
} else {
|
84
|
-
steps.slideDown();
|
85
|
-
}
|
86
|
-
});
|
87
|
-
|
88
|
-
["passed", "failed", "pending"].forEach(function(status) {
|
89
|
-
$('#' + status + '_check').click(function() {
|
90
|
-
if (this.checked) {
|
91
|
-
$('.scenario.' + status).show();
|
92
|
-
} else {
|
93
|
-
$('.scenario.' + status).hide();
|
94
|
-
}
|
95
|
-
});
|
96
|
-
});
|
97
|
-
|
98
|
-
$(".scenario.passed").hide();
|
99
|
-
$(".scenario.pending").hide();
|
100
|
-
|
101
|
-
/**
|
102
|
-
* Tabs
|
103
|
-
*/
|
104
|
-
var tab_area = 'div#main';
|
105
|
-
$(tab_area).tabs();
|
106
|
-
|
107
|
-
$('div#speed-statistics a').click(function() {
|
108
|
-
$(tab_area).tabs("option", "active", 0);
|
109
|
-
});
|
110
|
-
|
111
|
-
$("div#speed-statistics table").tablesorter({
|
112
|
-
headers: {
|
113
|
-
1: { sorter: false }
|
114
|
-
}
|
115
|
-
});
|
116
|
-
|
117
|
-
#{self.class.js_render}
|
118
|
-
});
|
119
|
-
</script>
|
120
|
-
</head>
|
121
|
-
<body>
|
122
|
-
#{print_section_report}
|
123
|
-
<div id="main" role="main">
|
124
|
-
<ul>
|
125
|
-
<li><a href="#steps-statistics">Steps</a></li>
|
126
|
-
<li><a href="#speed-statistics">Speed Statistics</a></li>
|
127
|
-
<li><a href="#feature-statistics">Feature Statistics</a></li>
|
128
|
-
<li><a href="#tag-statistics">Tag Statistics</a></li>
|
129
|
-
</ul>
|
130
|
-
EOS
|
131
|
-
end
|
132
|
-
|
133
|
-
def print_main_header
|
134
|
-
<<-EOS
|
135
|
-
<div id="steps-statistics">
|
136
|
-
<label><input type="checkbox" id="scenario_display_check" checked>step folding</label>
|
137
|
-
EOS
|
138
|
-
end
|
139
|
-
|
140
|
-
def print_main_footer(total_count, failed_count, pending_count, total_time)
|
141
|
-
update_report_js_tmp = '<script type="text/javascript">document.getElementById("%s").innerHTML = "%s";</script>'
|
142
|
-
update_report_js = ''
|
143
|
-
|
144
|
-
%w{ total_count failed_count pending_count total_time }.each do |key|
|
145
|
-
update_report_js += update_report_js_tmp % [key, eval(key)]
|
146
|
-
end
|
147
|
-
|
148
|
-
"#{update_report_js}</div>"
|
149
|
-
end
|
150
|
-
|
151
|
-
def print_tab_speed_statsitics(passed_scenarios)
|
152
|
-
statistics = TurnipFormatter::Template::Tab::SpeedStatistics.new(passed_scenarios)
|
153
|
-
<<-EOS
|
154
|
-
<div id="speed-statistics">
|
155
|
-
<em>Ranking of running time of each <strong>successfully</strong> scenario:</em>
|
156
|
-
#{statistics.build}
|
157
|
-
</div>
|
158
|
-
EOS
|
159
|
-
end
|
160
|
-
|
161
|
-
def print_tab_feature_statsitics(scenarios)
|
162
|
-
statistics = TurnipFormatter::Template::Tab::FeatureStatistics.new(scenarios)
|
163
|
-
<<-EOS
|
164
|
-
<div id="feature-statistics">
|
165
|
-
<em>The results for the feature:</em>
|
166
|
-
#{statistics.build}
|
167
|
-
</div>
|
168
|
-
EOS
|
169
|
-
end
|
170
|
-
|
171
|
-
def print_tab_tag_statsitics(scenarios)
|
172
|
-
statistics = TurnipFormatter::Template::Tab::TagStatistics.new(scenarios)
|
173
|
-
<<-EOS
|
174
|
-
<div id="tag-statistics">
|
175
|
-
<em>The results for the tab:</em>
|
176
|
-
#{statistics.build}
|
177
|
-
</div>
|
178
|
-
EOS
|
179
|
-
end
|
180
|
-
|
181
|
-
def print_footer
|
182
|
-
<<-EOS
|
183
|
-
</div>
|
184
|
-
<footer>
|
185
|
-
<p>Generated by <a href="https://rubygems.org/gems/turnip_formatter">turnip_formatter</a> #{TurnipFormatter::VERSION}</p>
|
186
|
-
<p>Powered by <a href="http://jquery.com/">jQuery</a> 1.9.1, <a href="http://jqueryui.com/">jQuery UI</a> 1.10.2 and <a href="http://mottie.github.io/tablesorter/">tablesorter</a> 2.9.1</p>
|
187
|
-
</footer>
|
188
|
-
</body>
|
189
|
-
</html>
|
190
|
-
EOS
|
191
|
-
end
|
192
|
-
|
193
|
-
def print_scenario(scenario)
|
194
|
-
render_template(:scenario, { scenario: scenario })
|
195
|
-
end
|
196
|
-
|
197
|
-
def print_runtime_error(example, exception)
|
198
|
-
exception.set_backtrace(format_backtrace(exception.backtrace))
|
199
|
-
render_template(:exception, { example: example, exception: exception })
|
200
|
-
end
|
201
|
-
|
202
|
-
def print_exception_backtrace(e)
|
203
|
-
render_template(:exception_backtrace, { backtrace: e.backtrace })
|
204
|
-
end
|
205
|
-
|
206
|
-
def print_scenario_tags(scenario)
|
207
|
-
if scenario.tags.empty?
|
208
|
-
''
|
209
|
-
else
|
210
|
-
render_template(:scenario_tags, { tags: scenario.tags })
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
def print_step_extra_args(extra_args)
|
215
|
-
extra_args.map do |arg|
|
216
|
-
if arg.instance_of?(Turnip::Table)
|
217
|
-
print_step_outline(arg)
|
218
|
-
else
|
219
|
-
print_step_multiline(arg)
|
220
|
-
end
|
221
|
-
end.join("\n")
|
222
|
-
end
|
223
|
-
|
224
|
-
def print_step_outline(table)
|
225
|
-
render_template(:step_outline, { table: table.to_a })
|
226
|
-
end
|
227
|
-
|
228
|
-
def print_step_multiline(lines)
|
229
|
-
render_template(:step_multiline, { lines: lines })
|
230
|
-
end
|
231
|
-
|
232
|
-
def print_section_report
|
233
|
-
render_template(:section_report)
|
234
|
-
end
|
235
|
-
|
236
|
-
private
|
237
|
-
|
238
|
-
def step_attr(step)
|
239
|
-
attr = 'step'
|
240
|
-
attr += " #{step.status}" if step.attention?
|
241
|
-
"class=\"#{h(attr)}\""
|
242
|
-
end
|
243
|
-
|
244
|
-
def step_args(step)
|
245
|
-
output = []
|
246
|
-
|
247
|
-
step.docs.each do |style, template|
|
248
|
-
if style == :extra_args
|
249
|
-
output << print_step_extra_args(template[:value])
|
250
|
-
else
|
251
|
-
output << template[:klass].build(template[:value])
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
output.join("\n")
|
256
|
-
end
|
257
|
-
|
258
|
-
#
|
259
|
-
# @example
|
260
|
-
# render_template(:main, { name: 'user' })
|
261
|
-
# # => ERB.new('/path/to/main.erb') render { name: 'user' }
|
262
|
-
#
|
263
|
-
def render_template(name, params = {})
|
264
|
-
render_template_list(name).result(template_params_binding(params))
|
265
|
-
end
|
266
|
-
|
267
|
-
def render_template_list(name)
|
268
|
-
if templates[name].nil?
|
269
|
-
path = File.dirname(__FILE__) + "/template/#{name.to_s}.erb"
|
270
|
-
templates[name] = ERB.new(File.read(path))
|
42
|
+
def scss_option
|
43
|
+
{ syntax: :scss, style: :compressed }
|
271
44
|
end
|
272
|
-
|
273
|
-
templates[name]
|
274
|
-
end
|
275
|
-
|
276
|
-
def template_params_binding(params)
|
277
|
-
code = params.keys.map { |k| "#{k} = params[#{k.inspect}];" }.join
|
278
|
-
eval(code + ";binding")
|
279
|
-
end
|
280
|
-
|
281
|
-
def templates
|
282
|
-
@templates ||= {}
|
283
45
|
end
|
284
46
|
end
|
285
47
|
end
|
48
|
+
|
49
|
+
(File.dirname(__FILE__) + '/template').tap do |dirname|
|
50
|
+
TurnipFormatter::Template.add_scss_file(dirname + '/turnip_formatter.scss')
|
51
|
+
TurnipFormatter::Template.add_js_file(dirname + '/turnip_formatter.js')
|
52
|
+
end
|
data/lib/turnip_formatter.rb
CHANGED
@@ -9,7 +9,7 @@ module TurnipFormatter
|
|
9
9
|
require 'turnip_formatter/step_template'
|
10
10
|
require 'turnip_formatter/ext/turnip/rspec'
|
11
11
|
require 'turnip_formatter/ext/turnip/builder'
|
12
|
+
require 'turnip_formatter/printer/index'
|
12
13
|
end
|
13
14
|
|
14
15
|
RSpecTurnipFormatter = RSpec::Core::Formatters::TurnipFormatter
|
15
|
-
|
@@ -10,29 +10,17 @@ module RSpec::Core::Formatters
|
|
10
10
|
let(:output) { StringIO.new }
|
11
11
|
let(:formatter) { TurnipFormatter.new(output) }
|
12
12
|
|
13
|
-
describe '#start' do
|
14
|
-
it 'should be output header section' do
|
15
|
-
formatter.start(0)
|
16
|
-
expect(output.string).to match '<!DOCTYPE html>'
|
17
|
-
expect(output.string).to match '<div id="main" role="main">'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
13
|
describe '#example_passed' do
|
22
14
|
before do
|
23
15
|
scenario.example('passed', metadata) { expect(true).to be_true }
|
24
16
|
feature.run(formatter)
|
25
17
|
end
|
26
18
|
|
27
|
-
it 'should be output passed scenario section' do
|
28
|
-
string = output.string
|
29
|
-
expect(string).to match 'class="scenario passed"'
|
30
|
-
end
|
31
|
-
|
32
19
|
it 'should get passed scenario count' do
|
33
20
|
expect(formatter.passed_scenarios).to have(1).elements
|
34
21
|
expect(formatter.failed_scenarios).to have(0).elements
|
35
22
|
expect(formatter.pending_scenarios).to have(0).elements
|
23
|
+
expect(formatter.scenarios).to have(1).elements
|
36
24
|
end
|
37
25
|
end
|
38
26
|
|
@@ -49,14 +37,11 @@ module RSpec::Core::Formatters
|
|
49
37
|
feature.run(formatter)
|
50
38
|
end
|
51
39
|
|
52
|
-
it 'should be output failed scenario section' do
|
53
|
-
expect(output.string).to match 'class="scenario failed"'
|
54
|
-
end
|
55
|
-
|
56
40
|
it 'should get failed scenario count' do
|
57
41
|
expect(formatter.passed_scenarios).to have(0).elements
|
58
42
|
expect(formatter.failed_scenarios).to have(1).elements
|
59
43
|
expect(formatter.pending_scenarios).to have(0).elements
|
44
|
+
expect(formatter.scenarios).to have(1).elements
|
60
45
|
end
|
61
46
|
end
|
62
47
|
|
@@ -68,27 +53,25 @@ module RSpec::Core::Formatters
|
|
68
53
|
feature.run(formatter)
|
69
54
|
end
|
70
55
|
|
71
|
-
it 'should be output pending scenario section' do
|
72
|
-
expect(output.string).to match 'class="scenario pending"'
|
73
|
-
end
|
74
|
-
|
75
56
|
it 'should get pending scenario count' do
|
76
57
|
expect(formatter.passed_scenarios).to have(0).elements
|
77
58
|
expect(formatter.failed_scenarios).to have(0).elements
|
78
59
|
expect(formatter.pending_scenarios).to have(1).elements
|
60
|
+
expect(formatter.scenarios).to have(1).elements
|
79
61
|
end
|
80
62
|
end
|
81
63
|
|
82
64
|
describe '#dump_summary' do
|
83
|
-
|
65
|
+
before do
|
84
66
|
formatter.dump_summary(0.0, 3, 2, 1)
|
85
|
-
|
67
|
+
end
|
68
|
+
|
69
|
+
subject { output.string }
|
86
70
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
expect(actual).to match '</html>'
|
71
|
+
it 'should be output summary section' do
|
72
|
+
should include '(<span id="failed_count">2</span> failed'
|
73
|
+
should include '<span id="pending_count">1</span> pending)'
|
74
|
+
should include '<span id="total_time">0.0</span>'
|
92
75
|
end
|
93
76
|
end
|
94
77
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'turnip_formatter/printer/scenario'
|
3
|
+
|
4
|
+
module TurnipFormatter::Printer
|
5
|
+
describe Scenario do
|
6
|
+
include_context 'turnip_formatter scenario setup'
|
7
|
+
include_context 'turnip_formatter standard scenario metadata'
|
8
|
+
|
9
|
+
let(:scenario) do
|
10
|
+
TurnipFormatter::Scenario::Pass.new(example)
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'turnip example' do
|
14
|
+
describe '.print_out' do
|
15
|
+
subject { Scenario.print_out(scenario) }
|
16
|
+
|
17
|
+
it { should include "<a href=\"##{scenario.id}\">" } # scenario.id
|
18
|
+
it { should include 'Scenario: Scenario' } # h(scenario.name)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'not turnip example' do
|
23
|
+
describe '.print_out' do
|
24
|
+
before do
|
25
|
+
scenario.stub(:validation) { raise NoFeatureFileError }
|
26
|
+
RuntimeError.should_receive(:print_out)
|
27
|
+
end
|
28
|
+
|
29
|
+
it { Scenario.print_out(scenario) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'turnip_formatter/printer/step_extra_args'
|
3
|
+
|
4
|
+
module TurnipFormatter::Printer
|
5
|
+
describe StepExtraArgs do
|
6
|
+
context 'Turnip::Table' do
|
7
|
+
describe '.print_out' do
|
8
|
+
let(:string) do
|
9
|
+
::Turnip::Table.new([
|
10
|
+
["State", "Money"],
|
11
|
+
["<Tokushima>", "555"],
|
12
|
+
["<Okinawa>", "368"]
|
13
|
+
])
|
14
|
+
end
|
15
|
+
|
16
|
+
subject { StepExtraArgs.print_out([string]) }
|
17
|
+
|
18
|
+
it { should match %r{<td>State</td>[[:space:]]+<td>Money</td>} }
|
19
|
+
it { should match %r{<td><Tokushima></td>[[:space:]]+<td>555</td>} }
|
20
|
+
it { should match %r{<td><Okinawa></td>[[:space:]]+<td>368</td>} }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'String' do
|
25
|
+
describe '.print_out' do
|
26
|
+
let(:string) { 'a<a>a' }
|
27
|
+
subject { StepExtraArgs.print_out([string]) }
|
28
|
+
it { should include '<pre class="multiline">a<a>a</pre>' }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'turnip_formatter/printer/step'
|
3
|
+
|
4
|
+
module TurnipFormatter::Printer
|
5
|
+
describe Step do
|
6
|
+
let(:exception_style) { ::TurnipFormatter::StepTemplate::Exception }
|
7
|
+
let(:source_style) { ::TurnipFormatter::StepTemplate::Source }
|
8
|
+
|
9
|
+
subject { Step.print_out(step) }
|
10
|
+
|
11
|
+
context 'Step has arguments' do
|
12
|
+
let(:table) { Turnip::Table.new [] }
|
13
|
+
|
14
|
+
context 'original template' do
|
15
|
+
describe '#step_args' do
|
16
|
+
let(:step) do
|
17
|
+
docs = {}
|
18
|
+
docs[:extra_args] = { klass: nil, value: ['a', table] }
|
19
|
+
docs[source_style] = { klass: source_style, value: 'b' }
|
20
|
+
docs[exception_style] = { klass: exception_style, value: 'c' }
|
21
|
+
|
22
|
+
double(status: '', name: 'step', docs: docs)
|
23
|
+
end
|
24
|
+
|
25
|
+
before do
|
26
|
+
StepExtraArgs.should_receive(:print_out).with(['a', table]).and_return('extra_args')
|
27
|
+
source_style.should_receive(:build).with('b').and_return('source')
|
28
|
+
exception_style.should_receive(:build).with('c').and_return('exception')
|
29
|
+
end
|
30
|
+
|
31
|
+
it { should include "<div class=\"args\">extra_args\nsource\nexception</div>" }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'custom template' do
|
36
|
+
describe '#step_args' do
|
37
|
+
let(:custom_template_1) do
|
38
|
+
Module.new do
|
39
|
+
def self.build(value)
|
40
|
+
"<html>#{value}</html>"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
let(:custom_template_2) do
|
46
|
+
Module.new do
|
47
|
+
def self.build(value)
|
48
|
+
"<strong>#{value}</strong>"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
let(:step) do
|
54
|
+
docs = {
|
55
|
+
source: { klass: custom_template_1, value: 'aiueo' },
|
56
|
+
exception: { klass: custom_template_2, value: '12345' }
|
57
|
+
}
|
58
|
+
|
59
|
+
double(status: '', name: 'step', docs: docs)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should call corresponding method in step' do
|
63
|
+
should include "<div class=\"args\"><html>aiueo</html>\n<strong>12345</strong></div>"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'Step has no argument' do
|
70
|
+
describe '#step_args' do
|
71
|
+
let(:step) do
|
72
|
+
double(status: '', name: 'step', docs: [])
|
73
|
+
end
|
74
|
+
|
75
|
+
before do
|
76
|
+
StepExtraArgs.should_not_receive(:print_out)
|
77
|
+
source_style.should_not_receive(:build)
|
78
|
+
exception_style.should_not_receive(:build)
|
79
|
+
end
|
80
|
+
|
81
|
+
it { should include '<div class="args"></div>' }
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'turnip_formatter/printer/tab_feature_statistics'
|
3
|
+
|
4
|
+
module TurnipFormatter::Printer
|
5
|
+
describe TabFeatureStatistics do
|
6
|
+
include_context 'turnip_formatter scenario setup'
|
7
|
+
include_context 'turnip_formatter standard scenario metadata'
|
8
|
+
|
9
|
+
let :base_scenario do
|
10
|
+
TurnipFormatter::Scenario::Pass.new(example)
|
11
|
+
end
|
12
|
+
|
13
|
+
let :statistics do
|
14
|
+
TurnipFormatter::Printer::TabFeatureStatistics
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'feature only passed scenario' do
|
18
|
+
let :scenarios do
|
19
|
+
# Feature: Hago (passed:2 failed:0, pending:0)
|
20
|
+
['passed', 'passed'].map do |status|
|
21
|
+
scenario = base_scenario.dup
|
22
|
+
scenario.stub(:status).and_return(status)
|
23
|
+
scenario
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '.feature_analysis' do
|
28
|
+
it 'should get passed feature information' do
|
29
|
+
info = statistics.send(:feature_analysis, 'Hoge', scenarios)
|
30
|
+
expect(info.name).to eq 'Hoge'
|
31
|
+
expect(info.passed).to eq 2
|
32
|
+
expect(info.failed).to be_zero
|
33
|
+
expect(info.pending).to be_zero
|
34
|
+
expect(info.status).to eq 'passed'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'feature with failed scenario' do
|
40
|
+
let :scenarios do
|
41
|
+
# Feature: Hoge (passed:1 failed:2, pending:0)
|
42
|
+
['passed', 'failed', 'failed'].map do |status|
|
43
|
+
scenario = base_scenario.dup
|
44
|
+
scenario.stub(:status).and_return(status)
|
45
|
+
scenario
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '.feature_analysis' do
|
50
|
+
it 'should get failed feature information' do
|
51
|
+
info = statistics.send(:feature_analysis, 'Fuga', scenarios)
|
52
|
+
expect(info.name).to eq 'Fuga'
|
53
|
+
expect(info.passed).to eq 1
|
54
|
+
expect(info.failed).to eq 2
|
55
|
+
expect(info.pending).to be_zero
|
56
|
+
expect(info.status).to eq 'failed'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'feature with pending scenario' do
|
62
|
+
let :scenarios do
|
63
|
+
# Feature: Fuga (passed:1 failed:0, pending:1)
|
64
|
+
['passed', 'pending'].map do |status|
|
65
|
+
scenario = base_scenario.dup
|
66
|
+
scenario.stub(:status).and_return(status)
|
67
|
+
scenario
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '.feature_analysis' do
|
72
|
+
it 'should get pending feature information' do
|
73
|
+
info = statistics.send(:feature_analysis, 'Hago', scenarios)
|
74
|
+
expect(info.name).to eq 'Hago'
|
75
|
+
expect(info.passed).to eq 1
|
76
|
+
expect(info.failed).to be_zero
|
77
|
+
expect(info.pending).to eq 1
|
78
|
+
expect(info.status).to eq 'pending'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|