capybara-widgets 0.0.1 → 0.0.2
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/lib/capybara/widgets/core/page.rb +12 -1
- data/lib/capybara/widgets/core/widget.rb +14 -0
- data/lib/capybara/widgets/cucumber/page_steps.rb +22 -0
- data/lib/capybara/widgets/cucumber/widget_steps.rb +74 -47
- data/lib/capybara/widgets/cucumber.rb +2 -0
- data/lib/capybara/widgets/helpers/string_helpers.rb +13 -2
- data/lib/capybara/widgets/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4486c4e504621dc18e76de0e990848aad563d821
|
4
|
+
data.tar.gz: 055b95ae49d0a92266c13dc62e3cec6a444392f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00fd373bc52d8be429a29602db3ba2353e6a69e5962d10e926de7abd15efda38f5ddef8fc87e3c83acf8eb5d13472c20e05fcc3a77137adae6a3488e48fa5b97
|
7
|
+
data.tar.gz: 50343fac4b224bf14bb6a086ef1673e1ddcdb0d4ba5578270ebee01f1a78d917bc1d1537812f4d230a8cbb19e9b865cd153f7478ba2170f4bce23af8bc094686
|
@@ -3,7 +3,6 @@ require 'active_support/core_ext/class/attribute'
|
|
3
3
|
|
4
4
|
module Capybara
|
5
5
|
module Widgets
|
6
|
-
|
7
6
|
class Page < Widget
|
8
7
|
|
9
8
|
class_attribute :path
|
@@ -12,8 +11,20 @@ module Capybara
|
|
12
11
|
super(page)
|
13
12
|
end
|
14
13
|
|
14
|
+
def loaded?
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
15
18
|
def reload!
|
16
19
|
visit(current_url)
|
20
|
+
loaded?
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def open!
|
25
|
+
visit(self.path)
|
26
|
+
loaded?
|
27
|
+
self
|
17
28
|
end
|
18
29
|
end
|
19
30
|
end
|
@@ -32,6 +32,14 @@ module Capybara
|
|
32
32
|
@root
|
33
33
|
end
|
34
34
|
|
35
|
+
def element(*query)
|
36
|
+
root.find(*query)
|
37
|
+
end
|
38
|
+
|
39
|
+
def has_element?(*query)
|
40
|
+
root.has_selector?(*query)
|
41
|
+
end
|
42
|
+
|
35
43
|
class << self
|
36
44
|
def component(name, klass, *query)
|
37
45
|
define_method name do
|
@@ -39,6 +47,12 @@ module Capybara
|
|
39
47
|
klass.new(component_root)
|
40
48
|
end
|
41
49
|
end
|
50
|
+
|
51
|
+
def element(name, *query)
|
52
|
+
define_method("#{name}!") { root.find(*query).click }
|
53
|
+
define_method("#{name}=") { |arg| root.find(*query).set(arg) }
|
54
|
+
define_method("has_#{name}?") { root.has_selector?(*query) }
|
55
|
+
end
|
42
56
|
end
|
43
57
|
|
44
58
|
# delegate missing methods to the @root node
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'cucumber'
|
2
|
+
require_relative '../helpers/string_helpers'
|
3
|
+
|
4
|
+
World Capybara::Widgets::StringHelpers
|
5
|
+
|
6
|
+
Given(/^I am on a (.* page)/) do |page_name|
|
7
|
+
within_widget(to_widget_class(page_name)) do |page|
|
8
|
+
page.open!
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
When(/^I navigate to a (.* page)/) do |page_name|
|
13
|
+
within_widget(to_widget_class(page_name)) do |page|
|
14
|
+
page.open!
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Then(/^I should be on a (.* page)/) do |page_name|
|
19
|
+
within_widget(to_widget_class(page_name)) do |page|
|
20
|
+
expect(page).to be_opened
|
21
|
+
end
|
22
|
+
end
|
@@ -1,61 +1,88 @@
|
|
1
|
-
|
1
|
+
require 'cucumber'
|
2
|
+
require_relative '../helpers/string_helpers'
|
2
3
|
|
3
|
-
|
4
|
+
World Capybara::Widgets::StringHelpers
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
def within_widget(klass)
|
7
|
+
raise "#{klass.name} is not a subclass of Widget" unless klass < Capybara::Widgets::Widget
|
8
|
+
yield klass.new
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
11
|
+
def resolve_widget(widget_chain)
|
12
|
+
elements = widget_chain.split('->')
|
13
|
+
widget_klass = to_widget_class(elements[0])
|
14
|
+
action_chain = elements[1..-1].map { |e| to_widget_action(e) }
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
if negated
|
20
|
-
expect(widget).to be_not_displayed, "#{widget_class} should not be displayed"
|
21
|
-
else
|
22
|
-
expect(widget).to be_displayed, "#{widget_class} should be displayed"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
16
|
+
top_widget = widget_klass.new
|
17
|
+
apply_action_chain(top_widget, action_chain)
|
18
|
+
end
|
26
19
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
20
|
+
When(/^I click "([^"]*)" in a "([^"]*)"$/) do |action, widget_path|
|
21
|
+
target_widget = resolve_widget(widget_path)
|
22
|
+
target_widget.send(to_widget_action(action, '!'))
|
23
|
+
end
|
32
24
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
25
|
+
Then(/^the "([^"]*)" should( not)? be displayed$/) do |widget_path, negated|
|
26
|
+
target_widget = resolve_widget(widget_path)
|
27
|
+
if negated
|
28
|
+
expect(target_widget).to be_not_displayed, "#{target_widget} should not be displayed"
|
29
|
+
else
|
30
|
+
expect(target_widget).to be_displayed, "#{target_widget} should be displayed"
|
39
31
|
end
|
32
|
+
end
|
33
|
+
|
34
|
+
When(/^I set "([^"]*)" to "([^"]*)" in a "([^"]*)"$/) do |field_name, value, widget_path|
|
35
|
+
target_widget = resolve_widget(widget_path)
|
36
|
+
target_widget.send(to_widget_action(field_name, '='), value)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Example:
|
40
|
+
# I open "My Report" from a "Reports page"
|
41
|
+
# is mapped to:
|
42
|
+
# ReportsPage.new.open!("My Report")
|
43
|
+
When(/^I (.*) "([^"]*)" from a "([^"]*)"$/) do |action_name, action_param, widget_path|
|
44
|
+
target_widget = resolve_widget(widget_path)
|
45
|
+
target_widget.send(to_widget_action(action_name, '!'), action_param)
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
And(/^I should see the following "([^"]*)" in a "([^"]*)"$/) do |field_name, widget_path, table|
|
50
|
+
expected_values = table.raw.flatten
|
51
|
+
target_widget = resolve_widget(widget_path)
|
52
|
+
actual_values = target_widget.send(to_widget_action(field_name))
|
53
|
+
expect(actual_values).to eq(expected_values)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Expectation. Examples:
|
57
|
+
# I should see "Do it" action on a "My page"
|
58
|
+
# is mapped to: expect(MyPage.new).to have_action("Do it")
|
59
|
+
# I should not see "Do it" action in a "My widget"
|
60
|
+
# is mapped to: expect(MyWidget.new).to have_no_action("Do it")
|
61
|
+
# I should see "Do it" value in a "My page -> page component"
|
62
|
+
# is mapped to: expect(MyPage.new.page_component).to have_value("Do it")
|
63
|
+
And(/^I should( not)? see "([^"]*)" (.*) (?:in|on) a "([^"]*)"$/) do |negated, content, widget_action, widget_path|
|
64
|
+
negation_prefix = (negated && negated.length > 0) ? 'no_' : ''
|
65
|
+
target_widget = resolve_widget(widget_path)
|
66
|
+
expect(target_widget).to send("have_#{negation_prefix}#{to_widget_action(widget_action)}", content)
|
67
|
+
end
|
40
68
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
69
|
+
When(/^I fill in the following in a "([^"]*)"$/) do |widget_name, table|
|
70
|
+
fields = table.rows_hash
|
71
|
+
within_widget(to_widget_class(widget_name)) do |widget|
|
72
|
+
fields.each do |k, v|
|
73
|
+
widget.send(to_widget_action(k, '='), v)
|
47
74
|
end
|
48
75
|
end
|
76
|
+
end
|
49
77
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
78
|
+
And(/^the "([^"]*)" should be "([^"]*)" in a "([^"]*)"$/) do |field_name, expected, widget_name|
|
79
|
+
within_widget(to_widget_class(widget_name)) do |widget|
|
80
|
+
action = to_widget_action(field_name)
|
81
|
+
if widget.respond_to? "has_#{action}?"
|
82
|
+
expect(widget.send("has_#{action}?", expected)).to be_true
|
83
|
+
else
|
84
|
+
actual = widget.send(action)
|
85
|
+
expect(actual).to eq(expected)
|
59
86
|
end
|
60
87
|
end
|
61
88
|
end
|
@@ -1,9 +1,20 @@
|
|
1
|
+
require 'active_support/core_ext/string/inflections'
|
2
|
+
|
1
3
|
module Capybara::Widgets::StringHelpers
|
2
4
|
def to_widget_class(name)
|
3
|
-
name.to_s.gsub(' ','_').classify.constantize
|
5
|
+
name.to_s.strip.gsub(' ','_').classify.constantize
|
4
6
|
end
|
5
7
|
|
6
8
|
def to_widget_action(name, suffix=nil)
|
7
|
-
"#{name.to_s.downcase.gsub(' ','_')}#{suffix}"
|
9
|
+
"#{name.to_s.strip.downcase.gsub(' ','_')}#{suffix}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def apply_action_chain(widget, chain)
|
13
|
+
if chain.length > 0
|
14
|
+
next_widget = widget.send(chain[0])
|
15
|
+
return apply_action_chain(next_widget, chain[1..-1])
|
16
|
+
else
|
17
|
+
return widget
|
18
|
+
end
|
8
19
|
end
|
9
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara-widgets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vitalii Grygoruk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -110,6 +110,8 @@ files:
|
|
110
110
|
- lib/capybara/widgets.rb
|
111
111
|
- lib/capybara/widgets/core/page.rb
|
112
112
|
- lib/capybara/widgets/core/widget.rb
|
113
|
+
- lib/capybara/widgets/cucumber.rb
|
114
|
+
- lib/capybara/widgets/cucumber/page_steps.rb
|
113
115
|
- lib/capybara/widgets/cucumber/widget_steps.rb
|
114
116
|
- lib/capybara/widgets/helpers/string_helpers.rb
|
115
117
|
- lib/capybara/widgets/version.rb
|