cucumber-salad 0.3.0 → 0.3.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/lib/cucumber/salad.rb +1 -0
- data/lib/cucumber/salad/version.rb +1 -1
- data/lib/cucumber/salad/widget_container.rb +1 -1
- data/lib/cucumber/salad/widget_macros.rb +84 -0
- data/lib/cucumber/salad/widgets/form.rb +12 -30
- data/lib/cucumber/salad/widgets/widget.rb +16 -20
- metadata +4 -3
- data/lib/cucumber/salad/widgets/atom.rb +0 -19
data/lib/cucumber/salad.rb
CHANGED
@@ -0,0 +1,84 @@
|
|
1
|
+
module Cucumber
|
2
|
+
module Salad
|
3
|
+
module WidgetMacros
|
4
|
+
# Defines a new action.
|
5
|
+
#
|
6
|
+
# This is a shortcut to help defining a widget and a method that clicks
|
7
|
+
# on that widget. You can then send a widget instance the message given
|
8
|
+
# by +name+.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# # Consider the widget will encapsulate the following HTML
|
12
|
+
# #
|
13
|
+
# # <div id="profile">
|
14
|
+
# # <a href="/profiles/1/edit" rel="edit">Edit</a>
|
15
|
+
# # </div>
|
16
|
+
# class PirateProfile < Salad::Widget
|
17
|
+
# root "#profile"
|
18
|
+
#
|
19
|
+
# # Declare the action
|
20
|
+
# action :edit, '[rel = edit]'
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# # Click the link
|
24
|
+
# widget(:pirate_profile).edit
|
25
|
+
#
|
26
|
+
# @param name the name of the action
|
27
|
+
# @param selector the selector for the widget that will be clicked
|
28
|
+
def action(name, selector)
|
29
|
+
widget name, selector
|
30
|
+
|
31
|
+
define_method name do
|
32
|
+
widget(name).click
|
33
|
+
|
34
|
+
self
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Declares a new sub-widget.
|
39
|
+
#
|
40
|
+
# Sub-widgets are accessible inside the container widget using the
|
41
|
+
# +widget+ message.
|
42
|
+
#
|
43
|
+
# @param name the name of the sub-widget
|
44
|
+
# @param selector the sub-widget selector
|
45
|
+
# @param parent [Class] the parent class of the new sub-widget
|
46
|
+
#
|
47
|
+
# @yield A block allowing you to further customize the widget behavior.
|
48
|
+
#
|
49
|
+
# @see #widget
|
50
|
+
def widget(name, selector, parent = Widgets::Widget, &block)
|
51
|
+
type = Class.new(parent) {
|
52
|
+
root selector
|
53
|
+
|
54
|
+
instance_eval(&block) if block
|
55
|
+
}
|
56
|
+
|
57
|
+
const_set(Salad::WidgetName.new(name).to_sym, type)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Creates a delegator for one sub-widget message.
|
61
|
+
#
|
62
|
+
# Since widgets are accessed through {WidgetContainer#widget}, we can't
|
63
|
+
# use {Forwardable} to delegate messages to widgets.
|
64
|
+
#
|
65
|
+
# @param name the name of the receiver sub-widget
|
66
|
+
# @param widget_message the name of the message to be sent to the sub-widget
|
67
|
+
# @param method_name the name of the delegator. If +nil+ the method will
|
68
|
+
# have the same name as the message it will send.
|
69
|
+
def widget_delegator(name, widget_message, method_name = nil)
|
70
|
+
method_name = method_name || widget_message
|
71
|
+
|
72
|
+
class_eval <<-RUBY
|
73
|
+
def #{method_name}(*args)
|
74
|
+
if args.size == 1
|
75
|
+
widget(:#{name}).#{widget_message} args.first
|
76
|
+
else
|
77
|
+
widget(:#{name}).#{widget_message} *args
|
78
|
+
end
|
79
|
+
end
|
80
|
+
RUBY
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -32,10 +32,6 @@ module Cucumber
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
def self.submit(attrs)
|
36
|
-
new.fill_all(attrs).submit
|
37
|
-
end
|
38
|
-
|
39
35
|
def self.text_field(name, label = nil)
|
40
36
|
define_method "#{name}=" do |val|
|
41
37
|
l = label || name_to_locator(name)
|
@@ -44,42 +40,28 @@ module Cucumber
|
|
44
40
|
end
|
45
41
|
end
|
46
42
|
|
47
|
-
|
48
|
-
s = settings.dup
|
49
|
-
data = s.delete(:data) || {}
|
50
|
-
|
51
|
-
super s
|
52
|
-
|
53
|
-
fill_all data
|
54
|
-
|
55
|
-
if block_given?
|
56
|
-
yield self
|
57
|
-
|
58
|
-
submit
|
59
|
-
end
|
60
|
-
end
|
43
|
+
action :submit, '[type = submit]'
|
61
44
|
|
62
|
-
|
63
|
-
|
45
|
+
# Sets the given form attributes.
|
46
|
+
#
|
47
|
+
# @param attributes [Hash] the attributes and values we want to set.
|
48
|
+
#
|
49
|
+
# @return the current widget.
|
50
|
+
def set(attributes)
|
51
|
+
attributes.each do |k, v|
|
64
52
|
send "#{k}=", v
|
65
53
|
end
|
66
54
|
|
67
55
|
self
|
68
56
|
end
|
69
57
|
|
70
|
-
|
71
|
-
root.find('[type = "submit"]').click
|
72
|
-
|
73
|
-
self
|
74
|
-
end
|
75
|
-
|
76
|
-
# Submit form with +attrs+.
|
58
|
+
# Submit form with +attributes+.
|
77
59
|
#
|
78
60
|
# @param attrs [Hash] the form fields and their values
|
79
61
|
#
|
80
|
-
# @return
|
81
|
-
def submit_with(
|
82
|
-
|
62
|
+
# @return the current widget
|
63
|
+
def submit_with(attributes)
|
64
|
+
set attributes
|
83
65
|
submit
|
84
66
|
end
|
85
67
|
|
@@ -3,43 +3,39 @@ module Cucumber
|
|
3
3
|
module Widgets
|
4
4
|
class Widget
|
5
5
|
extend Forwardable
|
6
|
+
extend WidgetMacros
|
6
7
|
|
7
|
-
include Salad::Conversions
|
8
8
|
include WidgetContainer
|
9
9
|
|
10
|
-
def self.action(name, selector, parent = Widget)
|
11
|
-
widget name, selector, parent
|
12
|
-
|
13
|
-
define_method name do
|
14
|
-
widget(name).click
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
10
|
def self.has_instance?(parent_node)
|
19
11
|
parent_node.has_selector?(selector)
|
20
12
|
end
|
21
13
|
|
22
|
-
|
14
|
+
# Finds a single instance of the current widget in +node+.
|
15
|
+
#
|
16
|
+
# @param node the node we want to search in
|
17
|
+
#
|
18
|
+
# @return a new instance of the current widget class.
|
19
|
+
#
|
20
|
+
# @raise [Capybara::ElementNotFoundError] if the widget can't be found
|
21
|
+
def self.find_in(node, options = {})
|
23
22
|
new(options.merge(root: node.find(selector)))
|
24
23
|
end
|
25
24
|
|
25
|
+
# Sets this widget's default selector.
|
26
|
+
#
|
27
|
+
# @param selector [String] a CSS or XPath query
|
26
28
|
def self.root(selector)
|
27
29
|
@selector = selector
|
28
30
|
end
|
29
31
|
|
32
|
+
# @return The selector specified with +root+.
|
30
33
|
def self.selector
|
31
34
|
@selector
|
32
35
|
end
|
33
36
|
|
34
|
-
|
35
|
-
|
36
|
-
root selector
|
37
|
-
|
38
|
-
instance_eval(&block) if block
|
39
|
-
}
|
40
|
-
|
41
|
-
const_set(Salad::WidgetName.new(name).to_sym, type)
|
42
|
-
end
|
37
|
+
# @return The root node of the current widget
|
38
|
+
attr_reader :root
|
43
39
|
|
44
40
|
def_delegators :root, :click
|
45
41
|
|
@@ -68,7 +64,7 @@ module Cucumber
|
|
68
64
|
|
69
65
|
private
|
70
66
|
|
71
|
-
|
67
|
+
attr_writer :root
|
72
68
|
|
73
69
|
def page
|
74
70
|
Capybara.current_session
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: cucumber-salad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.3.
|
5
|
+
version: 0.3.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- David Leal
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-07-
|
12
|
+
date: 2013-07-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -111,9 +111,9 @@ files:
|
|
111
111
|
- lib/cucumber/salad/table/void_mapping.rb
|
112
112
|
- lib/cucumber/salad/version.rb
|
113
113
|
- lib/cucumber/salad/widget_container.rb
|
114
|
+
- lib/cucumber/salad/widget_macros.rb
|
114
115
|
- lib/cucumber/salad/widget_name.rb
|
115
116
|
- lib/cucumber/salad/widgets.rb
|
116
|
-
- lib/cucumber/salad/widgets/atom.rb
|
117
117
|
- lib/cucumber/salad/widgets/auto_table.rb
|
118
118
|
- lib/cucumber/salad/widgets/base_table.rb
|
119
119
|
- lib/cucumber/salad/widgets/document.rb
|
@@ -146,3 +146,4 @@ signing_key:
|
|
146
146
|
specification_version: 3
|
147
147
|
summary: A set of helpers to ease writing cucumber features
|
148
148
|
test_files: []
|
149
|
+
has_rdoc:
|