turnip_formatter 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/turnip_formatter/ext/turnip/rspec.rb +10 -11
- data/lib/turnip_formatter/scenario/failure.rb +3 -13
- data/lib/turnip_formatter/scenario/pending.rb +8 -5
- data/lib/turnip_formatter/scenario.rb +33 -22
- data/lib/turnip_formatter/step/dsl.rb +18 -0
- data/lib/turnip_formatter/step/failure.rb +15 -9
- data/lib/turnip_formatter/step/pending.rb +13 -8
- data/lib/turnip_formatter/step.rb +29 -7
- data/lib/turnip_formatter/template/step_exception.rb +28 -0
- data/lib/turnip_formatter/template/step_multiline.rb +11 -0
- data/lib/turnip_formatter/template/step_outline.rb +27 -0
- data/lib/turnip_formatter/template/step_source.rb +12 -0
- data/lib/turnip_formatter/template.rb +19 -56
- data/lib/turnip_formatter/version.rb +1 -1
- data/spec/examples/README.md +3 -1
- data/spec/examples/images/background.png +0 -0
- data/spec/examples/images/basic_step.png +0 -0
- data/spec/examples/images/failed_step.png +0 -0
- data/spec/examples/images/multiline.png +0 -0
- data/spec/examples/images/outline.png +0 -0
- data/spec/examples/images/pending_step.png +0 -0
- data/spec/examples/images/tag_step.png +0 -0
- data/spec/rspec/core/formatters/turnip_formatter_spec.rb +18 -17
- data/spec/support/shared_context_examples.rb +10 -1
- data/spec/turnip_formatter/scenario/pass_spec.rb +5 -19
- data/spec/turnip_formatter/step/failure_spec.rb +14 -26
- data/spec/turnip_formatter/step/pending_spec.rb +12 -13
- data/spec/turnip_formatter/step_spec.rb +4 -11
- data/spec/turnip_formatter/template/step_exception_spec.rb +24 -0
- data/spec/turnip_formatter/template/step_multiline_spec.rb +16 -0
- data/spec/turnip_formatter/template/step_outline_spec.rb +29 -0
- data/spec/turnip_formatter/template/step_source_spec.rb +19 -0
- data/spec/turnip_formatter/template_spec.rb +21 -60
- metadata +21 -6
- data/spec/examples/images/pending_and_tagged_step.png +0 -0
@@ -17,21 +17,20 @@ module Turnip
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def initialize_scenario_metadata
|
20
|
-
example.metadata[:
|
21
|
-
descriptions: [],
|
22
|
-
docstrings: [],
|
23
|
-
keywords: [],
|
24
|
-
tags: [],
|
25
|
-
}
|
20
|
+
example.metadata[:turnip] = { steps: [] }
|
26
21
|
end
|
27
22
|
|
28
23
|
def push_scenario_metadata(scenario)
|
29
24
|
steps = scenario.steps
|
30
|
-
example.metadata[:
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
25
|
+
example.metadata[:turnip].tap do |turnip|
|
26
|
+
steps.each do |step|
|
27
|
+
turnip[:steps] << {
|
28
|
+
name: step.description,
|
29
|
+
extra_args: step.extra_args,
|
30
|
+
keyword: step.keyword
|
31
|
+
}
|
32
|
+
end
|
33
|
+
turnip[:tags] = scenario.tags if scenario.respond_to?(:tags)
|
35
34
|
end
|
36
35
|
end
|
37
36
|
end
|
@@ -11,19 +11,15 @@ module TurnipFormatter
|
|
11
11
|
|
12
12
|
class Failure
|
13
13
|
include TurnipFormatter::Scenario
|
14
|
-
include RSpec::Core::BacktraceFormatter
|
15
14
|
|
16
15
|
def steps
|
17
16
|
steps = super
|
18
|
-
steps[offending_line].
|
19
|
-
step.extend TurnipFormatter::Step::Failure
|
20
|
-
step.attention(exception, backtrace)
|
21
|
-
end
|
17
|
+
steps[offending_line].extend TurnipFormatter::Step::Failure
|
22
18
|
steps
|
23
19
|
end
|
24
20
|
|
25
21
|
def validation
|
26
|
-
raise NotFailedScenarioError if
|
22
|
+
raise NotFailedScenarioError if status != 'failed'
|
27
23
|
offending_line
|
28
24
|
super
|
29
25
|
end
|
@@ -31,17 +27,11 @@ module TurnipFormatter
|
|
31
27
|
private
|
32
28
|
|
33
29
|
def offending_line
|
34
|
-
unless backtrace.last =~ /:in step:(?<stepno>\d+) `/
|
30
|
+
unless example.exception.backtrace.last =~ /:in step:(?<stepno>\d+) `/
|
35
31
|
raise NoExistFailedStepInformationError
|
36
32
|
end
|
37
33
|
$~[:stepno].to_i
|
38
34
|
end
|
39
|
-
|
40
|
-
def backtrace
|
41
|
-
@backtrace ||= format_backtrace(exception.backtrace, scenario.metadata).map do |b|
|
42
|
-
backtrace_line(b)
|
43
|
-
end.compact
|
44
|
-
end
|
45
35
|
end
|
46
36
|
end
|
47
37
|
end
|
@@ -13,10 +13,7 @@ module TurnipFormatter
|
|
13
13
|
|
14
14
|
def steps
|
15
15
|
steps = super
|
16
|
-
steps[offending_line].
|
17
|
-
step.extend TurnipFormatter::Step::Pending
|
18
|
-
step.attention(pending_message, scenario.location)
|
19
|
-
end
|
16
|
+
steps[offending_line].extend TurnipFormatter::Step::Pending
|
20
17
|
steps
|
21
18
|
end
|
22
19
|
|
@@ -29,9 +26,15 @@ module TurnipFormatter
|
|
29
26
|
private
|
30
27
|
|
31
28
|
def offending_line
|
32
|
-
|
29
|
+
unless pending_message =~ /^No such step\((?<stepno>\d+)\): /
|
30
|
+
raise NoExistPendingStepInformationError
|
31
|
+
end
|
33
32
|
$~[:stepno].to_i
|
34
33
|
end
|
34
|
+
|
35
|
+
def pending_message
|
36
|
+
example.execution_result[:pending_message]
|
37
|
+
end
|
35
38
|
end
|
36
39
|
end
|
37
40
|
end
|
@@ -4,6 +4,8 @@ require 'turnip_formatter/step'
|
|
4
4
|
|
5
5
|
module TurnipFormatter
|
6
6
|
module Scenario
|
7
|
+
include RSpec::Core::BacktraceFormatter
|
8
|
+
|
7
9
|
class NotExistStepsInformationError < ::StandardError; end
|
8
10
|
class NoFeatureFileError < ::StandardError; end
|
9
11
|
|
@@ -11,53 +13,62 @@ module TurnipFormatter
|
|
11
13
|
# @param [RSpec::Core::Example] example
|
12
14
|
#
|
13
15
|
def initialize(example)
|
14
|
-
@
|
16
|
+
@example = example
|
17
|
+
clean_backtrace
|
15
18
|
end
|
16
19
|
|
17
20
|
def validation
|
18
|
-
raise NotExistStepsInformationError unless
|
21
|
+
raise NotExistStepsInformationError unless example.metadata.member?(:turnip)
|
19
22
|
raise NoFeatureFileError unless feature_file_path.end_with?('.feature')
|
20
23
|
end
|
21
24
|
|
22
25
|
def steps
|
23
|
-
descriptions.map
|
24
|
-
|
25
|
-
|
26
|
-
def method_missing(name, *args, &block)
|
27
|
-
if scenario.execution_result.member?(name.to_sym)
|
28
|
-
scenario.execution_result[name.to_sym]
|
29
|
-
else
|
30
|
-
super
|
26
|
+
@steps ||= descriptions.map do |desc|
|
27
|
+
TurnipFormatter::Step.new(example, desc)
|
31
28
|
end
|
32
29
|
end
|
33
|
-
|
30
|
+
|
31
|
+
#
|
32
|
+
# @return [String] scenario name
|
33
|
+
#
|
34
34
|
def name
|
35
|
-
|
35
|
+
example.example_group.description
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# @return [String] scenario status ('passed', 'failed' or 'pending')
|
40
|
+
#
|
41
|
+
def status
|
42
|
+
example.execution_result[:status]
|
36
43
|
end
|
37
44
|
|
38
45
|
def feature_name
|
39
|
-
|
46
|
+
example.example_group.metadata[:example_group][:example_group][:description]
|
40
47
|
end
|
41
48
|
|
42
49
|
def feature_file_path
|
43
|
-
|
50
|
+
example.metadata[:file_path]
|
44
51
|
end
|
45
52
|
|
46
53
|
def tags
|
47
|
-
|
54
|
+
example.metadata[:turnip][:tags]
|
55
|
+
end
|
56
|
+
|
57
|
+
def example
|
58
|
+
@example
|
48
59
|
end
|
49
60
|
|
50
61
|
private
|
51
62
|
|
52
|
-
def
|
53
|
-
|
63
|
+
def descriptions
|
64
|
+
example.metadata[:turnip][:steps]
|
54
65
|
end
|
55
66
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
67
|
+
def clean_backtrace
|
68
|
+
return if example.exception.nil?
|
69
|
+
formatted = format_backtrace(example.exception.backtrace, example.metadata)
|
70
|
+
new_backtrace = formatted.map { |b| backtrace_line(b) }.compact
|
71
|
+
example.exception.set_backtrace(new_backtrace)
|
61
72
|
end
|
62
73
|
end
|
63
74
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module TurnipFormatter
|
2
|
+
class Step
|
3
|
+
module DSL
|
4
|
+
#
|
5
|
+
# @param [TurnipFormatter::Step] step
|
6
|
+
#
|
7
|
+
def extended(step)
|
8
|
+
::TurnipFormatter::Step.templates[status].each do |style, block|
|
9
|
+
step.docs[style] = step.instance_eval(&block)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_template(style, &block)
|
14
|
+
::TurnipFormatter::Step.add_template(status, style, &block)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -1,21 +1,27 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
require 'turnip_formatter/step'
|
3
|
+
require 'turnip_formatter/step/dsl'
|
2
4
|
|
3
5
|
module TurnipFormatter
|
4
6
|
class Step
|
5
7
|
module Failure
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def attention(exception, backtrace)
|
11
|
-
exception.set_backtrace(backtrace)
|
12
|
-
docs[:source] = backtrace.first
|
13
|
-
docs[:exception] = exception
|
8
|
+
extend DSL
|
9
|
+
|
10
|
+
def self.status
|
11
|
+
:failure
|
14
12
|
end
|
15
13
|
|
16
14
|
def status
|
17
|
-
|
15
|
+
Failure.status
|
18
16
|
end
|
19
17
|
end
|
20
18
|
end
|
21
19
|
end
|
20
|
+
|
21
|
+
TurnipFormatter::Step::Failure.add_template :source do
|
22
|
+
example.exception.backtrace.first
|
23
|
+
end
|
24
|
+
|
25
|
+
TurnipFormatter::Step::Failure.add_template :exception do
|
26
|
+
example.exception
|
27
|
+
end
|
@@ -1,21 +1,26 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
require 'turnip_formatter/step'
|
3
|
+
require 'turnip_formatter/step/dsl'
|
2
4
|
|
3
5
|
module TurnipFormatter
|
4
6
|
class Step
|
5
7
|
module Pending
|
6
|
-
|
7
|
-
true
|
8
|
-
end
|
8
|
+
extend DSL
|
9
9
|
|
10
|
-
def
|
11
|
-
|
12
|
-
exception.set_backtrace(location)
|
13
|
-
docs[:exception] = exception
|
10
|
+
def self.status
|
11
|
+
:pending
|
14
12
|
end
|
15
13
|
|
16
14
|
def status
|
17
|
-
|
15
|
+
Pending.status
|
18
16
|
end
|
19
17
|
end
|
20
18
|
end
|
21
19
|
end
|
20
|
+
|
21
|
+
TurnipFormatter::Step::Pending.add_template :exception do
|
22
|
+
message = example.execution_result[:pending_message]
|
23
|
+
exception = RSpec::Core::Pending::PendingDeclaredInExample.new(message)
|
24
|
+
exception.set_backtrace(example.location)
|
25
|
+
exception
|
26
|
+
end
|
@@ -2,17 +2,39 @@
|
|
2
2
|
|
3
3
|
module TurnipFormatter
|
4
4
|
class Step
|
5
|
-
attr_reader :name, :docs
|
5
|
+
attr_reader :name, :docs, :example
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
class << self
|
8
|
+
def templates
|
9
|
+
@templates ||= {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_template(status, style, &block)
|
13
|
+
templates[status] ||= {}
|
14
|
+
templates[status][style] = block
|
15
|
+
end
|
16
|
+
|
17
|
+
def status
|
18
|
+
''
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
# @param [RSpec::Core::Example] example
|
24
|
+
# @param [Hash] description
|
25
|
+
#
|
26
|
+
def initialize(example, description)
|
27
|
+
@example = example
|
28
|
+
@name = description[:keyword] + description[:name]
|
29
|
+
@docs = { extra_args: description[:extra_args] }
|
12
30
|
end
|
13
31
|
|
14
32
|
def attention?
|
15
|
-
|
33
|
+
!status.empty?
|
34
|
+
end
|
35
|
+
|
36
|
+
def status
|
37
|
+
self.class.status
|
16
38
|
end
|
17
39
|
end
|
18
40
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module TurnipFormatter
|
4
|
+
class Template
|
5
|
+
module StepException
|
6
|
+
def self.build(exception)
|
7
|
+
template_step_exception.result(binding)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def self.template_step_exception
|
13
|
+
@template_step_exception ||= ERB.new(<<-EOS)
|
14
|
+
<div class="step_exception">
|
15
|
+
<span>Failure:</span>
|
16
|
+
<pre><%= ERB::Util.h(exception.to_s) %></pre>
|
17
|
+
<span>Backtrace:</span>
|
18
|
+
<ol>
|
19
|
+
<% exception.backtrace.each do |line| %>
|
20
|
+
<li><%= ERB::Util.h(line) %></li>
|
21
|
+
<% end %>
|
22
|
+
</ol>
|
23
|
+
</div>
|
24
|
+
EOS
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module TurnipFormatter
|
4
|
+
class Template
|
5
|
+
module StepOutline
|
6
|
+
def self.build(table)
|
7
|
+
template_step_outline.result(binding)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def self.template_step_outline
|
13
|
+
@template_step_outline ||= ERB.new(<<-EOS)
|
14
|
+
<table class="step_outline">
|
15
|
+
<% table.each do |tr| %>
|
16
|
+
<tr>
|
17
|
+
<% tr.each do |td| %>
|
18
|
+
<td><%= ERB::Util.h(td) %></td>
|
19
|
+
<% end %>
|
20
|
+
</tr>
|
21
|
+
<% end %>
|
22
|
+
</table>
|
23
|
+
EOS
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module TurnipFormatter
|
4
|
+
class Template
|
5
|
+
module StepSource
|
6
|
+
def self.build(location)
|
7
|
+
@snippet_extractor ||= ::RSpec::Core::Formatters::SnippetExtractor.new
|
8
|
+
'<pre class="source"><code class="ruby">' + @snippet_extractor.snippet([location]) + '</code></pre>'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -8,6 +8,11 @@ module TurnipFormatter
|
|
8
8
|
include ERB::Util
|
9
9
|
include RSpec::Core::BacktraceFormatter
|
10
10
|
|
11
|
+
autoload :StepOutline, 'turnip_formatter/template/step_outline'
|
12
|
+
autoload :StepMultiline, 'turnip_formatter/template/step_multiline'
|
13
|
+
autoload :StepSource, 'turnip_formatter/template/step_source'
|
14
|
+
autoload :StepException, 'turnip_formatter/template/step_exception'
|
15
|
+
|
11
16
|
def print_header
|
12
17
|
<<-EOS
|
13
18
|
<!DOCTYPE html>
|
@@ -59,7 +64,6 @@ module TurnipFormatter
|
|
59
64
|
end
|
60
65
|
|
61
66
|
def print_runtime_error(example, exception)
|
62
|
-
|
63
67
|
if example.exception
|
64
68
|
example_backtrace = format_backtrace(example.exception.backtrace[0..14], example.metadata).map do |l|
|
65
69
|
RSpec::Core::Metadata::relative_path(l)
|
@@ -89,38 +93,26 @@ module TurnipFormatter
|
|
89
93
|
end
|
90
94
|
|
91
95
|
def step_args(step)
|
92
|
-
|
93
|
-
[:extra_args, :source, :exception].each do |k|
|
94
|
-
args << send("step_#{k}", step.docs[k]) unless step.docs[k].nil?
|
95
|
-
end
|
96
|
-
args.join("\n")
|
97
|
-
end
|
96
|
+
output = []
|
98
97
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
step_outline(arg)
|
98
|
+
step.docs.each do |style, value|
|
99
|
+
if style == :extra_args
|
100
|
+
output << step_extra_args(value)
|
103
101
|
else
|
104
|
-
|
102
|
+
# call StepException, StepSource, etc...
|
103
|
+
klass = ['step', style.to_s].map(&:capitalize).join
|
104
|
+
output << self.class.const_get(klass).build(value)
|
105
105
|
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def step_outline(table)
|
110
|
-
template_step_outline.result(binding)
|
111
|
-
end
|
112
|
-
|
113
|
-
def step_multiline(lines)
|
114
|
-
'<pre class="multiline">' + h(lines) + '</pre>'
|
115
|
-
end
|
106
|
+
end
|
116
107
|
|
117
|
-
|
118
|
-
@snippet_extractor ||= ::RSpec::Core::Formatters::SnippetExtractor.new
|
119
|
-
'<pre class="source"><code class="ruby">' + @snippet_extractor.snippet([location]) + '</code></pre>'
|
108
|
+
output.join("\n")
|
120
109
|
end
|
121
110
|
|
122
|
-
def
|
123
|
-
|
111
|
+
def step_extra_args(extra_args)
|
112
|
+
extra_args.map do |arg|
|
113
|
+
klass = arg.instance_of?(Turnip::Table) ? StepOutline : StepMultiline
|
114
|
+
klass.build(arg)
|
115
|
+
end.join("\n")
|
124
116
|
end
|
125
117
|
|
126
118
|
def report_area
|
@@ -177,35 +169,6 @@ module TurnipFormatter
|
|
177
169
|
EOS
|
178
170
|
end
|
179
171
|
|
180
|
-
def template_step_outline
|
181
|
-
@template_step_outline ||= ERB.new(<<-EOS)
|
182
|
-
<table class="step_outline">
|
183
|
-
<% table.each do |tr| %>
|
184
|
-
<tr>
|
185
|
-
<% tr.each do |td| %>
|
186
|
-
<td><%= h(td) %></td>
|
187
|
-
<% end %>
|
188
|
-
</tr>
|
189
|
-
<% end %>
|
190
|
-
</table>
|
191
|
-
EOS
|
192
|
-
end
|
193
|
-
|
194
|
-
def template_step_exception
|
195
|
-
@template_step_exception ||= ERB.new(<<-EOS)
|
196
|
-
<div class="step_exception">
|
197
|
-
<span>Failure:</span>
|
198
|
-
<pre><%= h(exception.to_s) %></pre>
|
199
|
-
<span>Backtrace:</span>
|
200
|
-
<ol>
|
201
|
-
<% exception.backtrace.each do |line| %>
|
202
|
-
<li><%= h(line) %></li>
|
203
|
-
<% end %>
|
204
|
-
</ol>
|
205
|
-
</div>
|
206
|
-
EOS
|
207
|
-
end
|
208
|
-
|
209
172
|
def template_exception
|
210
173
|
@template_exception ||= ERB.new(<<-EOS)
|
211
174
|
<section class="exception">
|
data/spec/examples/README.md
CHANGED
@@ -60,7 +60,9 @@ Scenario: strong monster
|
|
60
60
|
And Fanfare
|
61
61
|
```
|
62
62
|
|
63
|
-
![Pending step](https://github.com/gongo/turnip_formatter/raw/master/spec/examples/images/
|
63
|
+
![Pending step](https://github.com/gongo/turnip_formatter/raw/master/spec/examples/images/pending_step.png)
|
64
|
+
|
65
|
+
![Tag step](https://github.com/gongo/turnip_formatter/raw/master/spec/examples/images/tag_step.png)
|
64
66
|
|
65
67
|
### Background
|
66
68
|
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -3,16 +3,10 @@ require 'stringio'
|
|
3
3
|
|
4
4
|
module RSpec::Core::Formatters
|
5
5
|
describe TurnipFormatter do
|
6
|
+
include_context 'turnip_formatter passed scenario metadata'
|
7
|
+
|
6
8
|
let(:feature) { RSpec::Core::ExampleGroup.describe('Feature') }
|
7
9
|
let(:scenario) { feature.describe('Scenario') }
|
8
|
-
|
9
|
-
let(:scenario_metadata) do
|
10
|
-
{
|
11
|
-
steps: { descriptions: [], docstrings: [[]], keywords: ['When'], tags: [] },
|
12
|
-
file_path: '/path/to/hoge.feature'
|
13
|
-
}
|
14
|
-
end
|
15
|
-
|
16
10
|
let(:output) { StringIO.new }
|
17
11
|
let(:formatter) { TurnipFormatter.new(output) }
|
18
12
|
|
@@ -26,7 +20,7 @@ module RSpec::Core::Formatters
|
|
26
20
|
|
27
21
|
describe '#example_passed' do
|
28
22
|
it 'should be output passed scenario section' do
|
29
|
-
scenario.example('passed',
|
23
|
+
scenario.example('passed', metadata) { expect(true).to be_true }
|
30
24
|
feature.run(formatter)
|
31
25
|
|
32
26
|
string = output.string
|
@@ -36,11 +30,14 @@ module RSpec::Core::Formatters
|
|
36
30
|
|
37
31
|
describe '#example_failed' do
|
38
32
|
let(:failed_metadata) do
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
33
|
+
metadata[:turnip][:steps].tap do |steps|
|
34
|
+
steps << {
|
35
|
+
name: 'this step is error',
|
36
|
+
extra_args: [],
|
37
|
+
keyword: 'Given'
|
38
|
+
}
|
43
39
|
end
|
40
|
+
metadata
|
44
41
|
end
|
45
42
|
|
46
43
|
it 'should be output failed scenario section' do
|
@@ -52,6 +49,7 @@ module RSpec::Core::Formatters
|
|
52
49
|
raise e
|
53
50
|
end
|
54
51
|
end
|
52
|
+
|
55
53
|
feature.run(formatter)
|
56
54
|
expect(output.string).to match 'class="scenario failed"'
|
57
55
|
end
|
@@ -59,11 +57,14 @@ module RSpec::Core::Formatters
|
|
59
57
|
|
60
58
|
describe '#example_pending' do
|
61
59
|
let(:pending_metadata) do
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
60
|
+
metadata[:turnip][:steps].tap do |steps|
|
61
|
+
steps << {
|
62
|
+
name: 'this step is unimplement',
|
63
|
+
extra_args: [],
|
64
|
+
keyword: 'Given'
|
65
|
+
}
|
66
66
|
end
|
67
|
+
metadata
|
67
68
|
end
|
68
69
|
|
69
70
|
it 'should be output pending scenario section' do
|
@@ -10,8 +10,17 @@ end
|
|
10
10
|
shared_context 'turnip_formatter passed scenario metadata' do
|
11
11
|
let(:metadata) do
|
12
12
|
{
|
13
|
-
|
13
|
+
turnip: {
|
14
|
+
steps: [ { name: 'Step 1', extra_args: [], keyword: 'When' } ],
|
15
|
+
tags: []
|
16
|
+
},
|
14
17
|
file_path: '/path/to/hoge.feature'
|
15
18
|
}
|
16
19
|
end
|
17
20
|
end
|
21
|
+
|
22
|
+
shared_context 'turnip_formatter standard step parameters' do
|
23
|
+
let(:description) do
|
24
|
+
{ name: 'StepName', keyword: 'Keyword', extra_args: ['Docstring'] }
|
25
|
+
end
|
26
|
+
end
|
@@ -8,31 +8,18 @@ module TurnipFormatter::Scenario
|
|
8
8
|
expect(true).to be_true
|
9
9
|
}
|
10
10
|
|
11
|
-
|
12
|
-
let(:metadata) do
|
13
|
-
{
|
14
|
-
steps: { descriptions: ['Step 1'], docstrings: [[]], keywords: ['When'], tags: [] },
|
15
|
-
file_path: '/path/to/hoge.feature'
|
16
|
-
}
|
17
|
-
end
|
11
|
+
include_context 'turnip_formatter passed scenario metadata'
|
18
12
|
|
13
|
+
context 'Turnip example' do
|
19
14
|
describe '#validation' do
|
20
15
|
it 'should not raise exception' do
|
21
16
|
expect { scenario.validation }.not_to raise_error
|
22
17
|
end
|
23
18
|
end
|
24
|
-
|
25
19
|
end
|
26
20
|
|
27
21
|
context 'Not Turnip example' do
|
28
22
|
context 'Not passed example' do
|
29
|
-
let(:metadata) do
|
30
|
-
{
|
31
|
-
steps: { descriptions: ['Step 1'], docstrings: [[]], keywords: ['When'], tags: [] },
|
32
|
-
file_path: '/path/to/hoge.feature'
|
33
|
-
}
|
34
|
-
end
|
35
|
-
|
36
23
|
include_context 'turnip_formatter scenario setup', proc {
|
37
24
|
expect(true).to be_false
|
38
25
|
}
|
@@ -46,10 +33,9 @@ module TurnipFormatter::Scenario
|
|
46
33
|
|
47
34
|
context 'not exist feature file' do
|
48
35
|
let(:metadata) do
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
}
|
36
|
+
metadata = super()
|
37
|
+
metadata[:file_path] = '/path/to/hoge.rb'
|
38
|
+
metadata
|
53
39
|
end
|
54
40
|
|
55
41
|
describe '#validation' do
|
@@ -3,38 +3,26 @@ require 'spec_helper'
|
|
3
3
|
module TurnipFormatter
|
4
4
|
class Step
|
5
5
|
describe Failure do
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
include_context 'turnip_formatter standard step parameters'
|
7
|
+
include_context 'turnip_formatter scenario setup', proc {
|
8
|
+
expect(true).to be_false
|
9
|
+
}
|
10
|
+
include_context 'turnip_formatter passed scenario metadata'
|
11
|
+
|
12
|
+
let(:step) do
|
13
|
+
step = ::TurnipFormatter::Step.new(example, description)
|
14
|
+
step.extend TurnipFormatter::Step::Failure
|
15
|
+
step
|
16
|
+
end
|
9
17
|
|
10
18
|
describe '#attention?' do
|
11
|
-
subject {
|
19
|
+
subject { step.attention? }
|
12
20
|
it { should be_true }
|
13
21
|
end
|
14
22
|
|
15
23
|
describe '#status' do
|
16
|
-
subject {
|
17
|
-
it { should eq
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '#attention' do
|
21
|
-
it 'should have been implemented' do
|
22
|
-
expect(step).not_to respond_to(:attention)
|
23
|
-
expect(failure_step).to respond_to(:attention)
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should set exception informaton' do
|
27
|
-
exception = StandardError.new
|
28
|
-
expect(exception.backtrace).to be_nil
|
29
|
-
|
30
|
-
failure_step.attention(exception, ['/path/to/error.rb: 10'])
|
31
|
-
|
32
|
-
expect(failure_step.docs[:source]).to eq '/path/to/error.rb: 10'
|
33
|
-
failure_step.docs[:exception].tap do |e|
|
34
|
-
expect(e).to eql(exception)
|
35
|
-
expect(e.backtrace.first).to eq '/path/to/error.rb: 10'
|
36
|
-
end
|
37
|
-
end
|
24
|
+
subject { step.status }
|
25
|
+
it { should eq :failure }
|
38
26
|
end
|
39
27
|
end
|
40
28
|
end
|
@@ -3,25 +3,24 @@ require 'spec_helper'
|
|
3
3
|
module TurnipFormatter
|
4
4
|
class Step
|
5
5
|
describe Failure do
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
include_context 'turnip_formatter standard step parameters'
|
7
|
+
include_context 'turnip_formatter scenario setup'
|
8
|
+
include_context 'turnip_formatter passed scenario metadata'
|
9
|
+
|
10
|
+
let(:step) do
|
11
|
+
step = ::TurnipFormatter::Step.new(example, description)
|
12
|
+
step.extend TurnipFormatter::Step::Pending
|
13
|
+
step
|
14
|
+
end
|
9
15
|
|
10
16
|
describe '#attention?' do
|
11
|
-
subject {
|
17
|
+
subject { step.attention? }
|
12
18
|
it { should be_true }
|
13
19
|
end
|
14
20
|
|
15
21
|
describe '#status' do
|
16
|
-
subject {
|
17
|
-
it { should eq
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '#attention' do
|
21
|
-
it 'should have been implemented' do
|
22
|
-
expect(step).not_to respond_to(:attention)
|
23
|
-
expect(pending_step).to respond_to(:attention)
|
24
|
-
end
|
22
|
+
subject { step.status }
|
23
|
+
it { should eq :pending }
|
25
24
|
end
|
26
25
|
end
|
27
26
|
end
|
@@ -2,8 +2,10 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module TurnipFormatter
|
4
4
|
describe Step do
|
5
|
-
|
6
|
-
|
5
|
+
include_context 'turnip_formatter standard step parameters'
|
6
|
+
include_context 'turnip_formatter scenario setup'
|
7
|
+
include_context 'turnip_formatter passed scenario metadata'
|
8
|
+
let(:step) { ::TurnipFormatter::Step.new(example, description) }
|
7
9
|
|
8
10
|
describe '#attention?' do
|
9
11
|
subject { step.attention? }
|
@@ -19,14 +21,5 @@ module TurnipFormatter
|
|
19
21
|
subject { step.docs }
|
20
22
|
it { should include :extra_args }
|
21
23
|
end
|
22
|
-
|
23
|
-
context 'No docstring' do
|
24
|
-
let(:description) { ['StepName', 'Keyword', []] }
|
25
|
-
|
26
|
-
describe '#docs' do
|
27
|
-
subject { step.docs }
|
28
|
-
it { should_not include :extra_args }
|
29
|
-
end
|
30
|
-
end
|
31
24
|
end
|
32
25
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'turnip_formatter/template/step_exception'
|
3
|
+
|
4
|
+
module TurnipFormatter
|
5
|
+
class Template
|
6
|
+
describe StepException do
|
7
|
+
let(:template) { ::TurnipFormatter::Template::StepException }
|
8
|
+
let(:exception) do
|
9
|
+
StandardError.new('StepExceptionError').tap do |e|
|
10
|
+
e.set_backtrace('/path/to/error.rb: 10')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.build' do
|
15
|
+
subject { template.build(exception) }
|
16
|
+
it do
|
17
|
+
should match %r{div class="step_exception"}
|
18
|
+
should match %r{<pre>.*#{exception.message}.*</pre>}
|
19
|
+
should match %r{<li>/path/to/error.rb: 10</li>}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'turnip_formatter/template/step_multiline'
|
3
|
+
|
4
|
+
module TurnipFormatter
|
5
|
+
class Template
|
6
|
+
describe StepMultiline do
|
7
|
+
let(:template) { ::TurnipFormatter::Template::StepMultiline }
|
8
|
+
let(:string) { 'a<a>a' }
|
9
|
+
|
10
|
+
describe '.build' do
|
11
|
+
subject { template.build(string) }
|
12
|
+
it { should eq '<pre class="multiline">a<a>a</pre>' }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'turnip/table'
|
3
|
+
require 'turnip_formatter/template/step_outline'
|
4
|
+
|
5
|
+
module TurnipFormatter
|
6
|
+
class Template
|
7
|
+
describe StepOutline do
|
8
|
+
let(:template) { ::TurnipFormatter::Template::StepOutline }
|
9
|
+
|
10
|
+
let(:string) do
|
11
|
+
::Turnip::Table.new([
|
12
|
+
["State", "Money"],
|
13
|
+
["<Tokushima>", "555"],
|
14
|
+
["<Okinawa>", "368"]
|
15
|
+
])
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '.build' do
|
19
|
+
subject { template.build(string) }
|
20
|
+
|
21
|
+
it do
|
22
|
+
should match %r{<td>State</td>[[:space:]]+<td>Money</td>}
|
23
|
+
should match %r{<td><Tokushima></td>[[:space:]]+<td>555</td>}
|
24
|
+
should match %r{<td><Okinawa></td>[[:space:]]+<td>368</td>}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'turnip_formatter/template/step_source'
|
3
|
+
|
4
|
+
module TurnipFormatter
|
5
|
+
class Template
|
6
|
+
describe StepSource do
|
7
|
+
let(:template) { ::TurnipFormatter::Template::StepSource }
|
8
|
+
let(:source) { __FILE__ + ':1' }
|
9
|
+
|
10
|
+
describe '.build' do
|
11
|
+
subject { template.build(source) }
|
12
|
+
it do
|
13
|
+
should match '<pre class="source"><code class="ruby">'
|
14
|
+
should match "require 'turnip_formatter/template/step_source'"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -57,34 +57,29 @@ module TurnipFormatter
|
|
57
57
|
|
58
58
|
context 'Step has arguments' do
|
59
59
|
describe '#step_args' do
|
60
|
-
let(:
|
61
|
-
template.stub(:step_extra_args).and_return('extra_args')
|
62
|
-
template.stub(:step_source).and_return('source')
|
63
|
-
template.stub(:step_exception).and_return('exception')
|
64
|
-
template
|
65
|
-
end
|
60
|
+
let(:table) { Turnip::Table.new [] }
|
66
61
|
|
67
62
|
let(:step) do
|
68
63
|
step = double
|
69
|
-
step.stub(:docs).and_return(
|
64
|
+
step.stub(:docs).and_return(
|
65
|
+
extra_args: ['a', table], source: 'b', exception: 'c'
|
66
|
+
)
|
70
67
|
step
|
71
68
|
end
|
72
69
|
|
73
70
|
it 'should call corresponding method in step' do
|
74
|
-
|
71
|
+
Template::StepMultiline.should_receive(:build).with('a').and_return('extra_args1')
|
72
|
+
Template::StepOutline.should_receive(:build).with(table).and_return('extra_args2')
|
73
|
+
Template::StepSource.should_receive(:build).with('b').and_return('source')
|
74
|
+
Template::StepException.should_receive(:build).with('c').and_return('exception')
|
75
|
+
|
76
|
+
expect(template.send(:step_args, step)).to eq("extra_args1\nextra_args2\nsource\nexception")
|
75
77
|
end
|
76
78
|
end
|
77
79
|
end
|
78
80
|
|
79
81
|
context 'Step has no argument' do
|
80
82
|
describe '#step_args' do
|
81
|
-
let(:template_stub) do
|
82
|
-
template.should_not_receive(:step_extra_args)
|
83
|
-
template.should_not_receive(:step_source)
|
84
|
-
template.should_not_receive(:step_exception)
|
85
|
-
template
|
86
|
-
end
|
87
|
-
|
88
83
|
let(:step) do
|
89
84
|
step = double
|
90
85
|
step.stub(:docs).and_return({})
|
@@ -92,7 +87,12 @@ module TurnipFormatter
|
|
92
87
|
end
|
93
88
|
|
94
89
|
it 'should get null string' do
|
95
|
-
|
90
|
+
Template::StepOutline.should_not_receive(:build)
|
91
|
+
Template::StepMultiline.should_not_receive(:build)
|
92
|
+
Template::StepSource.should_not_receive(:build)
|
93
|
+
Template::StepException.should_not_receive(:build)
|
94
|
+
|
95
|
+
expect(template.send(:step_args, step)).to be_empty
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|
@@ -105,56 +105,17 @@ module TurnipFormatter
|
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
|
-
let(:
|
108
|
+
let(:extra_args) do
|
109
109
|
[::Turnip::Table.new([['a']]), 'b']
|
110
110
|
end
|
111
111
|
|
112
|
-
|
113
|
-
|
112
|
+
before do
|
113
|
+
Template::StepOutline.should_receive(:build).and_return('outline')
|
114
|
+
Template::StepMultiline.should_receive(:build).and_return('multiline')
|
114
115
|
end
|
115
116
|
|
116
117
|
it 'should get string converted from extra_args' do
|
117
|
-
expect(template_stub.send(:step_extra_args,
|
118
|
-
expect(template_stub.send(:step_extra_args, extra_args_2)).to be_empty
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
describe '#step_outline' do
|
123
|
-
let(:outline) {
|
124
|
-
::Turnip::Table.new([
|
125
|
-
["State", "Money"],
|
126
|
-
["<Tokushima>", "555"],
|
127
|
-
["<Okinawa>", "368"]
|
128
|
-
])
|
129
|
-
}
|
130
|
-
|
131
|
-
it 'should get string converted to <table>' do
|
132
|
-
html = template.send(:step_outline, outline)
|
133
|
-
expect(html).to match %r{<td>State</td>[[:space:]]+<td>Money</td>}
|
134
|
-
expect(html).to match %r{<td><Tokushima></td>[[:space:]]+<td>555</td>}
|
135
|
-
expect(html).to match %r{<td><Okinawa></td>[[:space:]]+<td>368</td>}
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
describe '#step_multiline' do
|
140
|
-
it 'should get escaped string enclosed in <pre>' do
|
141
|
-
html = template.send(:step_multiline, 'a<a>a')
|
142
|
-
expect(html).to eq('<pre class="multiline">a<a>a</pre>')
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
describe '#step_exception' do
|
147
|
-
let(:exception) do
|
148
|
-
StandardError.new('StepExceptionError').tap do |e|
|
149
|
-
e.set_backtrace('/path/to/error.rb: 10')
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
it 'should get string Exception class name and backtrace' do
|
154
|
-
html = template.send(:step_exception, exception)
|
155
|
-
expect(html).to match %r{div class="step_exception"}
|
156
|
-
expect(html).to match %r{<pre>.*#{exception.message}.*</pre>}
|
157
|
-
expect(html).to match %r{<li>/path/to/error.rb: 10</li>}
|
118
|
+
expect(template_stub.send(:step_extra_args, extra_args)).to eq("outline\nmultiline")
|
158
119
|
end
|
159
120
|
end
|
160
121
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turnip_formatter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: turnip
|
@@ -117,9 +117,14 @@ files:
|
|
117
117
|
- lib/turnip_formatter/scenario/pass.rb
|
118
118
|
- lib/turnip_formatter/scenario/pending.rb
|
119
119
|
- lib/turnip_formatter/step.rb
|
120
|
+
- lib/turnip_formatter/step/dsl.rb
|
120
121
|
- lib/turnip_formatter/step/failure.rb
|
121
122
|
- lib/turnip_formatter/step/pending.rb
|
122
123
|
- lib/turnip_formatter/template.rb
|
124
|
+
- lib/turnip_formatter/template/step_exception.rb
|
125
|
+
- lib/turnip_formatter/template/step_multiline.rb
|
126
|
+
- lib/turnip_formatter/template/step_outline.rb
|
127
|
+
- lib/turnip_formatter/template/step_source.rb
|
123
128
|
- lib/turnip_formatter/version.rb
|
124
129
|
- spec/examples/README.md
|
125
130
|
- spec/examples/features/battle.feature
|
@@ -131,7 +136,8 @@ files:
|
|
131
136
|
- spec/examples/images/failed_step.png
|
132
137
|
- spec/examples/images/multiline.png
|
133
138
|
- spec/examples/images/outline.png
|
134
|
-
- spec/examples/images/
|
139
|
+
- spec/examples/images/pending_step.png
|
140
|
+
- spec/examples/images/tag_step.png
|
135
141
|
- spec/examples/spec_helper.rb
|
136
142
|
- spec/examples/steps/spell_steps.rb
|
137
143
|
- spec/examples/steps/steps.rb
|
@@ -145,6 +151,10 @@ files:
|
|
145
151
|
- spec/turnip_formatter/step/failure_spec.rb
|
146
152
|
- spec/turnip_formatter/step/pending_spec.rb
|
147
153
|
- spec/turnip_formatter/step_spec.rb
|
154
|
+
- spec/turnip_formatter/template/step_exception_spec.rb
|
155
|
+
- spec/turnip_formatter/template/step_multiline_spec.rb
|
156
|
+
- spec/turnip_formatter/template/step_outline_spec.rb
|
157
|
+
- spec/turnip_formatter/template/step_source_spec.rb
|
148
158
|
- spec/turnip_formatter/template_spec.rb
|
149
159
|
- turnip_formatter.gemspec
|
150
160
|
homepage: https://github.com/gongo/turnip_formatter
|
@@ -162,7 +172,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
162
172
|
version: '0'
|
163
173
|
segments:
|
164
174
|
- 0
|
165
|
-
hash:
|
175
|
+
hash: -3424310081992899473
|
166
176
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
177
|
none: false
|
168
178
|
requirements:
|
@@ -171,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
181
|
version: '0'
|
172
182
|
segments:
|
173
183
|
- 0
|
174
|
-
hash:
|
184
|
+
hash: -3424310081992899473
|
175
185
|
requirements: []
|
176
186
|
rubyforge_project:
|
177
187
|
rubygems_version: 1.8.23
|
@@ -189,7 +199,8 @@ test_files:
|
|
189
199
|
- spec/examples/images/failed_step.png
|
190
200
|
- spec/examples/images/multiline.png
|
191
201
|
- spec/examples/images/outline.png
|
192
|
-
- spec/examples/images/
|
202
|
+
- spec/examples/images/pending_step.png
|
203
|
+
- spec/examples/images/tag_step.png
|
193
204
|
- spec/examples/spec_helper.rb
|
194
205
|
- spec/examples/steps/spell_steps.rb
|
195
206
|
- spec/examples/steps/steps.rb
|
@@ -203,4 +214,8 @@ test_files:
|
|
203
214
|
- spec/turnip_formatter/step/failure_spec.rb
|
204
215
|
- spec/turnip_formatter/step/pending_spec.rb
|
205
216
|
- spec/turnip_formatter/step_spec.rb
|
217
|
+
- spec/turnip_formatter/template/step_exception_spec.rb
|
218
|
+
- spec/turnip_formatter/template/step_multiline_spec.rb
|
219
|
+
- spec/turnip_formatter/template/step_outline_spec.rb
|
220
|
+
- spec/turnip_formatter/template/step_source_spec.rb
|
206
221
|
- spec/turnip_formatter/template_spec.rb
|
Binary file
|