kelp 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +6 -0
- data/History.md +7 -0
- data/README.md +10 -3
- data/kelp.gemspec +2 -1
- data/lib/kelp.rb +18 -0
- data/lib/kelp/dropdown.rb +4 -3
- data/lib/kelp/visibility.rb +63 -15
- data/lib/kelp/xpath.rb +19 -1
- data/spec/dropdown_spec.rb +6 -0
- data/spec/spec_helper.rb +17 -4
- data/spec/test_app/views/form.erb +8 -0
- data/spec/test_app/views/home.erb +4 -0
- data/spec/visibility_spec.rb +6 -2
- metadata +26 -12
data/Gemfile.lock
CHANGED
@@ -3,6 +3,7 @@ PATH
|
|
3
3
|
specs:
|
4
4
|
kelp (0.1.2)
|
5
5
|
capybara (>= 0.4.0)
|
6
|
+
webrat
|
6
7
|
|
7
8
|
GEM
|
8
9
|
remote: http://rubygems.org/
|
@@ -83,6 +84,10 @@ GEM
|
|
83
84
|
thor (0.14.6)
|
84
85
|
tilt (1.1)
|
85
86
|
tzinfo (0.3.23)
|
87
|
+
webrat (0.7.3)
|
88
|
+
nokogiri (>= 1.2.0)
|
89
|
+
rack (>= 1.0)
|
90
|
+
rack-test (>= 0.5.3)
|
86
91
|
xpath (0.1.2)
|
87
92
|
nokogiri (~> 1.3)
|
88
93
|
|
@@ -97,3 +102,4 @@ DEPENDENCIES
|
|
97
102
|
rspec (>= 2.2.0)
|
98
103
|
rspec-rails
|
99
104
|
sinatra
|
105
|
+
webrat
|
data/History.md
CHANGED
data/README.md
CHANGED
@@ -13,6 +13,8 @@ short, easy to remember, and is in keeping with the theme of greenish plants.
|
|
13
13
|
Kelp is licensed under the
|
14
14
|
[MIT License](http://www.opensource.org/licenses/mit-license.php).
|
15
15
|
|
16
|
+
Documentation is
|
17
|
+
[available on rdoc.info](http://rdoc.info/github/wapcaplet/kelp/master/frames).
|
16
18
|
Please use the [issue tracker](http://github.com/wapcaplet/kelp/issues)
|
17
19
|
to report any bugs or feature requests. Visit the `#kelp` channel on
|
18
20
|
`irc.freenode.net` to chat.
|
@@ -87,12 +89,17 @@ you pass to this should be in whatever format your `Capybara.default_selector`
|
|
87
89
|
is set to. Other keywords like `:before` or `:after` may be supported in future
|
88
90
|
revisions.
|
89
91
|
|
92
|
+
See the
|
93
|
+
[kelp documentation](http://rdoc.info/github/wapcaplet/kelp/master/frames).
|
94
|
+
for more information.
|
95
|
+
|
90
96
|
|
91
97
|
Development
|
92
98
|
-----------
|
93
99
|
|
94
|
-
If you'd like to hack on Kelp, first fork the
|
95
|
-
repository
|
100
|
+
If you'd like to hack on Kelp, first fork the
|
101
|
+
[repository](http://github.com/wapcaplet/kelp),
|
102
|
+
then clone your fork:
|
96
103
|
|
97
104
|
$ git clone git://github.com/your_username/kelp.git
|
98
105
|
|
@@ -100,7 +107,7 @@ Install [bundler](http://gembundler.com/):
|
|
100
107
|
|
101
108
|
$ gem install bundler
|
102
109
|
|
103
|
-
Then install Kelp's dependencies
|
110
|
+
Then install Kelp's dependencies:
|
104
111
|
|
105
112
|
$ cd /path/to/kelp
|
106
113
|
$ bundle install
|
data/kelp.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "kelp"
|
5
|
-
s.version = "0.1.
|
5
|
+
s.version = "0.1.3"
|
6
6
|
s.summary = "Cucumber helper methods"
|
7
7
|
s.description = <<-EOS
|
8
8
|
Kelp is a collection of helper methods for Cucumber to ease the process of
|
@@ -14,6 +14,7 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.platform = Gem::Platform::RUBY
|
15
15
|
|
16
16
|
s.add_dependency 'capybara', '>= 0.4.0'
|
17
|
+
s.add_dependency 'webrat'
|
17
18
|
|
18
19
|
s.add_development_dependency 'sinatra'
|
19
20
|
s.add_development_dependency 'rspec', '>= 2.2.0'
|
data/lib/kelp.rb
CHANGED
@@ -6,3 +6,21 @@ require 'kelp/navigation'
|
|
6
6
|
require 'kelp/scoping'
|
7
7
|
require 'kelp/visibility'
|
8
8
|
|
9
|
+
module Kelp
|
10
|
+
class << self
|
11
|
+
attr_writer :driver
|
12
|
+
|
13
|
+
# @return [Symbol]
|
14
|
+
# Name of the default driver used by Kelp
|
15
|
+
def default_driver
|
16
|
+
:capybara
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Symbol]
|
20
|
+
# Name of the current driver used by Kelp (:capybara or :webrat)
|
21
|
+
def driver
|
22
|
+
@driver || default_driver
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
data/lib/kelp/dropdown.rb
CHANGED
@@ -27,7 +27,8 @@ module Kelp
|
|
27
27
|
selected = field.find(:xpath, ".//option[@selected='selected']")
|
28
28
|
# If not, find the option matching the first field value
|
29
29
|
rescue Capybara::ElementNotFound
|
30
|
-
|
30
|
+
first_value = xpath_sanitize(field.value.first)
|
31
|
+
selected = field.find(:xpath, ".//option[@value=#{first_value}]")
|
31
32
|
end
|
32
33
|
selected.text.should =~ /#{value}/
|
33
34
|
end
|
@@ -56,7 +57,7 @@ module Kelp
|
|
56
57
|
field = nice_find_field(dropdown)
|
57
58
|
# Look for each value
|
58
59
|
values.each do |value|
|
59
|
-
page.should have_xpath(".//option[text()
|
60
|
+
page.should have_xpath(".//option[text()=#{xpath_sanitize(value)}]")
|
60
61
|
end
|
61
62
|
end
|
62
63
|
end
|
@@ -83,7 +84,7 @@ module Kelp
|
|
83
84
|
field = nice_find_field(dropdown)
|
84
85
|
# Look for each value
|
85
86
|
values.each do |value|
|
86
|
-
page.should have_no_xpath(".//option[text()
|
87
|
+
page.should have_no_xpath(".//option[text()=#{xpath_sanitize(value)}]")
|
87
88
|
end
|
88
89
|
end
|
89
90
|
end
|
data/lib/kelp/visibility.rb
CHANGED
@@ -89,10 +89,20 @@ module Kelp
|
|
89
89
|
# Content you expect to be on the page
|
90
90
|
#
|
91
91
|
def page_should_contain_text(text)
|
92
|
-
if
|
93
|
-
page.should
|
92
|
+
if Kelp.driver == :capybara
|
93
|
+
if page.respond_to? :should
|
94
|
+
page.should have_content(text)
|
95
|
+
else
|
96
|
+
assert page.has_content?(text)
|
97
|
+
end
|
98
|
+
elsif Kelp.driver == :webrat
|
99
|
+
if defined?(Spec::Rails::Matchers)
|
100
|
+
response.should contain(text)
|
101
|
+
else
|
102
|
+
assert_contain text
|
103
|
+
end
|
94
104
|
else
|
95
|
-
|
105
|
+
raise RuntimeError, "Unsupported driver: #{Kelp.driver}"
|
96
106
|
end
|
97
107
|
end
|
98
108
|
|
@@ -103,10 +113,20 @@ module Kelp
|
|
103
113
|
# Content you expect to match
|
104
114
|
#
|
105
115
|
def page_should_contain_regexp(regexp)
|
106
|
-
if
|
107
|
-
page.
|
116
|
+
if Kelp.driver == :capybara
|
117
|
+
if page.respond_to? :should
|
118
|
+
page.should have_xpath('.//*', :text => regexp)
|
119
|
+
else
|
120
|
+
assert page.has_xpath?('.//*', :text => regexp)
|
121
|
+
end
|
122
|
+
elsif Kelp.driver == :webrat
|
123
|
+
if defined?(Spec::Rails::Matchers)
|
124
|
+
response.should contain(regexp)
|
125
|
+
else
|
126
|
+
assert_match(regexp, response_body)
|
127
|
+
end
|
108
128
|
else
|
109
|
-
|
129
|
+
raise RuntimeError, "Unsupported driver: #{Kelp.driver}"
|
110
130
|
end
|
111
131
|
end
|
112
132
|
|
@@ -117,10 +137,21 @@ module Kelp
|
|
117
137
|
# Content you expect to be missing from the page
|
118
138
|
#
|
119
139
|
def page_should_not_contain_text(text)
|
120
|
-
if
|
121
|
-
page.should
|
140
|
+
if Kelp.driver == :capybara
|
141
|
+
if page.respond_to? :should
|
142
|
+
page.should have_no_content(text)
|
143
|
+
else
|
144
|
+
assert page.has_no_content?(text)
|
145
|
+
end
|
146
|
+
elsif Kelp.driver == :webrat
|
147
|
+
if defined?(Spec::Rails::Matchers)
|
148
|
+
response.should_not contain(text)
|
149
|
+
else
|
150
|
+
hc = Webrat::Matchers::HasContent.new(text)
|
151
|
+
assert !hc.matches?(content), hc.negative_failure_message
|
152
|
+
end
|
122
153
|
else
|
123
|
-
|
154
|
+
raise RuntimeError, "Unsupported driver: #{Kelp.driver}"
|
124
155
|
end
|
125
156
|
end
|
126
157
|
|
@@ -131,10 +162,20 @@ module Kelp
|
|
131
162
|
# Content you expect to fail matching
|
132
163
|
#
|
133
164
|
def page_should_not_contain_regexp(regexp)
|
134
|
-
if
|
135
|
-
page.
|
165
|
+
if Kelp.driver == :capybara
|
166
|
+
if page.respond_to? :should
|
167
|
+
page.should have_no_xpath('.//*', :text => regexp)
|
168
|
+
else
|
169
|
+
assert page.has_no_xpath?('.//*', :text => regexp)
|
170
|
+
end
|
171
|
+
elsif Kelp.driver == :webrat
|
172
|
+
if defined?(Spec::Rails::Matchers)
|
173
|
+
response.should_not contain(regexp)
|
174
|
+
else
|
175
|
+
assert_not_contain(regexp)
|
176
|
+
end
|
136
177
|
else
|
137
|
-
|
178
|
+
raise RuntimeError, "Unsupported driver: #{Kelp.driver}"
|
138
179
|
end
|
139
180
|
end
|
140
181
|
|
@@ -152,7 +193,11 @@ module Kelp
|
|
152
193
|
# Array of Strings that should appear in the same row
|
153
194
|
#
|
154
195
|
def should_see_in_same_row(texts)
|
155
|
-
|
196
|
+
if Kelp.driver == :capybara
|
197
|
+
page.should have_xpath(xpath_row_containing(texts))
|
198
|
+
elsif Kelp.driver == :webrat
|
199
|
+
raise RuntimeError, "Not implemented yet"
|
200
|
+
end
|
156
201
|
end
|
157
202
|
|
158
203
|
|
@@ -168,9 +213,12 @@ module Kelp
|
|
168
213
|
# Array of Strings that should not appear in the same row
|
169
214
|
#
|
170
215
|
def should_not_see_in_same_row(texts)
|
171
|
-
|
216
|
+
if Kelp.driver == :capybara
|
217
|
+
page.should have_no_xpath(xpath_row_containing(texts))
|
218
|
+
elsif Kelp.driver == :webrat
|
219
|
+
raise RuntimeError, "Not implemented yet"
|
220
|
+
end
|
172
221
|
end
|
173
222
|
|
174
|
-
|
175
223
|
end
|
176
224
|
end
|
data/lib/kelp/xpath.rb
CHANGED
@@ -6,9 +6,27 @@ module Kelp
|
|
6
6
|
def xpath_row_containing(texts)
|
7
7
|
texts = [texts] if texts.class == String
|
8
8
|
conditions = texts.collect do |text|
|
9
|
-
"contains(.,
|
9
|
+
"contains(., #{xpath_sanitize(text)})"
|
10
10
|
end.join(' and ')
|
11
11
|
return "//table//tr[#{conditions}]"
|
12
12
|
end
|
13
|
+
|
14
|
+
# Return the given text string in an XPath-safe form, with
|
15
|
+
# any single-quotes escaped by using the XPath `concat`
|
16
|
+
# function to combine them with the rest of the text.
|
17
|
+
#
|
18
|
+
# @example
|
19
|
+
# xpath_sanitize("Bob's")
|
20
|
+
# # => concat('Bob', "'", 's')
|
21
|
+
#
|
22
|
+
def xpath_sanitize(text)
|
23
|
+
# If there's nothing to escape, just wrap text in single-quotes
|
24
|
+
if !text.include?("'")
|
25
|
+
return "'#{text}'"
|
26
|
+
else
|
27
|
+
result = text.gsub(/'/, %{', "'", '})
|
28
|
+
return "concat('#{result}')"
|
29
|
+
end
|
30
|
+
end
|
13
31
|
end
|
14
32
|
end
|
data/spec/dropdown_spec.rb
CHANGED
@@ -59,6 +59,12 @@ describe Kelp::Dropdown, "dropdown_should_include" do
|
|
59
59
|
dropdown_should_include "Height", "Tall"
|
60
60
|
end
|
61
61
|
|
62
|
+
it "a single option with quotes exists in the dropdown" do
|
63
|
+
dropdown_should_include "Quotes", %{Single 'quotes'}
|
64
|
+
dropdown_should_include "Quotes", %{"Double" quotes}
|
65
|
+
dropdown_should_include "Quotes", %{'Single' and "Double" quotes}
|
66
|
+
end
|
67
|
+
|
62
68
|
it "multiple options exist in the dropdown" do
|
63
69
|
dropdown_should_include "Height", [
|
64
70
|
"Short",
|
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
require 'rspec'
|
2
|
+
|
3
|
+
# Supported drivers
|
2
4
|
require 'capybara'
|
3
5
|
require 'capybara/dsl'
|
6
|
+
#require 'webrat'
|
7
|
+
|
4
8
|
require 'kelp'
|
5
9
|
require File.expand_path(File.dirname(__FILE__) + '/test_app/test_app')
|
6
10
|
|
7
11
|
RSpec.configure do |config|
|
8
12
|
config.include Capybara
|
13
|
+
#config.include Webrat::Methods
|
14
|
+
|
9
15
|
config.include Kelp::Attribute
|
10
16
|
config.include Kelp::Checkbox
|
11
17
|
config.include Kelp::Dropdown
|
@@ -13,14 +19,21 @@ RSpec.configure do |config|
|
|
13
19
|
config.include Kelp::Navigation
|
14
20
|
config.include Kelp::Scoping
|
15
21
|
config.include Kelp::Visibility
|
16
|
-
|
17
|
-
Capybara.reset_sessions!
|
18
|
-
Capybara.use_default_driver
|
19
|
-
end
|
22
|
+
|
20
23
|
config.before do
|
24
|
+
#Kelp.driver = :webrat
|
21
25
|
Capybara.default_driver = :rack_test
|
22
26
|
Capybara.default_selector = :css
|
23
27
|
Capybara.app = TestApp
|
24
28
|
end
|
29
|
+
|
30
|
+
config.after do
|
31
|
+
Capybara.reset_sessions!
|
32
|
+
Capybara.use_default_driver
|
33
|
+
end
|
25
34
|
end
|
26
35
|
|
36
|
+
#Webrat.configure do |config|
|
37
|
+
#config.mode = :rack
|
38
|
+
#end
|
39
|
+
|
@@ -29,6 +29,14 @@
|
|
29
29
|
<option value="3">Heavy</option>
|
30
30
|
</select>
|
31
31
|
</p>
|
32
|
+
<p>
|
33
|
+
<label for="quotes">Quotes</label>
|
34
|
+
<select id="quotes">
|
35
|
+
<option value="1">Single 'quotes'</option>
|
36
|
+
<option value="2">"Double" quotes</option>
|
37
|
+
<option value="3">'Single' and "Double" quotes</option>
|
38
|
+
</select>
|
39
|
+
</p>
|
32
40
|
<p>
|
33
41
|
<label for="favorite_colors">Favorite Colors</label>
|
34
42
|
<select id="favorite_colors" multiple="multiple">
|
@@ -33,6 +33,10 @@
|
|
33
33
|
<tr> <td>Eric</td> <td>555-4444</td> <td><a href="/edit1">Edit</a></td> </tr>
|
34
34
|
<tr> <td>John</td> <td>666-5555</td> <td><a href="/edit2">Edit</a></td> </tr>
|
35
35
|
<tr> <td>Terry</td> <td>777-6666</td> <td><a href="/edit3">Edit</a></td> </tr>
|
36
|
+
|
37
|
+
<tr> <td>Eric "Quoted"</td> <td>555-4444</td> <td><a href="/edit1">Edit</a></td> </tr>
|
38
|
+
<tr> <td>"John's" quo'ta'tions</td> <td>666-5555</td> <td><a href="/edit2">Edit</a></td> </tr>
|
39
|
+
<tr> <td>Terry's "Big" thing</td> <td>777-6666</td> <td><a href="/edit3">Edit</a></td> </tr>
|
36
40
|
</tbody>
|
37
41
|
</table>
|
38
42
|
</div>
|
data/spec/visibility_spec.rb
CHANGED
@@ -183,13 +183,17 @@ describe Kelp::Visibility, "should_see_in_same_row" do
|
|
183
183
|
it "two strings are in the same row" do
|
184
184
|
should_see_in_same_row ["Eric", "Edit"]
|
185
185
|
should_see_in_same_row ["John", "Edit"]
|
186
|
-
|
186
|
+
end
|
187
|
+
|
188
|
+
it "two strings are in the same row, and one has single and/or double-quotes" do
|
189
|
+
should_see_in_same_row [%{Eric "Quoted"}, "Edit"]
|
190
|
+
should_see_in_same_row [%{"John's" quo'ta'tions}, "Edit"]
|
191
|
+
should_see_in_same_row [%{Terry's "Big" thing}, "Edit"]
|
187
192
|
end
|
188
193
|
|
189
194
|
it "three strings are in the same row" do
|
190
195
|
should_see_in_same_row ["Eric", "555-4444", "Edit"]
|
191
196
|
should_see_in_same_row ["John", "666-5555", "Edit"]
|
192
|
-
should_see_in_same_row ["Terry", "777-6666", "Edit"]
|
193
197
|
end
|
194
198
|
end
|
195
199
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kelp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 3
|
10
|
+
version: 0.1.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Eric Pierce
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-06 00:00:00 -06:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -35,7 +35,7 @@ dependencies:
|
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
38
|
+
name: webrat
|
39
39
|
prerelease: false
|
40
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
@@ -46,12 +46,26 @@ dependencies:
|
|
46
46
|
segments:
|
47
47
|
- 0
|
48
48
|
version: "0"
|
49
|
-
type: :
|
49
|
+
type: :runtime
|
50
50
|
version_requirements: *id002
|
51
51
|
- !ruby/object:Gem::Dependency
|
52
|
-
name:
|
52
|
+
name: sinatra
|
53
53
|
prerelease: false
|
54
54
|
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
type: :development
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: rspec
|
67
|
+
prerelease: false
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
55
69
|
none: false
|
56
70
|
requirements:
|
57
71
|
- - ">="
|
@@ -63,11 +77,11 @@ dependencies:
|
|
63
77
|
- 0
|
64
78
|
version: 2.2.0
|
65
79
|
type: :development
|
66
|
-
version_requirements: *
|
80
|
+
version_requirements: *id004
|
67
81
|
- !ruby/object:Gem::Dependency
|
68
82
|
name: rspec-rails
|
69
83
|
prerelease: false
|
70
|
-
requirement: &
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
71
85
|
none: false
|
72
86
|
requirements:
|
73
87
|
- - ">="
|
@@ -77,11 +91,11 @@ dependencies:
|
|
77
91
|
- 0
|
78
92
|
version: "0"
|
79
93
|
type: :development
|
80
|
-
version_requirements: *
|
94
|
+
version_requirements: *id005
|
81
95
|
- !ruby/object:Gem::Dependency
|
82
96
|
name: rcov
|
83
97
|
prerelease: false
|
84
|
-
requirement: &
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
85
99
|
none: false
|
86
100
|
requirements:
|
87
101
|
- - ">="
|
@@ -91,7 +105,7 @@ dependencies:
|
|
91
105
|
- 0
|
92
106
|
version: "0"
|
93
107
|
type: :development
|
94
|
-
version_requirements: *
|
108
|
+
version_requirements: *id006
|
95
109
|
description: " Kelp is a collection of helper methods for Cucumber to ease the process of\n writing step definitions.\n"
|
96
110
|
email: wapcaplet88@gmail.com
|
97
111
|
executables: []
|