domino 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +61 -38
- data/domino.gemspec +1 -1
- data/lib/domino.rb +26 -6
- data/test/domino_test.rb +52 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 668a5c9b60cd2400258480a45f70444913a6c776
|
4
|
+
data.tar.gz: 411bee6d727404291237bd9fa7e286371f413cc4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4de9f8704851ef5e0f2891f44218db61022a65ec6a1bf11278fb966286a38df418f14b554992614436df2b310674ad454db7eac2aac43fb0ef8f038d69ca6256
|
7
|
+
data.tar.gz: 8812d350512383ba7b3503b3e9d2644e14f81215217caad816120a4ddb3ee106afc4884185f1cf255a6e82189e52a23f0ff29726c1a26bbf06767d597164f215
|
data/README.md
CHANGED
@@ -7,42 +7,57 @@ View abstraction for integration testing
|
|
7
7
|
To create a basic Domino class, inherit from Domino and
|
8
8
|
define a selector and attributes:
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
attribute :posted_at do |text|
|
23
|
-
Date.parse(text)
|
24
|
-
end
|
25
|
-
end
|
10
|
+
```ruby
|
11
|
+
module Dom
|
12
|
+
class Post < Domino
|
13
|
+
selector '#posts .post'
|
14
|
+
attribute :title # selector defaults to .title
|
15
|
+
attribute :author_name # selector defaults to .author-name
|
16
|
+
attribute :body, '.post-body' # example of selector override
|
17
|
+
|
18
|
+
# pass a block if you want to modify the value
|
19
|
+
attribute :comments do |text|
|
20
|
+
text.to_i
|
26
21
|
end
|
27
22
|
|
23
|
+
attribute :posted_at do |text|
|
24
|
+
Date.parse(text)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
```
|
29
|
+
|
28
30
|
Now in your integration test you can use some of Domino's methods:
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
+
```ruby
|
33
|
+
assert_equal 4, Dom::Post.count
|
34
|
+
refute_nil Dom::Post.find_by_title('First Post')
|
35
|
+
|
36
|
+
# Multiple attributes, returns first match if any
|
37
|
+
refute_nil Dom::Post.find_by(title: 'First Post', author: 'Jane Doe')
|
38
|
+
|
39
|
+
# Multiple attributes with exception if no match is found
|
40
|
+
refute_nil Dom::Post.find_by!(title: 'First Post', author: 'Jane Doe')
|
41
|
+
|
42
|
+
# Multiple attributes, returns all matches if any
|
43
|
+
assert_equal ["12/06/2014", "12/01/2014"], Dom::Post.where(author: 'Jane Doe').map(&:posted_on)
|
44
|
+
```
|
32
45
|
|
33
46
|
What makes it really powerful is defining scoped actions:
|
34
47
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
end
|
48
|
+
```ruby
|
49
|
+
module Dom
|
50
|
+
class Post < Domino
|
51
|
+
def delete
|
52
|
+
within(id) { click_button 'Delete' }
|
41
53
|
end
|
54
|
+
end
|
55
|
+
end
|
42
56
|
|
43
|
-
|
44
|
-
|
45
|
-
|
57
|
+
refute_nil Dom::Post.find_by_title('First Post')
|
58
|
+
Dom::Post.find_by_title('First Post').delete
|
59
|
+
assert_nil Dom::Post.find_by_title('First Post')
|
60
|
+
```
|
46
61
|
|
47
62
|
## Integration with capybara
|
48
63
|
|
@@ -50,15 +65,17 @@ Domino uses capybara internally to search html for nodes and
|
|
50
65
|
attributes. If you need to do something special, you can have direct
|
51
66
|
access to the capybara node.
|
52
67
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
68
|
+
```ruby
|
69
|
+
module Dom
|
70
|
+
class Account < Domino
|
71
|
+
selector "#accounts li"
|
72
|
+
# Returns this node text
|
73
|
+
def text
|
74
|
+
node.text
|
61
75
|
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
```
|
62
79
|
|
63
80
|
For more information about using Capybara nodes, check [Capybara Documentation](https://github.com/jnicklas/capybara/blob/master/README.rdoc).
|
64
81
|
|
@@ -69,12 +86,16 @@ necessary to wait for elements to appear. Note that the following code
|
|
69
86
|
simply collects all `Account` dominos currently on the page and
|
70
87
|
returns the first:
|
71
88
|
|
72
|
-
|
89
|
+
```ruby
|
90
|
+
Dom::Account.first # returns nil if account is displayed asynchronously
|
91
|
+
```
|
73
92
|
|
74
93
|
When you are waiting for a unique domino to appear, you can instead
|
75
94
|
use the `find!` method:
|
76
95
|
|
77
|
-
|
96
|
+
```ruby
|
97
|
+
Dom::Account.find! # waits for matching element to appear
|
98
|
+
```
|
78
99
|
|
79
100
|
If no matching element appears, Capybara will raise an error telling
|
80
101
|
you about the expected selector. Depending on the
|
@@ -91,7 +112,9 @@ Use them in your steps.
|
|
91
112
|
|
92
113
|
Include "domino" in your Gemfile if using bundler, or simply
|
93
114
|
|
94
|
-
|
115
|
+
```ruby
|
116
|
+
require 'domino'
|
117
|
+
```
|
95
118
|
|
96
119
|
If you're not using Bundler.
|
97
120
|
|
data/domino.gemspec
CHANGED
data/lib/domino.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'capybara/dsl'
|
2
|
+
require 'set'
|
2
3
|
# To create a basic Domino class, inherit from Domino and
|
3
4
|
# define a selector and attributes:
|
4
5
|
#
|
@@ -65,12 +66,29 @@ class Domino
|
|
65
66
|
# support asynchronous behavior, this method waits for a matching
|
66
67
|
# node to appear.
|
67
68
|
def find!
|
68
|
-
|
69
|
-
raise Domino::Error.new("You must define a selector")
|
70
|
-
end
|
69
|
+
require_selector!
|
71
70
|
new(Capybara.current_session.find(@selector))
|
72
71
|
end
|
73
72
|
|
73
|
+
# Returns Domino for capybara node matching all attributes.
|
74
|
+
def find_by(attributes)
|
75
|
+
where(attributes).first
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns Domino for capybara node matching all attributes.
|
79
|
+
#
|
80
|
+
# Raises an error if no matching node is found.
|
81
|
+
def find_by!(attributes)
|
82
|
+
find_by(attributes) or raise Capybara::ElementNotFound
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns collection of Dominos for capybara node matching all attributes.
|
86
|
+
def where(attributes)
|
87
|
+
select do |node|
|
88
|
+
attributes.to_set.subset?(node.attributes.to_set)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
74
92
|
# Define the selector for this Domino
|
75
93
|
#
|
76
94
|
# module Dom
|
@@ -130,9 +148,7 @@ class Domino
|
|
130
148
|
|
131
149
|
# Return capybara nodes for this object
|
132
150
|
def nodes
|
133
|
-
|
134
|
-
raise Domino::Error.new("You must define a selector")
|
135
|
-
end
|
151
|
+
require_selector!
|
136
152
|
Capybara.current_session.all(@selector)
|
137
153
|
end
|
138
154
|
|
@@ -140,6 +156,10 @@ class Domino
|
|
140
156
|
def find_by_attribute(selector, value)
|
141
157
|
detect{|node| value === node.attribute(selector) }
|
142
158
|
end
|
159
|
+
|
160
|
+
def require_selector!(&block)
|
161
|
+
raise Domino::Error.new("You must define a selector") if @selector.nil?
|
162
|
+
end
|
143
163
|
end
|
144
164
|
|
145
165
|
# Get the text of the first dom element matching a selector
|
data/test/domino_test.rb
CHANGED
@@ -159,4 +159,56 @@ class DominoTest < MiniTest::Unit::TestCase
|
|
159
159
|
Dom::NoSelector.find!
|
160
160
|
end
|
161
161
|
end
|
162
|
+
|
163
|
+
def test_find_by
|
164
|
+
assert_equal 'Alice', Dom::Person.find_by(biography: 'Alice is fun').name
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_find_by_with_multiple_attributes
|
168
|
+
assert_equal 'Alice', Dom::Person.find_by(biography: 'Alice is fun', age: 23, favorite_color: 'Blue').name
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_find_by_without_selector
|
172
|
+
assert_raises Domino::Error do
|
173
|
+
Dom::NoSelector.find_by(foo: "bar")
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_find_by_bang
|
178
|
+
assert_equal 'Alice', Dom::Person.find_by!(biography: 'Alice is fun').name
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_find_by_bang_with_multiple_attributes
|
182
|
+
assert_equal 'Alice', Dom::Person.find_by!(biography: 'Alice is fun', age: 23, favorite_color: 'Blue').name
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_find_by_bang_without_selector
|
186
|
+
assert_raises Domino::Error do
|
187
|
+
Dom::NoSelector.find_by(foo: "bar")
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_find_by_bang_without_match
|
192
|
+
assert_raises Capybara::ElementNotFound do
|
193
|
+
Dom::Person.find_by!(foo: "bar")
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_where_with_single_attribute
|
198
|
+
assert_equal %w(Bob Charlie), Dom::Person.where(favorite_color: "Red").map(&:name)
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_where_with_multiple_attributes
|
202
|
+
assert_equal %w(Alice), Dom::Person.where(age: 23, favorite_color: 'Blue').map(&:name)
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_where_without_match
|
206
|
+
assert_equal [], Dom::Person.where(favorite_color: "Yellow")
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_where_without_selector
|
210
|
+
assert_raises Domino::Error do
|
211
|
+
Dom::NoSelector.where(foo: "bar")
|
212
|
+
end
|
213
|
+
end
|
162
214
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: domino
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Gauthier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08
|
11
|
+
date: 2014-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capybara
|
@@ -104,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
104
|
version: '0'
|
105
105
|
requirements: []
|
106
106
|
rubyforge_project:
|
107
|
-
rubygems_version: 2.4.
|
107
|
+
rubygems_version: 2.4.2
|
108
108
|
signing_key:
|
109
109
|
specification_version: 4
|
110
110
|
summary: View abstraction for integration testing
|