cukable 0.1.1

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/bin/cuke2fit ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Script to convert Cucumber features into FitNesse wiki pages
4
+
5
+ # Desired behavior:
6
+ #
7
+ # - Recursively search for .feature files in a directory
8
+ # - Create a FitNesse wiki hierarchy that mirrors the .feature hierarchy, with
9
+ # one wiki page for each .feature file
10
+ # - Fill those wiki pages with a table - essentially just the text of the
11
+ # .feature file with |...| wrapping each line. Empty lines should be skipped.
12
+ #
13
+
14
+ require 'cukable/conversion'
15
+
16
+ if ARGV.count == 0
17
+ puts "Usage: cuke2fit.rb <features_path> <fitnesse_path>"
18
+ else
19
+ converter = Cukable::Converter.new
20
+ messages = converter.features_to_fitnesse(ARGV[0], ARGV[1])
21
+ messages.each do |message|
22
+ puts message
23
+ end
24
+ end
25
+
data/cukable.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "cukable"
3
+ s.version = "0.1.1"
4
+ s.summary = "Runs Cucumber tests from FitNesse"
5
+ s.description = <<-EOS
6
+ Cukable allows running Cucumber test scenarios from FitNesse
7
+ EOS
8
+ s.authors = ["Eric Pierce", "Ken Brazier"]
9
+ s.email = "wapcaplet88@gmail.com"
10
+ s.homepage = "http://github.com/wapcaplet/cukable"
11
+ s.platform = Gem::Platform::RUBY
12
+
13
+ s.add_dependency 'json'
14
+ s.add_dependency 'cucumber'
15
+ s.add_dependency 'diff-lcs'
16
+
17
+ s.add_development_dependency 'rspec', '>= 2.2.0'
18
+ s.add_development_dependency 'rcov'
19
+ s.add_development_dependency 'yard'
20
+ s.add_development_dependency 'bluecloth'
21
+
22
+ s.files = `git ls-files`.split("\n")
23
+ s.require_path = 'lib'
24
+
25
+ s.executables = ['cuke2fit']
26
+ end
@@ -0,0 +1,54 @@
1
+ Feature: Conversion
2
+
3
+ Background:
4
+ Given a standard Cucumber project directory structure
5
+ And a FitNesse wiki
6
+
7
+ Scenario: Convert features to FitNesse
8
+ Given a file named "features/passing.feature" with:
9
+ """
10
+ Feature: Passing
11
+ Scenario: Passing
12
+ Given a step passes
13
+ """
14
+ And a file named "features/failing.feature" with:
15
+ """
16
+ Feature: Failing
17
+ Scenario: Failing
18
+ Given a step fails
19
+ """
20
+ When I convert features to FitNesse
21
+
22
+ Then I should have a Suite "FeatureS" containing:
23
+ """
24
+ These variables must be defined for rubyslim to work:
25
+ !define TEST_SYSTEM {slim}
26
+ !define TEST_RUNNER {rubyslim}
27
+ !define COMMAND_PATTERN {rubyslim}
28
+
29
+ Extra command-line arguments to pass to Cucumber:
30
+ !define CUCUMBER_ARGS {}
31
+
32
+ !contents -R9 -p -f -h
33
+ """
34
+
35
+ And I should have a Test "FeatureS/AaaAccelerator" containing:
36
+ """
37
+ """
38
+
39
+ And I should have a Test "FeatureS/PassingFeature" containing:
40
+ """
41
+ !| Table: Cuke |
42
+ | Feature: Passing |
43
+ | Scenario: Passing |
44
+ | Given a step passes |
45
+ """
46
+
47
+ And I should have a Test "FeatureS/FailingFeature" containing:
48
+ """
49
+ !| Table: Cuke |
50
+ | Feature: Failing |
51
+ | Scenario: Failing |
52
+ | Given a step fails |
53
+ """
54
+
@@ -0,0 +1,147 @@
1
+ Feature: Cuke fixture
2
+
3
+ Background:
4
+ Given a standard Cucumber project directory structure
5
+
6
+ Scenario: Do table
7
+ Given a Cuke fixture
8
+ When I do this table:
9
+ | Feature: Table |
10
+ | Scenario: Table |
11
+
12
+ Then "slim_results/features/fitnesse/fitnesse_test.feature.json" should contain JSON:
13
+ """
14
+ [
15
+ ["report:Feature: Table"],
16
+ ["report:Scenario: Table"]
17
+ ]
18
+ """
19
+
20
+ Scenario: Write features
21
+ Given a Cuke fixture
22
+ And a FitNesse wiki
23
+ And a FitNesse suite "TestSuite" with:
24
+ """
25
+ !contents
26
+ """
27
+ And a FitNesse test "TestSuite/HelloWorld" with:
28
+ """
29
+ | Table: Cuke |
30
+ | Feature: Hello |
31
+ | Scenario: Hello |
32
+ """
33
+ And a FitNesse test "TestSuite/GoodbyeWorld" with:
34
+ """
35
+ | Table: Cuke |
36
+ | Feature: Goodbye |
37
+ | Scenario: Goodbye |
38
+ """
39
+ When I write features for suite "TestSuite"
40
+
41
+ Then "features/fitnesse/HelloWorld_0.feature" should contain:
42
+ """
43
+ Feature: Hello
44
+ Scenario: Hello
45
+ """
46
+ And "features/fitnesse/GoodbyeWorld_0.feature" should contain:
47
+ """
48
+ Feature: Goodbye
49
+ Scenario: Goodbye
50
+ """
51
+
52
+
53
+ Scenario: Accelerate suite
54
+ Given a FitNesse wiki
55
+ And a Cuke fixture
56
+ And a Suite "FeatureS" containing:
57
+ """
58
+ !define TEST_SYSTEM {slim}
59
+ !define TEST_RUNNER {rubyslim}
60
+ !define COMMAND_PATTERN {rubyslim}
61
+ !define CUCUMBER_ARGS {}
62
+ """
63
+
64
+ And a Test "FeatureS/AaaAccelerator" containing:
65
+ """
66
+ """
67
+
68
+ And a Test "FeatureS/PassingFeature" containing:
69
+ """
70
+ !| Table: Cuke |
71
+ | Feature: Passing |
72
+ | Scenario: Passing |
73
+ | Given a step passes |
74
+ """
75
+
76
+ And a Test "FeatureS/FailingFeature" containing:
77
+ """
78
+ !| Table: Cuke |
79
+ | Feature: Failing |
80
+ | Scenario: Failing |
81
+ | Given a step fails |
82
+ """
83
+
84
+ When I run the accelerator for suite "FeatureS"
85
+
86
+ Then "slim_results/features/fitnesse/PassingFeature_0.feature.json" should contain JSON:
87
+ """
88
+ [
89
+ ["report:Feature: Passing"],
90
+ ["report:Scenario: Passing"],
91
+ ["error:Given a step passes"]
92
+ ]
93
+ """
94
+
95
+ And "slim_results/features/fitnesse/FailingFeature_0.feature.json" should contain JSON:
96
+ """
97
+ [
98
+ ["report:Feature: Failing"],
99
+ ["report:Scenario: Failing"],
100
+ ["error:Given a step fails"]
101
+ ]
102
+ """
103
+
104
+
105
+ @wip
106
+ Scenario: Accelerate suite with skipped tags
107
+ # FIXME: Fails when run with other scenarios. Lack of init/cleanup in self_test dir?
108
+ Given a FitNesse wiki
109
+ And a Cuke fixture
110
+
111
+ And a Test "FeatureS/SkippedScenariosFeature" containing:
112
+ """
113
+ !| Table: Cuke |
114
+ | Feature: Passing |
115
+ | @skip |
116
+ | Scenario: Skipped scenario |
117
+ | Given a step passes |
118
+ | Scenario: Passing |
119
+ | Given a step passes |
120
+ | @skip |
121
+ | Scenario: Another skipped scenario |
122
+ | Given a step passes |
123
+ """
124
+
125
+ And a Test "FeatureS/SkippedFeature" containing:
126
+ """
127
+ !| Table: Cuke |
128
+ | @skip |
129
+ | Feature: Skipped feature |
130
+ | Scenario: Failing |
131
+ | Given a step fails |
132
+ """
133
+
134
+ When I set CUCUMBER_ARGS to "--tags ~@skip"
135
+ And I run the accelerator for suite "FeatureS"
136
+
137
+ Then "slim_results/features/fitnesse/SkippedScenariosFeature_0.feature.json" should contain JSON:
138
+ """
139
+ [
140
+ ["report:Feature: Passing"],
141
+ ["report:Scenario: Passing"],
142
+ ["error:Given a step passes"]
143
+ ]
144
+ """
145
+
146
+ And "slim_results/features/fitnesse/SkippedFeature_0.feature.json" should not exist
147
+
@@ -0,0 +1,153 @@
1
+ @wip
2
+ Feature: Slim JSON Formatter
3
+
4
+ Background:
5
+ Given a standard Cucumber project directory structure
6
+
7
+
8
+ Scenario: Passing step
9
+ Given a file named "features/passing.feature" with:
10
+ """
11
+ Feature: Passing
12
+ Scenario: Passing
13
+ Given a step passes
14
+ """
15
+ When I run cucumber on "features/passing.feature"
16
+ Then "slim_results/features/passing.feature.json" should contain JSON:
17
+ """
18
+ [
19
+ ["report:Feature: Passing"],
20
+ ["report:Scenario: Passing"],
21
+ ["pass:Given a step passes"]
22
+ ]
23
+ """
24
+
25
+
26
+ Scenario: Failing step
27
+ Given a file named "features/failing.feature" with:
28
+ """
29
+ Feature: Failing
30
+ Scenario: Failing
31
+ Given a step fails
32
+ """
33
+ When I run cucumber on "features/failing.feature"
34
+ Then "slim_results/features/failing.feature.json" should contain JSON:
35
+ """
36
+ [
37
+ ["report:Feature: Failing"],
38
+ ["report:Scenario: Failing"],
39
+ ["fail:Given a step fails"]
40
+ ]
41
+ """
42
+
43
+
44
+ Scenario: Undefined step
45
+ Given a file named "features/undefined.feature" with:
46
+ """
47
+ Feature: Undefined
48
+ Scenario: Undefined
49
+ Given a step is undefined
50
+ """
51
+ When I run cucumber on "features/undefined.feature"
52
+ Then "slim_results/features/undefined.feature.json" should contain JSON:
53
+ """
54
+ [
55
+ ["report:Feature: Undefined"],
56
+ ["report:Scenario: Undefined"],
57
+ ["error:Given a step is undefined"]
58
+ ]
59
+ """
60
+
61
+
62
+ Scenario: Skipped step
63
+ Given a file named "features/skipped.feature" with:
64
+ """
65
+ Feature: Skipped
66
+ Scenario: Skipped
67
+ When a step fails
68
+ Then a step is skipped
69
+ """
70
+ When I run cucumber on "features/skipped.feature"
71
+ Then "slim_results/features/skipped.feature.json" should contain JSON:
72
+ """
73
+ [
74
+ ["report:Feature: Skipped"],
75
+ ["report:Scenario: Skipped"],
76
+ ["fail:When a step fails"],
77
+ ["ignore:Then a step is skipped"]
78
+ ]
79
+ """
80
+
81
+
82
+ Scenario: Passing table
83
+ Given a file named "features/passing_table.feature" with:
84
+ """
85
+ Feature: Passing table
86
+ Scenario: Passing table
87
+ When I have a table:
88
+ | OK | OK | OK |
89
+ | OK | OK | OK |
90
+ """
91
+ When I run cucumber on "features/passing_table.feature"
92
+ Then "slim_results/features/passing_table.feature.json" should contain JSON:
93
+ """
94
+ [
95
+ ["report:Feature: Passing table"],
96
+ ["report:Scenario: Passing table"],
97
+ ["pass:When I have a table:"],
98
+ ["report: ", "pass:OK", "pass:OK", "pass:OK"],
99
+ ["report: ", "pass:OK", "pass:OK", "pass:OK"]
100
+ ]
101
+ """
102
+
103
+
104
+ Scenario: Failing table
105
+ Given a file named "features/failing_table.feature" with:
106
+ """
107
+ Feature: Failing table
108
+ Scenario: Failing table
109
+ When I have a table:
110
+ | OK | OK | OK |
111
+ | OK | FAIL | OK |
112
+ """
113
+ When I run cucumber on "features/failing_table.feature"
114
+ Then "slim_results/features/failing_table.feature.json" should contain JSON:
115
+ # FIXME: The table rows should probably not be marked 'pass' here!
116
+ """
117
+ [
118
+ ["report:Feature: Failing table"],
119
+ ["report:Scenario: Failing table"],
120
+ ["fail:When I have a table:"],
121
+ ["report: ", "pass:OK", "pass:OK", "pass:OK"],
122
+ ["report: ", "pass:OK", "pass:FAIL", "pass:OK"]
123
+ ]
124
+ """
125
+
126
+
127
+ Scenario: Scenario Outline
128
+ Given a file named "features/scenario_outline.feature" with:
129
+ """
130
+ Feature: Failing table
131
+ Scenario Outline: Outline
132
+ Given a step <result>
133
+
134
+ Examples:
135
+ | result |
136
+ | passes |
137
+ | fails |
138
+ """
139
+ When I run cucumber on "features/scenario_outline.feature"
140
+ Then "slim_results/features/scenario_outline.feature.json" should contain JSON:
141
+ """
142
+ [
143
+ ["report:Feature: Failing table"],
144
+ ["report:Scenario Outline: Outline"],
145
+ ["ignore:Given a step &lt;result&gt;"],
146
+ ["report:Examples: "],
147
+ ["report: ", "pass:result"],
148
+ ["report: ", "pass:passes"],
149
+ ["report: ", "fail:fails"],
150
+ ["fail:<br/>"]
151
+ ]
152
+ """
153
+
@@ -0,0 +1,115 @@
1
+ # Steps for Cukable self-tests
2
+ # NOTE: Helper methods are defined in features/support/env.rb
3
+
4
+ require 'json'
5
+ require 'cukable/cuke'
6
+
7
+
8
+ Given /^a standard Cucumber project directory structure$/ do
9
+ create_standard_cucumber_dir
10
+ end
11
+
12
+
13
+ Given /^a FitNesse wiki$/ do
14
+ create_standard_fitnesse_dir
15
+ @fitnesse_root = 'FitNesseRoot'
16
+ end
17
+
18
+
19
+ Given /^a FitNesse suite "(.+)" with:$/ do |page_name, content|
20
+ create_fitnesse_page(page_name, content)
21
+ end
22
+
23
+
24
+ Given /^a FitNesse test "(.+)" with:$/ do |page_name, content|
25
+ create_fitnesse_page(page_name, content)
26
+ end
27
+
28
+
29
+ Given /^a file named "(.+)" with:$/ do |filename, content|
30
+ create_file(filename, content)
31
+ end
32
+
33
+
34
+ When /^I run cucumber on "(.+)"$/ do |feature_files|
35
+ format = "--format Cucumber::Formatter::SlimJSON --out slim_results"
36
+ run_cucumber("#{format} #{feature_files}")
37
+ end
38
+
39
+
40
+ Then /^"(.+)" should contain:$/ do |filename, text|
41
+ file_should_contain(filename, text)
42
+ end
43
+
44
+
45
+ Then /^"(.+)" should contain JSON:$/ do |filename, json_text|
46
+ file_should_contain_json(filename, json_text)
47
+ end
48
+
49
+
50
+ Then /^"(.+)" should not exist$/ do |filename|
51
+ in_test_dir do
52
+ if File.exist?(filename)
53
+ raise Exception, "Expected #{filename} to be non-existent, but it exists"
54
+ end
55
+ end
56
+ end
57
+
58
+
59
+ Given /^a (Test|Suite) "(.+)" containing:$/ do |type, filename, content|
60
+ content_file = File.join(@fitnesse_root, filename, 'content.txt')
61
+ properties_file = File.join(@fitnesse_root, filename, 'properties.xml')
62
+ create_file(content_file, content)
63
+ create_file(properties_file, xml_content(type))
64
+ end
65
+
66
+
67
+ Then /^I should have a (Test|Suite) "(.+)" containing:$/ do |type, filename, content|
68
+ content_file = File.join(@fitnesse_root, filename, 'content.txt')
69
+ properties_file = File.join(@fitnesse_root, filename, 'properties.xml')
70
+ file_should_contain(content_file, content)
71
+ file_should_contain(properties_file, xml_content(type))
72
+ end
73
+
74
+
75
+ Given /^a Cuke fixture$/ do
76
+ in_test_dir do
77
+ @cuke = Cukable::Cuke.new
78
+ @cucumber_args = ''
79
+ end
80
+ end
81
+
82
+
83
+ When /^I do this table:$/ do |table|
84
+ in_test_dir do
85
+ @table = @cuke.do_table(table.raw)
86
+ end
87
+ end
88
+
89
+
90
+ When /^I write features for suite "(.+)"$/ do |suite_name|
91
+ in_test_dir do
92
+ @cuke.write_suite_features("FitNesseRoot/#{suite_name}")
93
+ end
94
+ end
95
+
96
+
97
+ When /^I convert features to FitNesse$/ do
98
+ in_test_dir do
99
+ @converter = Cukable::Converter.new
100
+ @converter.features_to_fitnesse('features', @fitnesse_root)
101
+ end
102
+ end
103
+
104
+
105
+ When /^I set CUCUMBER_ARGS to "(.+)"$/ do |args|
106
+ @cucumber_args = args
107
+ end
108
+
109
+
110
+ When /^I run the accelerator for suite "(.+)"$/ do |suite_name|
111
+ in_test_dir do
112
+ @cuke.accelerate("#{suite_name}.AaaAccelerator", @cucumber_args)
113
+ end
114
+ end
115
+