napybara 0.5.0 → 0.6.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -2
- data/README.md +23 -4
- data/lib/napybara.rb +1 -0
- data/lib/napybara/element.rb +4 -26
- data/lib/napybara/finder_methods_appender.rb +94 -0
- data/lib/napybara/version.rb +1 -1
- data/napybara.gemspec +2 -1
- data/spec/integration/readme_spec.rb +22 -3
- data/spec/napybara/element_spec.rb +4 -4
- data/spec/napybara/finder_methods_appender_spec.rb +93 -0
- data/spec/spec_helper.rb +2 -0
- metadata +22 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dea35db336bc51c0fc90751281e7fc09460ca9d8
|
4
|
+
data.tar.gz: 0ad486329f004d1bd180333eb6ff8d109a130089
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f15a944eda01a2496cbbf76b217139c2e5c75eff72ecc1ef9e1b3febe5dc9998c5ddf9fa0f8832294f14403a4590a8bd9e6828c03a303f0b9df54cd5fe012356
|
7
|
+
data.tar.gz: 4856ea54f2bdbb92311ce06daea0ab463312bc09287df95af220972a8b76e676657025f6f261208b8a656828660a38d252c02ccdfa249b49ec3f069e8e82adf6
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
##
|
3
|
+
## 0.6.0
|
4
|
+
|
5
|
+
Allow Capybara options to be passed to finders.
|
6
|
+
|
7
|
+
## 0.5.0
|
4
8
|
|
5
9
|
Rename `#get` as #node. `#get` may become deprecated soon.
|
6
10
|
|
@@ -10,7 +14,6 @@ Add `#selector`.
|
|
10
14
|
|
11
15
|
Update README.
|
12
16
|
|
13
|
-
|
14
17
|
## 0.4.0
|
15
18
|
|
16
19
|
Require separate record selector for finding records.
|
data/README.md
CHANGED
@@ -6,6 +6,9 @@ So you're writing an integration test for the following page:
|
|
6
6
|
|
7
7
|
```html
|
8
8
|
<html>
|
9
|
+
<head>
|
10
|
+
<title>Your messages</title>
|
11
|
+
</head>
|
9
12
|
<body>
|
10
13
|
<ul class='message-list'>
|
11
14
|
<li class="message" id="message-1">Hello world!</li>
|
@@ -103,21 +106,20 @@ looking for "#message-1".
|
|
103
106
|
|
104
107
|
If the ruby object is identified by a method other than the object's id, you can replace `{id}` with the method e.g. `{name}`, `{to_s}`.
|
105
108
|
|
106
|
-
|
107
109
|
## Checking if an element exists
|
108
110
|
|
109
111
|
`Napybara::Element#finder` also adds `has_` and `has_no_` methods to the element.
|
110
112
|
With the Napybara elements above, you can call:
|
111
113
|
|
112
114
|
```ruby
|
113
|
-
expect(messages_page.has_form?).to
|
115
|
+
expect(messages_page.has_form?).to eq(true)
|
114
116
|
expect(messages_page).to have_form
|
115
117
|
|
116
|
-
expect(messages_page.has_message?(some_message)).to
|
118
|
+
expect(messages_page.has_message?(some_message)).to eq(true)
|
117
119
|
expect(messages_page).to have_message(some_message)
|
118
120
|
|
119
121
|
non_existent_message = Message.find(3)
|
120
|
-
expect(messages_page.has_no_message?(non_existent_message)).to
|
122
|
+
expect(messages_page.has_no_message?(non_existent_message)).to eq(true)
|
121
123
|
expect(messages_page).to have_no_message(non_existent_message)
|
122
124
|
```
|
123
125
|
|
@@ -216,6 +218,23 @@ end
|
|
216
218
|
|
217
219
|
It may not sexy, but it gets the job done :)
|
218
220
|
|
221
|
+
### Passing Capybara options to the finder
|
222
|
+
|
223
|
+
You can pass Capybara options to the finder:
|
224
|
+
|
225
|
+
```ruby
|
226
|
+
let(:messages_page) do
|
227
|
+
Napybara::Element.new(self) do |page|
|
228
|
+
page.finder :title, 'head title', visible: false
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
# ...
|
233
|
+
|
234
|
+
expect(page.title.node.text).to eq('Your messages')
|
235
|
+
|
236
|
+
```
|
237
|
+
|
219
238
|
## Putting it all together
|
220
239
|
|
221
240
|
Oh yeah, the "N" in Napybara stands for nesting. Here's how you can define the
|
data/lib/napybara.rb
CHANGED
data/lib/napybara/element.rb
CHANGED
@@ -14,33 +14,11 @@ module Napybara
|
|
14
14
|
block.call(self) if block_given?
|
15
15
|
end
|
16
16
|
|
17
|
-
def finder(child_element_name, child_element_selector,
|
18
|
-
|
19
|
-
|
20
|
-
selector_string = selector.to_s
|
17
|
+
def finder(child_element_name, child_element_selector, *optional_args, &block)
|
18
|
+
appender = FinderMethodsAppender.new(
|
19
|
+
self, child_element_name, child_element_selector, optional_args, block)
|
21
20
|
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
self.define_singleton_method("has_#{child_element_name}?") do |record = nil|
|
26
|
-
selector = Selector.new(child_element_selector, record_selector, record)
|
27
|
-
self.get.has_css?(selector.to_s)
|
28
|
-
end
|
29
|
-
|
30
|
-
self.define_singleton_method("has_no_#{child_element_name}?") do |record = nil|
|
31
|
-
selector = Selector.new(child_element_selector, record_selector, record)
|
32
|
-
self.get.has_no_css?(selector.to_s)
|
33
|
-
end
|
34
|
-
|
35
|
-
self.define_singleton_method(child_element_name.to_s.pluralize) do
|
36
|
-
elements = self.get.all(child_element_selector)
|
37
|
-
.map.with_index do |child_element, i|
|
38
|
-
|
39
|
-
self.class.new(child_element, self, child_element_selector, &block)
|
40
|
-
end
|
41
|
-
|
42
|
-
ElementArray.new(elements, self, child_element_selector)
|
43
|
-
end
|
21
|
+
appender.execute
|
44
22
|
end
|
45
23
|
|
46
24
|
def selector
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'napybara'
|
2
|
+
|
3
|
+
module Napybara
|
4
|
+
class FinderMethodsAppender
|
5
|
+
attr_reader :element, :child_element_name, :child_element_selector,
|
6
|
+
:optional_args, :block
|
7
|
+
|
8
|
+
def initialize(
|
9
|
+
element, child_element_name, child_element_selector, optional_args, block)
|
10
|
+
|
11
|
+
@element, @child_element_name, @child_element_selector, @optional_args, @block =
|
12
|
+
element, child_element_name, child_element_selector, optional_args, block
|
13
|
+
end
|
14
|
+
|
15
|
+
def record_selector
|
16
|
+
return if optional_args.empty?
|
17
|
+
return if !optional_args[0].is_a?(String)
|
18
|
+
|
19
|
+
optional_args[0]
|
20
|
+
end
|
21
|
+
|
22
|
+
def capybara_options
|
23
|
+
return {} if optional_args.empty?
|
24
|
+
return {} if !optional_args.last.is_a?(Hash)
|
25
|
+
|
26
|
+
optional_args.last
|
27
|
+
end
|
28
|
+
|
29
|
+
def execute
|
30
|
+
define_child_element_method
|
31
|
+
define_has_child_element_method
|
32
|
+
define_has_no_child_element_method
|
33
|
+
define_child_elements_method
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def define_child_element_method
|
39
|
+
appender = self
|
40
|
+
|
41
|
+
element.define_singleton_method(child_element_name) do |record = nil|
|
42
|
+
selector = Selector.new(
|
43
|
+
appender.child_element_selector,
|
44
|
+
appender.record_selector,
|
45
|
+
record)
|
46
|
+
|
47
|
+
selector_string = selector.to_s
|
48
|
+
|
49
|
+
capybara_element =
|
50
|
+
self.get.find(selector_string, appender.capybara_options)
|
51
|
+
|
52
|
+
self.class.new(capybara_element, self, selector_string, &appender.block)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def define_has_child_element_method
|
57
|
+
appender = self
|
58
|
+
|
59
|
+
element.define_singleton_method("has_#{child_element_name}?") do |record = nil|
|
60
|
+
selector = Selector.new(
|
61
|
+
appender.child_element_selector,
|
62
|
+
appender.record_selector, record)
|
63
|
+
|
64
|
+
self.get.has_css?(selector.to_s)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def define_has_no_child_element_method
|
69
|
+
appender = self
|
70
|
+
|
71
|
+
element.define_singleton_method("has_no_#{child_element_name}?") do |record = nil|
|
72
|
+
selector = Selector.new(
|
73
|
+
appender.child_element_selector,
|
74
|
+
appender.record_selector,
|
75
|
+
record)
|
76
|
+
|
77
|
+
self.get.has_no_css?(selector.to_s)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def define_child_elements_method
|
82
|
+
appender = self
|
83
|
+
|
84
|
+
element.define_singleton_method(child_element_name.to_s.pluralize) do
|
85
|
+
elements = self.get.all(appender.child_element_selector).map do |child_element|
|
86
|
+
self.class.new(
|
87
|
+
child_element, self, appender.child_element_selector, &appender.block)
|
88
|
+
end
|
89
|
+
|
90
|
+
ElementArray.new(elements, self, appender.child_element_selector)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
data/lib/napybara/version.rb
CHANGED
data/napybara.gemspec
CHANGED
@@ -27,8 +27,9 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_development_dependency "overcommit"
|
28
28
|
spec.add_development_dependency "poltergeist"
|
29
29
|
spec.add_development_dependency "rake"
|
30
|
-
spec.add_development_dependency "rspec"
|
30
|
+
spec.add_development_dependency "rspec", "~> 2.14.0"
|
31
31
|
spec.add_development_dependency "rspec-example_steps"
|
32
32
|
spec.add_development_dependency "rubocop"
|
33
33
|
spec.add_development_dependency "sinatra"
|
34
|
+
spec.add_development_dependency "verified_double"
|
34
35
|
end
|
@@ -5,6 +5,9 @@ describe 'Readme example:' do
|
|
5
5
|
let(:capybara_page) do
|
6
6
|
Capybara.string <<-HTML
|
7
7
|
<html>
|
8
|
+
<head>
|
9
|
+
<title>Your messages</title>
|
10
|
+
</head>
|
8
11
|
<body>
|
9
12
|
<ul class='messages-list'>
|
10
13
|
<li class="message" id="message-1">Hello world!</li>
|
@@ -87,15 +90,15 @@ describe 'Readme example:' do
|
|
87
90
|
end
|
88
91
|
|
89
92
|
Then "I can check for the existence of elements" do
|
90
|
-
expect(@messages_page.has_form?).to
|
93
|
+
expect(@messages_page.has_form?).to eq(true)
|
91
94
|
expect(@messages_page).to have_form
|
92
95
|
|
93
96
|
some_message = OpenStruct.new(id: 1)
|
94
|
-
expect(@messages_page.has_message?(some_message)).to
|
97
|
+
expect(@messages_page.has_message?(some_message)).to eq(true)
|
95
98
|
expect(@messages_page).to have_message(some_message)
|
96
99
|
|
97
100
|
non_existent_message = OpenStruct.new(id: 3)
|
98
|
-
expect(@messages_page.has_no_message?(non_existent_message)).to
|
101
|
+
expect(@messages_page.has_no_message?(non_existent_message)).to eq(true)
|
99
102
|
expect(@messages_page).to have_no_message(non_existent_message)
|
100
103
|
end
|
101
104
|
end
|
@@ -202,4 +205,20 @@ describe 'Readme example:' do
|
|
202
205
|
.to eq('.messages-list .message')
|
203
206
|
end
|
204
207
|
end
|
208
|
+
|
209
|
+
Steps "Passing Capybara options to a finder" do
|
210
|
+
Given "I have a capybara page" do
|
211
|
+
capybara_page
|
212
|
+
end
|
213
|
+
|
214
|
+
When "I pass Capybara options to the finder" do
|
215
|
+
@messages_page = Napybara::Element.new(capybara_page) do |page|
|
216
|
+
page.finder :title, 'head title', visible: false
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
Then "I should see that those options were passed to the finder's node" do
|
221
|
+
expect(@messages_page.title.node.text).to eq('Your messages')
|
222
|
+
end
|
223
|
+
end
|
205
224
|
end
|
@@ -70,7 +70,7 @@ describe Napybara::Element do
|
|
70
70
|
page = described_class.new(capybara_page)
|
71
71
|
page.finder(:button, 'button')
|
72
72
|
|
73
|
-
expect(page.buttons).to
|
73
|
+
expect(page.buttons.size).to eq(2)
|
74
74
|
expect(page.buttons).to be_all do |element|
|
75
75
|
element.get.tag_name == 'button'
|
76
76
|
end
|
@@ -82,7 +82,7 @@ describe Napybara::Element do
|
|
82
82
|
button.finder :img, 'img'
|
83
83
|
end
|
84
84
|
|
85
|
-
expect(page.buttons).to
|
85
|
+
expect(page.buttons.size).to eq(2)
|
86
86
|
expect(page.buttons[0].img.get.tag_name).to eq('img')
|
87
87
|
end
|
88
88
|
|
@@ -92,7 +92,7 @@ describe Napybara::Element do
|
|
92
92
|
|
93
93
|
object = OpenStruct.new(id: 1)
|
94
94
|
|
95
|
-
expect(page.has_form?(object)).to
|
95
|
+
expect(page.has_form?(object)).to eq(true)
|
96
96
|
end
|
97
97
|
|
98
98
|
it 'adds a method to check if the element has no sub-element matching a record' do
|
@@ -101,7 +101,7 @@ describe Napybara::Element do
|
|
101
101
|
|
102
102
|
object = OpenStruct.new(id: 1)
|
103
103
|
|
104
|
-
expect(page.has_no_form?(object)).to
|
104
|
+
expect(page.has_no_form?(object)).to eq(false)
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Napybara::FinderMethodsAppender do
|
4
|
+
let(:block) { nil }
|
5
|
+
let(:capybara_options) { { visible: false } }
|
6
|
+
let(:child_element_name) { 'some_element' }
|
7
|
+
let(:child_element_selector) { '.some_element' }
|
8
|
+
let(:element) { VerifiedDouble.instance_of(Napybara::Element) }
|
9
|
+
let(:optional_args) { [] }
|
10
|
+
let(:record_selector) { '#some_element_{id}' }
|
11
|
+
|
12
|
+
subject do
|
13
|
+
described_class.new(
|
14
|
+
element,
|
15
|
+
child_element_name,
|
16
|
+
child_element_selector,
|
17
|
+
optional_args,
|
18
|
+
block
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#record_selector" do
|
23
|
+
context "when there is no optional arg" do
|
24
|
+
before do
|
25
|
+
expect(optional_args).to be_empty
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be nil" do
|
29
|
+
expect(subject.record_selector).to be_nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when there is one optional arg and it is a String" do
|
34
|
+
let(:optional_args) { [record_selector] }
|
35
|
+
|
36
|
+
it "should be the string" do
|
37
|
+
expect(subject.record_selector).to eq(record_selector)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when there is one optional arg and it is a Hash" do
|
42
|
+
let(:optional_args) { [capybara_options] }
|
43
|
+
|
44
|
+
it "should be the nil" do
|
45
|
+
expect(subject.record_selector).to be_nil
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "when there are multiple optional args" do
|
50
|
+
let(:optional_args) { [record_selector, capybara_options] }
|
51
|
+
|
52
|
+
it "should be the first argument" do
|
53
|
+
expect(subject.record_selector).to eq(record_selector)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#capybara_options" do
|
59
|
+
context "when there is no optional arg" do
|
60
|
+
before do
|
61
|
+
expect(optional_args).to be_empty
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should be {}" do
|
65
|
+
expect(subject.capybara_options).to eq({})
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "when there is one optional arg and it is a String" do
|
70
|
+
let(:optional_args) { [record_selector] }
|
71
|
+
|
72
|
+
it "should be the {}" do
|
73
|
+
expect(subject.capybara_options).to eq({})
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "when there is one optional arg and it is a hash" do
|
78
|
+
let(:optional_args) { [capybara_options] }
|
79
|
+
|
80
|
+
it "should be the hash" do
|
81
|
+
expect(subject.capybara_options).to eq(capybara_options)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context "when there are multiple optional args" do
|
86
|
+
let(:optional_args) { [record_selector, capybara_options] }
|
87
|
+
|
88
|
+
it "should be the last argument" do
|
89
|
+
expect(subject.capybara_options).to eq(capybara_options)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: napybara
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- George Mendoza
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -124,6 +124,20 @@ dependencies:
|
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 2.14.0
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 2.14.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rspec-example_steps
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
143
|
- - ">="
|
@@ -137,7 +151,7 @@ dependencies:
|
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
154
|
+
name: rubocop
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
142
156
|
requirements:
|
143
157
|
- - ">="
|
@@ -151,7 +165,7 @@ dependencies:
|
|
151
165
|
- !ruby/object:Gem::Version
|
152
166
|
version: '0'
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
168
|
+
name: sinatra
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
156
170
|
requirements:
|
157
171
|
- - ">="
|
@@ -165,7 +179,7 @@ dependencies:
|
|
165
179
|
- !ruby/object:Gem::Version
|
166
180
|
version: '0'
|
167
181
|
- !ruby/object:Gem::Dependency
|
168
|
-
name:
|
182
|
+
name: verified_double
|
169
183
|
requirement: !ruby/object:Gem::Requirement
|
170
184
|
requirements:
|
171
185
|
- - ">="
|
@@ -199,6 +213,7 @@ files:
|
|
199
213
|
- lib/napybara.rb
|
200
214
|
- lib/napybara/element.rb
|
201
215
|
- lib/napybara/element_array.rb
|
216
|
+
- lib/napybara/finder_methods_appender.rb
|
202
217
|
- lib/napybara/selector.rb
|
203
218
|
- lib/napybara/version.rb
|
204
219
|
- napybara.gemspec
|
@@ -210,6 +225,7 @@ files:
|
|
210
225
|
- spec/integration/napybara_spec.rb
|
211
226
|
- spec/integration/readme_spec.rb
|
212
227
|
- spec/napybara/element_spec.rb
|
228
|
+
- spec/napybara/finder_methods_appender_spec.rb
|
213
229
|
- spec/spec_helper.rb
|
214
230
|
homepage: https://github.com/gsmendoza/napybara
|
215
231
|
licenses:
|
@@ -244,4 +260,5 @@ test_files:
|
|
244
260
|
- spec/integration/napybara_spec.rb
|
245
261
|
- spec/integration/readme_spec.rb
|
246
262
|
- spec/napybara/element_spec.rb
|
263
|
+
- spec/napybara/finder_methods_appender_spec.rb
|
247
264
|
- spec/spec_helper.rb
|