howitzer 2.0.1 → 2.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/.rubocop.yml +6 -0
- data/.travis.yml +4 -3
- data/CHANGELOG.md +18 -1
- data/Gemfile +1 -1
- data/README.md +3 -1
- data/Rakefile +1 -1
- data/bin/howitzer +3 -3
- data/features/cli_new.feature +2 -0
- data/generators/config/templates/capybara.rb +13 -11
- data/generators/config/templates/default.yml +2 -0
- data/generators/cucumber/cucumber_generator.rb +2 -1
- data/generators/cucumber/templates/cuke_sniffer.rake +21 -0
- data/generators/cucumber/templates/env.rb +6 -0
- data/generators/root/templates/Gemfile.erb +1 -0
- data/generators/rspec/templates/spec_helper.rb +2 -1
- data/generators/turnip/templates/spec_helper.rb +2 -1
- data/howitzer.gemspec +2 -1
- data/lib/howitzer.rb +1 -0
- data/lib/howitzer/capybara_helpers.rb +1 -1
- data/lib/howitzer/exceptions.rb +1 -0
- data/lib/howitzer/version.rb +1 -1
- data/lib/howitzer/web/capybara_methods_proxy.rb +26 -1
- data/lib/howitzer/web/element_dsl.rb +16 -3
- data/lib/howitzer/web/iframe_dsl.rb +34 -17
- data/lib/howitzer/web/page.rb +1 -0
- data/lib/howitzer/web/page_dsl.rb +2 -1
- data/lib/howitzer/web/page_validator.rb +5 -1
- data/spec/spec_helper.rb +1 -2
- data/spec/support/shared_examples/capybara_methods_proxy.rb +8 -8
- data/spec/support/shared_examples/dynamic_section_methods.rb +4 -4
- data/spec/support/shared_examples/element_dsl.rb +66 -53
- data/spec/unit/generators/cucumber_generator_spec.rb +8 -2
- data/spec/unit/lib/cache_spec.rb +1 -1
- data/spec/unit/lib/mailgun_api/client_spec.rb +6 -6
- data/spec/unit/lib/web/iframe_dsl_spec.rb +67 -22
- data/spec/unit/lib/web/page_spec.rb +25 -25
- data/spec/unit/lib/web/page_validator_spec.rb +37 -22
- data/spec/unit/lib/web/section_dsl_spec.rb +3 -3
- metadata +20 -5
data/lib/howitzer/web/page.rb
CHANGED
@@ -5,6 +5,7 @@ module Howitzer
|
|
5
5
|
# This class is for private usage only
|
6
6
|
class PageScope
|
7
7
|
include RSpec::Matchers
|
8
|
+
include RSpec::Wait
|
8
9
|
|
9
10
|
def initialize(page_klass, &block)
|
10
11
|
self.page_klass = page_klass
|
@@ -38,7 +39,7 @@ module Howitzer
|
|
38
39
|
# @see #method_missing
|
39
40
|
|
40
41
|
def respond_to_missing?(name, include_private = false)
|
41
|
-
|
42
|
+
name !~ /\A(?:be|have)_/ || super
|
42
43
|
end
|
43
44
|
|
44
45
|
private
|
@@ -21,7 +21,6 @@ module Howitzer
|
|
21
21
|
|
22
22
|
def check_validations_are_defined!
|
23
23
|
return if self.class.validations.present?
|
24
|
-
|
25
24
|
raise Howitzer::NoValidationError, "No any page validation was found for '#{self.class.name}' page"
|
26
25
|
end
|
27
26
|
|
@@ -34,6 +33,7 @@ module Howitzer
|
|
34
33
|
# For :element_presence must be one of element names described for page
|
35
34
|
# @param additional_value [Object, nil] any value required to pass for a labmda selector
|
36
35
|
# @raise [Howitzer::UnknownValidationError] if unknown validation type
|
36
|
+
# @raise [Howitzer::UndefinedElementError] if :element_presence validations refers to undefined element name
|
37
37
|
# @example
|
38
38
|
# class ArticleListPage < Howitzer::Web::Page
|
39
39
|
# validate :title, /\ADemo web application - Listing Articles\z/
|
@@ -81,6 +81,10 @@ module Howitzer
|
|
81
81
|
def validate_element(element_name, value = nil)
|
82
82
|
validations[:element_presence] =
|
83
83
|
lambda do |web_page, sync|
|
84
|
+
if element_name.present? && !private_method_defined?("#{element_name}_element")
|
85
|
+
raise(Howitzer::UndefinedElementError, ':element_presence validation refers to ' \
|
86
|
+
"undefined '#{element_name}' element on '#{name}' page.")
|
87
|
+
end
|
84
88
|
if sync
|
85
89
|
web_page.instance.public_send(*["has_#{element_name}_element?", value].compact)
|
86
90
|
else
|
data/spec/spec_helper.rb
CHANGED
@@ -47,10 +47,10 @@ RSpec.shared_examples :capybara_methods_proxy do
|
|
47
47
|
let(:switch_to) { double }
|
48
48
|
let(:driver_name) { 'selenium' }
|
49
49
|
it do
|
50
|
-
expect(session).to receive(:driver).ordered
|
51
|
-
expect(driver).to receive(:browser).ordered
|
52
|
-
expect(browser).to receive(:switch_to).ordered
|
53
|
-
expect(switch_to).to receive(:alert).ordered
|
50
|
+
expect(session).to receive(:driver).ordered.and_return(driver)
|
51
|
+
expect(driver).to receive(:browser).ordered.and_return(browser)
|
52
|
+
expect(browser).to receive(:switch_to).ordered.and_return(switch_to)
|
53
|
+
expect(switch_to).to receive(:alert).ordered.and_return(alert)
|
54
54
|
expect(alert).to receive(:accept).once
|
55
55
|
subject
|
56
56
|
end
|
@@ -64,10 +64,10 @@ RSpec.shared_examples :capybara_methods_proxy do
|
|
64
64
|
let(:switch_to) { double }
|
65
65
|
let(:driver_name) { 'selenium' }
|
66
66
|
it do
|
67
|
-
expect(session).to receive(:driver).ordered
|
68
|
-
expect(driver).to receive(:browser).ordered
|
69
|
-
expect(browser).to receive(:switch_to).ordered
|
70
|
-
expect(switch_to).to receive(:alert).ordered
|
67
|
+
expect(session).to receive(:driver).ordered.and_return(driver)
|
68
|
+
expect(driver).to receive(:browser).ordered.and_return(browser)
|
69
|
+
expect(browser).to receive(:switch_to).ordered.and_return(switch_to)
|
70
|
+
expect(switch_to).to receive(:alert).ordered.and_return(alert)
|
71
71
|
expect(alert).to receive(:dismiss).once
|
72
72
|
subject
|
73
73
|
end
|
@@ -5,7 +5,7 @@ RSpec.shared_examples :dynamic_section_methods do
|
|
5
5
|
describe '#name_section' do
|
6
6
|
let(:capybara_element) { double }
|
7
7
|
subject { web_page_object.send("#{section_name}_section") }
|
8
|
-
before { expect(session).to receive(:find).with(*finder_args).once
|
8
|
+
before { expect(session).to receive(:find).with(*finder_args).once.and_return(capybara_element) }
|
9
9
|
it { is_expected.to be_a(section_class) }
|
10
10
|
end
|
11
11
|
describe '#name_sections' do
|
@@ -13,7 +13,7 @@ RSpec.shared_examples :dynamic_section_methods do
|
|
13
13
|
let(:capybara_element1) { double }
|
14
14
|
let(:capybara_element2) { double }
|
15
15
|
before do
|
16
|
-
expect(session).to receive(:all).with(*finder_args).once
|
16
|
+
expect(session).to receive(:all).with(*finder_args).once.and_return([capybara_element1, capybara_element2])
|
17
17
|
end
|
18
18
|
it 'should return collection of sections' do
|
19
19
|
res = subject
|
@@ -24,12 +24,12 @@ RSpec.shared_examples :dynamic_section_methods do
|
|
24
24
|
end
|
25
25
|
describe '#has_name_section?' do
|
26
26
|
subject { web_page_object.send("has_#{section_name}_section?") }
|
27
|
-
before { expect(session).to receive(:has_selector?).with(*finder_args).once
|
27
|
+
before { expect(session).to receive(:has_selector?).with(*finder_args).once.and_return(true) }
|
28
28
|
it { is_expected.to eq(true) }
|
29
29
|
end
|
30
30
|
describe '#has_no_name_element?' do
|
31
31
|
subject { web_page_object.send("has_no_#{section_name}_section?") }
|
32
|
-
before { expect(session).to receive(:has_no_selector?).with(*finder_args).once
|
32
|
+
before { expect(session).to receive(:has_no_selector?).with(*finder_args).once.and_return(true) }
|
33
33
|
it { is_expected.to eq(true) }
|
34
34
|
end
|
35
35
|
end
|
@@ -75,38 +75,39 @@ RSpec.shared_examples :element_dsl do
|
|
75
75
|
before do
|
76
76
|
allow(Capybara).to receive(:current_session) { kontext }
|
77
77
|
klass.class_eval do
|
78
|
-
element :foo, :xpath,
|
79
|
-
|
80
|
-
element :
|
78
|
+
element :foo, :xpath,
|
79
|
+
->(title, name) { "//a[.='#{title}']/*[@name='#{name}']" }, text: 'original', match: :first
|
80
|
+
element :bar, '.someclass', text: 'origin', match: :first
|
81
|
+
element :top_panel, '.top', text: 'origin', match: :first
|
81
82
|
end
|
82
83
|
end
|
83
84
|
|
84
85
|
describe '#name_element' do
|
85
86
|
context 'when simple selector' do
|
86
|
-
subject { klass_object.send(:bar_element, wait: 10) }
|
87
|
+
subject { klass_object.send(:bar_element, text: 'new', wait: 10) }
|
87
88
|
after { subject }
|
88
|
-
it
|
89
|
+
it do
|
90
|
+
expect(klass_object.capybara_context).to receive(:find)
|
91
|
+
.with('.someclass', wait: 10, text: 'new', match: :first)
|
92
|
+
end
|
89
93
|
end
|
90
94
|
context 'when lambda selector' do
|
91
|
-
subject { klass_object.send(:foo_element, 'Hello', 'super', wait: 10) }
|
95
|
+
subject { klass_object.send(:foo_element, 'Hello', 'super', text: 'new', wait: 10) }
|
92
96
|
after { subject }
|
93
97
|
it do
|
94
|
-
expect(
|
95
|
-
|
96
|
-
).to receive(:find).with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10)
|
98
|
+
expect(klass_object.capybara_context).to receive(:find)
|
99
|
+
.with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10, text: 'new', match: :first)
|
97
100
|
end
|
98
101
|
|
99
102
|
context 'when several execution with different data' do
|
100
103
|
it 'does not cache previous data' do
|
101
|
-
expect(
|
102
|
-
|
103
|
-
|
104
|
-
klass_object.send(:foo_element, 'Hello', 'super', wait: 10)
|
104
|
+
expect(klass_object.capybara_context).to receive(:find)
|
105
|
+
.with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10, text: 'new', match: :first).at_least(:once)
|
106
|
+
klass_object.send(:foo_element, 'Hello', 'super', text: 'new', wait: 10)
|
105
107
|
|
106
|
-
expect(
|
107
|
-
|
108
|
-
|
109
|
-
klass_object.send(:foo_element, 'Bye', 'puper', wait: 15)
|
108
|
+
expect(klass_object.capybara_context).to receive(:find)
|
109
|
+
.with(:xpath, "//a[.='Bye']/*[@name='puper']", wait: 15, text: 'new', match: :first).at_least(:once)
|
110
|
+
klass_object.send(:foo_element, 'Bye', 'puper', text: 'new', wait: 15)
|
110
111
|
end
|
111
112
|
end
|
112
113
|
end
|
@@ -114,32 +115,36 @@ RSpec.shared_examples :element_dsl do
|
|
114
115
|
describe '#name_elements' do
|
115
116
|
after { subject }
|
116
117
|
context 'when simple selector' do
|
117
|
-
subject { klass_object.send(:bar_elements, wait: 10) }
|
118
|
-
it
|
118
|
+
subject { klass_object.send(:bar_elements, text: 'new', wait: 10) }
|
119
|
+
it do
|
120
|
+
expect(klass_object.capybara_context).to receive(:all)
|
121
|
+
.with('.someclass', wait: 10, text: 'new', match: :first)
|
122
|
+
end
|
119
123
|
end
|
120
124
|
context 'when lambda selector' do
|
121
|
-
subject { klass_object.send(:foo_elements, 'Hello', 'super', wait: 10) }
|
125
|
+
subject { klass_object.send(:foo_elements, 'Hello', 'super', text: 'new', wait: 10) }
|
122
126
|
it do
|
123
127
|
expect(
|
124
128
|
klass_object.capybara_context
|
125
|
-
).to receive(:all).with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10)
|
129
|
+
).to receive(:all).with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10, text: 'new', match: :first)
|
126
130
|
end
|
127
131
|
end
|
128
132
|
end
|
129
133
|
describe '#wait_for_name_element' do
|
130
134
|
context 'when simple selector' do
|
131
|
-
subject { klass_object.send(:wait_for_bar_element, wait: 10) }
|
135
|
+
subject { klass_object.send(:wait_for_bar_element, text: 'new', wait: 10) }
|
132
136
|
it do
|
133
|
-
expect(klass_object.capybara_context).to receive(:find)
|
137
|
+
expect(klass_object.capybara_context).to receive(:find)
|
138
|
+
.with('.someclass', wait: 10, text: 'new', match: :first)
|
134
139
|
is_expected.to eq(nil)
|
135
140
|
end
|
136
141
|
end
|
137
142
|
context 'when lambda selector' do
|
138
|
-
subject { klass_object.send(:wait_for_foo_element, 'Hello', 'super', wait: 10) }
|
143
|
+
subject { klass_object.send(:wait_for_foo_element, 'Hello', 'super', text: 'new', wait: 10) }
|
139
144
|
it do
|
140
145
|
expect(
|
141
146
|
klass_object.capybara_context
|
142
|
-
).to receive(:find).with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10)
|
147
|
+
).to receive(:find).with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10, text: 'new', match: :first)
|
143
148
|
is_expected.to eq(nil)
|
144
149
|
end
|
145
150
|
end
|
@@ -151,29 +156,30 @@ RSpec.shared_examples :element_dsl do
|
|
151
156
|
context 'when simple selector' do
|
152
157
|
subject do
|
153
158
|
klass_object.instance_eval do
|
154
|
-
within_bar_element(wait:
|
155
|
-
foo_element('Hello', 'super', wait: 10)
|
159
|
+
within_bar_element(wait: 5, text: 'new') do
|
160
|
+
foo_element('Hello', 'super', wait: 10, text: 'new')
|
156
161
|
end
|
157
162
|
end
|
158
163
|
end
|
159
164
|
it do
|
160
|
-
expect(klass_object.capybara_context).to receive(:find)
|
161
|
-
|
165
|
+
expect(klass_object.capybara_context).to receive(:find)
|
166
|
+
.with('.someclass', wait: 5, text: 'new', match: :first) { within_scope }
|
167
|
+
expect(within_scope).to receive(:find)
|
168
|
+
.with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10, text: 'new', match: :first)
|
162
169
|
end
|
163
170
|
end
|
164
171
|
context 'when lambda selector' do
|
165
172
|
subject do
|
166
173
|
klass_object.instance_eval do
|
167
|
-
within_foo_element('Hello', 'super', wait: 10) do
|
168
|
-
bar_element(wait: 10)
|
174
|
+
within_foo_element('Hello', 'super', wait: 10, text: 'new') do
|
175
|
+
bar_element(wait: 10, text: 'new')
|
169
176
|
end
|
170
177
|
end
|
171
178
|
end
|
172
179
|
it do
|
173
|
-
expect(
|
174
|
-
|
175
|
-
).to receive(:find).with(
|
176
|
-
expect(within_scope).to receive(:find).with('.someclass', wait: 10)
|
180
|
+
expect(klass_object.capybara_context).to receive(:find)
|
181
|
+
.with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10, text: 'new', match: :first) { within_scope }
|
182
|
+
expect(within_scope).to receive(:find).with('.someclass', wait: 10, text: 'new', match: :first)
|
177
183
|
end
|
178
184
|
end
|
179
185
|
end
|
@@ -181,47 +187,54 @@ RSpec.shared_examples :element_dsl do
|
|
181
187
|
let(:nested_within_scope) { double }
|
182
188
|
subject do
|
183
189
|
klass_object.instance_eval do
|
184
|
-
within_top_panel_element(wait: 10) do
|
185
|
-
within_bar_element(wait: 10) do
|
186
|
-
foo_element('Hello', 'super', wait: 10)
|
190
|
+
within_top_panel_element(wait: 10, text: 'new') do
|
191
|
+
within_bar_element(wait: 10, text: 'new') do
|
192
|
+
foo_element('Hello', 'super', wait: 10, text: 'new')
|
187
193
|
end
|
188
194
|
end
|
189
195
|
end
|
190
196
|
end
|
191
197
|
it do
|
192
|
-
expect(klass_object.capybara_context).to receive(:find)
|
193
|
-
|
194
|
-
expect(
|
198
|
+
expect(klass_object.capybara_context).to receive(:find)
|
199
|
+
.with('.top', wait: 10, text: 'new', match: :first) { within_scope }
|
200
|
+
expect(within_scope).to receive(:find)
|
201
|
+
.with('.someclass', wait: 10, text: 'new', match: :first) { nested_within_scope }
|
202
|
+
expect(nested_within_scope).to receive(:find)
|
203
|
+
.with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10, text: 'new', match: :first)
|
195
204
|
end
|
196
205
|
end
|
197
206
|
end
|
198
207
|
describe '#has_name_element?' do
|
199
208
|
after { subject }
|
200
209
|
context 'when simple selector' do
|
201
|
-
subject { klass_object.send(:has_bar_element?, wait: 10) }
|
202
|
-
it
|
210
|
+
subject { klass_object.send(:has_bar_element?, wait: 10, text: 'new') }
|
211
|
+
it do
|
212
|
+
expect(klass_object.capybara_context).to receive(:has_selector?)
|
213
|
+
.with('.someclass', wait: 10, text: 'new', match: :first)
|
214
|
+
end
|
203
215
|
end
|
204
216
|
context 'when lambda selector' do
|
205
|
-
subject { klass_object.send(:has_foo_element?, 'Hello', 'super', wait: 10) }
|
217
|
+
subject { klass_object.send(:has_foo_element?, 'Hello', 'super', wait: 10, text: 'new') }
|
206
218
|
it do
|
207
|
-
expect(
|
208
|
-
|
209
|
-
).to receive(:has_selector?).with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10)
|
219
|
+
expect(klass_object.capybara_context).to receive(:has_selector?)
|
220
|
+
.with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10, text: 'new', match: :first)
|
210
221
|
end
|
211
222
|
end
|
212
223
|
end
|
213
224
|
describe '#has_no_name_element?' do
|
214
225
|
after { subject }
|
215
226
|
context 'when simple selector' do
|
216
|
-
subject { klass_object.send(:has_no_bar_element?, wait: 10) }
|
217
|
-
it
|
227
|
+
subject { klass_object.send(:has_no_bar_element?, wait: 10, text: 'new') }
|
228
|
+
it do
|
229
|
+
expect(klass_object.capybara_context).to receive(:has_no_selector?)
|
230
|
+
.with('.someclass', wait: 10, text: 'new', match: :first)
|
231
|
+
end
|
218
232
|
end
|
219
233
|
context 'when lambda selector' do
|
220
|
-
subject { klass_object.send(:has_no_foo_element?, 'Hello', 'super', wait: 10) }
|
234
|
+
subject { klass_object.send(:has_no_foo_element?, 'Hello', 'super', wait: 10, text: 'new', match: :first) }
|
221
235
|
it do
|
222
|
-
expect(
|
223
|
-
|
224
|
-
).to receive(:has_no_selector?).with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10)
|
236
|
+
expect(klass_object.capybara_context).to receive(:has_no_selector?)
|
237
|
+
.with(:xpath, "//a[.='Hello']/*[@name='super']", wait: 10, text: 'new', match: :first)
|
225
238
|
end
|
226
239
|
end
|
227
240
|
end
|
@@ -35,7 +35,12 @@ RSpec.describe 'Generators' do
|
|
35
35
|
size: template_file_size('cucumber', 'transformers.rb')
|
36
36
|
},
|
37
37
|
{ name: '/tasks', is_directory: true },
|
38
|
-
{ name: '/tasks/cucumber.rake', is_directory: false, size: template_file_size('cucumber', 'cucumber.rake') }
|
38
|
+
{ name: '/tasks/cucumber.rake', is_directory: false, size: template_file_size('cucumber', 'cucumber.rake') },
|
39
|
+
{
|
40
|
+
name: '/tasks/cuke_sniffer.rake',
|
41
|
+
is_directory: false,
|
42
|
+
size: template_file_size('cucumber', 'cuke_sniffer.rake')
|
43
|
+
}
|
39
44
|
]
|
40
45
|
end
|
41
46
|
it { is_expected.to eql(expected_result) }
|
@@ -47,7 +52,8 @@ RSpec.describe 'Generators' do
|
|
47
52
|
Added 'features/support/hooks.rb' file
|
48
53
|
Added 'features/support/transformers.rb' file
|
49
54
|
Added 'features/example.feature' file
|
50
|
-
Added 'tasks/cucumber.rake' file
|
55
|
+
Added 'tasks/cucumber.rake' file
|
56
|
+
Added 'tasks/cuke_sniffer.rake' file\n"
|
51
57
|
end
|
52
58
|
subject { output.string }
|
53
59
|
it { is_expected.to eql(expected_output) }
|
data/spec/unit/lib/cache_spec.rb
CHANGED
@@ -70,7 +70,7 @@ RSpec.describe Howitzer::Cache do
|
|
70
70
|
it { expect(described_class.data).to eq(cloud: { status: false }, foo: {}, bar: {}, baz: {}) }
|
71
71
|
end
|
72
72
|
context 'when custom argument' do
|
73
|
-
let(:exception_list) {
|
73
|
+
let(:exception_list) { %i(foo bar) }
|
74
74
|
before { described_class.clear_all_ns(exception_list) }
|
75
75
|
it do
|
76
76
|
expect(described_class.data).to eq(
|
@@ -14,7 +14,7 @@ RSpec.describe Howitzer::MailgunApi::Client do
|
|
14
14
|
context 'when simulation of client' do
|
15
15
|
before do
|
16
16
|
expect(RestClient::Resource).to receive(:new)
|
17
|
-
.once
|
17
|
+
.once.and_return(Howitzer::MailgunApi::UnitClient.new('Fake-API-Key', 'api.mailgun.net', 'v2'))
|
18
18
|
end
|
19
19
|
it do
|
20
20
|
expect(subject.body).to include('total_count')
|
@@ -24,9 +24,9 @@ RSpec.describe Howitzer::MailgunApi::Client do
|
|
24
24
|
context 'when real client' do
|
25
25
|
let(:resource) { double }
|
26
26
|
before do
|
27
|
-
allow(resource).to receive('[]')
|
27
|
+
allow(resource).to receive('[]').and_return(resource)
|
28
28
|
allow(resource).to receive(:get).and_raise(StandardError, '401 Unauthorized: Forbidden')
|
29
|
-
allow(RestClient::Resource).to receive(:new)
|
29
|
+
allow(RestClient::Resource).to receive(:new).and_return(resource)
|
30
30
|
end
|
31
31
|
it do
|
32
32
|
expect { subject }.to raise_error(Howitzer::CommunicationError, '401 Unauthorized: Forbidden')
|
@@ -41,14 +41,14 @@ RSpec.describe Howitzer::MailgunApi::Client do
|
|
41
41
|
let(:response_raw) { double }
|
42
42
|
let(:response_real) { double }
|
43
43
|
before do
|
44
|
-
allow(RestClient::Request).to receive(:execute).with(any_args)
|
45
|
-
allow(Howitzer::MailgunApi::Response).to receive(:new).with(response_raw)
|
44
|
+
allow(RestClient::Request).to receive(:execute).with(any_args).and_return(response_raw)
|
45
|
+
allow(Howitzer::MailgunApi::Response).to receive(:new).with(response_raw).and_return(response_real)
|
46
46
|
end
|
47
47
|
it { is_expected.to eq(response_real) }
|
48
48
|
end
|
49
49
|
context 'when error happens' do
|
50
50
|
before do
|
51
|
-
allow(RestClient::Resource).to receive(:new).with(any_args)
|
51
|
+
allow(RestClient::Resource).to receive(:new).with(any_args).and_return(response_raw)
|
52
52
|
mg_obj
|
53
53
|
allow(RestClient::Request).to receive(:execute).with(any_args).and_raise(StandardError, 'Some message')
|
54
54
|
end
|
@@ -43,6 +43,19 @@ RSpec.describe Howitzer::Web::IframeDsl do
|
|
43
43
|
expect(subject.protected_methods(true)).to include(:iframe)
|
44
44
|
end
|
45
45
|
end
|
46
|
+
|
47
|
+
context 'when selector is not specified' do
|
48
|
+
subject do
|
49
|
+
web_page_class.class_eval do
|
50
|
+
iframe :fb
|
51
|
+
end
|
52
|
+
web_page_class
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should raise error' do
|
56
|
+
expect { subject }.to raise_error(ArgumentError, 'iframe selector arguments must be specified')
|
57
|
+
end
|
58
|
+
end
|
46
59
|
end
|
47
60
|
|
48
61
|
include_examples :capybara_context_holder
|
@@ -57,42 +70,74 @@ RSpec.describe Howitzer::Web::IframeDsl do
|
|
57
70
|
|
58
71
|
describe '#name_iframe' do
|
59
72
|
let(:block) { proc {} }
|
60
|
-
|
61
|
-
|
62
|
-
before { web_page_class.class_eval { iframe :fb,
|
73
|
+
context 'when no options' do
|
74
|
+
subject { web_page_object.fb_iframe(&block) }
|
75
|
+
before { web_page_class.class_eval { iframe :fb, 'foo' } }
|
63
76
|
it do
|
64
|
-
expect(kontext).to receive(:within_frame)
|
77
|
+
expect(kontext).to receive(:within_frame)
|
78
|
+
.with('foo') { |&block| block.call }
|
65
79
|
expect(block).to receive(:call).with(fb_page_class.instance)
|
80
|
+
expect(fb_page_class).to receive(:displayed?).with(no_args)
|
66
81
|
end
|
67
82
|
end
|
68
|
-
context 'when
|
69
|
-
|
83
|
+
context 'when all possible options' do
|
84
|
+
subject { web_page_object.fb_iframe(wait: 10, text: 'new', &block) }
|
85
|
+
before { web_page_class.class_eval { iframe :fb, :xpath, './/foo', match: :first, text: 'origin' } }
|
70
86
|
it do
|
71
|
-
expect(kontext).to receive(:within_frame)
|
87
|
+
expect(kontext).to receive(:within_frame)
|
88
|
+
.with(:xpath, './/foo', match: :first, wait: 10, text: 'new') { |&block| block.call }
|
72
89
|
expect(block).to receive(:call).with(fb_page_class.instance)
|
90
|
+
expect(fb_page_class).to receive(:displayed?).with(no_args)
|
73
91
|
end
|
74
92
|
end
|
75
93
|
end
|
76
94
|
describe '#has_name_iframe?' do
|
77
|
-
subject { web_page_object.has_fb_iframe? }
|
78
|
-
context 'when integer
|
79
|
-
before { web_page_class.class_eval { iframe :fb, 1 } }
|
80
|
-
it
|
95
|
+
subject { web_page_object.has_fb_iframe?(wait: 1, text: 'new') }
|
96
|
+
context 'when first argument is integer' do
|
97
|
+
before { web_page_class.class_eval { iframe :fb, 1, match: :first, text: 'origin' } }
|
98
|
+
it do
|
99
|
+
expect(kontext).to receive(:has_selector?)
|
100
|
+
.with('iframe:nth-of-type(2)', match: :first, wait: 1, text: 'new')
|
101
|
+
end
|
81
102
|
end
|
82
|
-
context 'when string
|
83
|
-
before { web_page_class.class_eval { iframe :fb, 'loko' } }
|
84
|
-
it { expect(kontext).to receive(:has_selector?).with(:frame, 'loko') }
|
103
|
+
context 'when first argument is string' do
|
104
|
+
before { web_page_class.class_eval { iframe :fb, 'loko', match: :first, text: 'origin' } }
|
105
|
+
it { expect(kontext).to receive(:has_selector?).with(:frame, 'loko', match: :first, wait: 1, text: 'new') }
|
106
|
+
end
|
107
|
+
context 'when first argument is hash' do
|
108
|
+
before { web_page_class.class_eval { iframe :fb, name: 'loko', match: :first, text: 'origin' } }
|
109
|
+
it do
|
110
|
+
expect(kontext).to receive(:has_selector?)
|
111
|
+
.with(:frame, name: 'loko', match: :first, wait: 1, text: 'new')
|
112
|
+
end
|
113
|
+
end
|
114
|
+
context 'when first argument is symbol' do
|
115
|
+
before { web_page_class.class_eval { iframe :fb, :xpath, './/foo', match: :first, text: 'origin' } }
|
116
|
+
it { expect(kontext).to receive(:has_selector?).with(:xpath, './/foo', match: :first, wait: 1, text: 'new') }
|
85
117
|
end
|
86
118
|
end
|
87
119
|
describe '#has_no_name_iframe?' do
|
88
|
-
subject { web_page_object.has_no_fb_iframe? }
|
89
|
-
context 'when integer
|
90
|
-
before { web_page_class.class_eval { iframe :fb, 1 } }
|
91
|
-
it
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
120
|
+
subject { web_page_object.has_no_fb_iframe?(wait: 1, text: 'new') }
|
121
|
+
context 'when first argument is integer' do
|
122
|
+
before { web_page_class.class_eval { iframe :fb, 1, match: :first, text: 'origin' } }
|
123
|
+
it do
|
124
|
+
expect(kontext).to receive(:has_no_selector?)
|
125
|
+
.with('iframe:nth-of-type(2)', match: :first, wait: 1, text: 'new')
|
126
|
+
end
|
127
|
+
end
|
128
|
+
context 'when first argument is string' do
|
129
|
+
before { web_page_class.class_eval { iframe :fb, 'loko', match: :first, text: 'origin' } }
|
130
|
+
it { expect(kontext).to receive(:has_no_selector?).with(:frame, 'loko', match: :first, wait: 1, text: 'new') }
|
131
|
+
end
|
132
|
+
context 'when first argument is hash' do
|
133
|
+
before { web_page_class.class_eval { iframe :fb, name: 'loko', match: :first, text: 'origin' } }
|
134
|
+
it do
|
135
|
+
expect(kontext).to receive(:has_no_selector?).with(:frame, name: 'loko', match: :first, wait: 1, text: 'new')
|
136
|
+
end
|
137
|
+
end
|
138
|
+
context 'when first argument is symbol' do
|
139
|
+
before { web_page_class.class_eval { iframe :fb, :xpath, './/foo', match: :first, text: 'origin' } }
|
140
|
+
it { expect(kontext).to receive(:has_no_selector?).with(:xpath, './/foo', match: :first, wait: 1, text: 'new') }
|
96
141
|
end
|
97
142
|
end
|
98
143
|
end
|