-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
matchers.rb
154 lines (125 loc) · 3.6 KB
/
matchers.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
module Capybara
module RSpecMatchers
class HaveSelector
def initialize(*args)
@args = args
end
def matches?(actual)
@actual = wrap(actual)
@actual.has_selector?(*@args)
end
def does_not_match?(actual)
@actual = wrap(actual)
@actual.has_no_selector?(*@args)
end
def failure_message_for_should
if normalized.failure_message
normalized.failure_message.call(@actual, normalized)
else
"expected #{selector_name} to return something"
end
end
def failure_message_for_should_not
"expected #{selector_name} not to return anything"
end
def description
"has #{selector_name}"
end
def selector_name
name = "#{normalized.name} #{normalized.locator.inspect}"
name << " with text #{normalized.options[:text].inspect}" if normalized.options[:text]
name
end
def wrap(actual)
if actual.respond_to?("has_selector?")
actual
else
Capybara.string(actual.to_s)
end
end
def normalized
@normalized ||= Capybara::Selector.normalize(*@args)
end
end
class HaveMatcher
attr_reader :name, :locator, :options, :failure_message, :actual
def initialize(name, locator, options={}, &block)
@name = name
@locator = locator
@options = options
@failure_message = block
end
def arguments
if options.empty? then [locator] else [locator, options] end
end
def matches?(actual)
@actual = wrap(actual)
@actual.send(:"has_#{name}?", *arguments)
end
def does_not_match?(actual)
@actual = wrap(actual)
@actual.send(:"has_no_#{name}?", *arguments)
end
def failure_message_for_should
if failure_message
failure_message.call(actual, self)
else
"expected #{selector_name} to return something"
end
end
def failure_message_for_should_not
"expected #{selector_name} not to return anything"
end
def description
"has #{selector_name}"
end
def selector_name
selector_name = "#{name} #{locator.inspect}"
selector_name << " with text #{options[:text].inspect}" if options[:text]
selector_name
end
def wrap(actual)
if actual.respond_to?("has_selector?")
actual
else
Capybara.string(actual.to_s)
end
end
end
def have_selector(*args)
HaveSelector.new(*args)
end
def have_xpath(xpath, options={})
HaveMatcher.new(:xpath, xpath, options)
end
def have_css(css, options={})
HaveMatcher.new(:css, css, options)
end
def have_content(text)
HaveMatcher.new(:content, text.to_s) do |page, matcher|
%(expected there to be content #{matcher.locator.inspect} in #{page.text.inspect})
end
end
def have_link(locator, options={})
HaveMatcher.new(:link, locator, options)
end
def have_button(locator)
HaveMatcher.new(:button, locator)
end
def have_field(locator, options={})
HaveMatcher.new(:field, locator, options)
end
def have_checked_field(locator)
HaveMatcher.new(:checked_field, locator)
end
def have_unchecked_field(locator)
HaveMatcher.new(:unchecked_field, locator)
end
def have_select(locator, options={})
HaveMatcher.new(:select, locator, options)
end
def have_table(locator, options={})
HaveMatcher.new(:table, locator, options)
end
end
end