howitzer 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|