mediawiki_selenium 0.4.3 → 1.0.0.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitreview +1 -1
- data/.rspec +1 -0
- data/.yardopts +1 -0
- data/Gemfile +1 -1
- data/README.md +108 -55
- data/bin/mediawiki-selenium-init +5 -0
- data/lib/mediawiki_selenium.rb +10 -19
- data/lib/mediawiki_selenium/browser_factory.rb +24 -0
- data/lib/mediawiki_selenium/browser_factory/base.rb +212 -0
- data/lib/mediawiki_selenium/browser_factory/chrome.rb +27 -0
- data/lib/mediawiki_selenium/browser_factory/firefox.rb +34 -0
- data/lib/mediawiki_selenium/browser_factory/phantomjs.rb +21 -0
- data/lib/mediawiki_selenium/configuration_error.rb +4 -0
- data/lib/mediawiki_selenium/environment.rb +494 -0
- data/lib/mediawiki_selenium/initializer.rb +19 -0
- data/lib/mediawiki_selenium/page_factory.rb +38 -0
- data/lib/mediawiki_selenium/remote_browser_factory.rb +87 -0
- data/lib/mediawiki_selenium/step_definitions.rb +5 -0
- data/lib/mediawiki_selenium/support.rb +3 -0
- data/lib/mediawiki_selenium/support/env.rb +3 -127
- data/lib/mediawiki_selenium/support/hooks.rb +23 -34
- data/lib/mediawiki_selenium/support/modules/api_helper.rb +44 -5
- data/lib/mediawiki_selenium/support/pages.rb +4 -0
- data/lib/mediawiki_selenium/support/pages/api_page.rb +1 -0
- data/lib/mediawiki_selenium/support/pages/login_page.rb +3 -12
- data/lib/mediawiki_selenium/support/pages/random_page.rb +2 -12
- data/lib/mediawiki_selenium/support/pages/reset_preferences_page.rb +3 -12
- data/lib/mediawiki_selenium/version.rb +1 -1
- data/mediawiki_selenium.gemspec +9 -3
- data/spec/api_helper_spec.rb +84 -0
- data/spec/browser_factory/base_spec.rb +211 -0
- data/spec/browser_factory/chrome_spec.rb +36 -0
- data/spec/browser_factory/firefox_spec.rb +60 -0
- data/spec/browser_factory/phantomjs_spec.rb +38 -0
- data/spec/environment_spec.rb +474 -0
- data/spec/page_factory_spec.rb +61 -0
- data/spec/remote_browser_factory_spec.rb +50 -0
- data/spec/spec_helper.rb +4 -0
- data/templates/tests/browser/environments.yml +35 -0
- data/templates/tests/browser/features/support/env.rb +6 -0
- metadata +122 -20
- data/lib/mediawiki_selenium/support/modules/sauce_helper.rb +0 -13
- data/lib/mediawiki_selenium/support/modules/url_module.rb +0 -21
- data/spec/README +0 -2
@@ -0,0 +1,38 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module MediawikiSelenium::BrowserFactory
|
4
|
+
describe Phantomjs do
|
5
|
+
let(:factory_class) { Phantomjs }
|
6
|
+
let(:factory) { factory_class.new(:phantomjs) }
|
7
|
+
|
8
|
+
describe ".default_bindings" do
|
9
|
+
subject { factory_class.default_bindings }
|
10
|
+
|
11
|
+
it { is_expected.to include(:browser_language) }
|
12
|
+
it { is_expected.not_to include(:browser_timeout) }
|
13
|
+
it { is_expected.to include(:browser_user_agent) }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#browser_options" do
|
17
|
+
subject { factory.browser_options(config) }
|
18
|
+
|
19
|
+
context "given a custom browser_language" do
|
20
|
+
let(:config) { { browser_language: "eo" } }
|
21
|
+
|
22
|
+
it "sets phantomjs.page.customHeaders.Accept-Language to the given language" do
|
23
|
+
capabilities = subject[:desired_capabilities]
|
24
|
+
expect(capabilities["phantomjs.page.customHeaders.Accept-Language"]).to eq("eo")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "given a custom browser_user_agent" do
|
29
|
+
let(:config) { { browser_user_agent: "FooBot" } }
|
30
|
+
|
31
|
+
it "sets phantomjs.page.settings.userAgent to the given string" do
|
32
|
+
capabilities = subject[:desired_capabilities]
|
33
|
+
expect(capabilities["phantomjs.page.settings.userAgent"]).to eq("FooBot")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,474 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module MediawikiSelenium
|
4
|
+
describe Environment do
|
5
|
+
subject { env }
|
6
|
+
|
7
|
+
let(:env) { Environment.new(config) }
|
8
|
+
let(:config) { minimum_config }
|
9
|
+
|
10
|
+
let(:minimum_config) do
|
11
|
+
{
|
12
|
+
browser: browser,
|
13
|
+
mediawiki_api_url: mediawiki_api_url,
|
14
|
+
mediawiki_url: mediawiki_url,
|
15
|
+
mediawiki_user: mediawiki_user,
|
16
|
+
mediawiki_password: mediawiki_password,
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:browser) { "firefox" }
|
21
|
+
let(:mediawiki_api_url) { "http://an.example/wiki/api.php" }
|
22
|
+
let(:mediawiki_url) { "http://an.example/wiki/" }
|
23
|
+
let(:mediawiki_user) { "mw user" }
|
24
|
+
let(:mediawiki_password) { "mw password" }
|
25
|
+
|
26
|
+
describe ".load" do
|
27
|
+
subject { Environment.load(name, extra) }
|
28
|
+
|
29
|
+
let(:name) { "foo" }
|
30
|
+
let(:extra) { {} }
|
31
|
+
|
32
|
+
before do
|
33
|
+
expect(YAML).to receive(:load_file).with("environments.yml").
|
34
|
+
and_return("foo" => { "x" => "a", "y" => "b" })
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns a new environment" do
|
38
|
+
expect(subject).to be_a(Environment)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "uses the given configuration in `environments.yml`" do
|
42
|
+
expect(subject[:x]).to eq("a")
|
43
|
+
expect(subject[:y]).to eq("b")
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when the given environment does not exist in `environments.yml`" do
|
47
|
+
let(:name) { "bar" }
|
48
|
+
|
49
|
+
it "raises a ConfigurationError" do
|
50
|
+
expect { subject }.to raise_error(ConfigurationError, "unknown environment `bar`")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "when extra configuration is given" do
|
55
|
+
let(:extra) { { x: "c" } }
|
56
|
+
|
57
|
+
it "overwrites the loaded configuration" do
|
58
|
+
expect(subject[:x]).to eq("c")
|
59
|
+
expect(subject[:y]).to eq("b")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe ".load_default" do
|
65
|
+
subject { Environment.load_default }
|
66
|
+
|
67
|
+
it "loads the environment configuration specified by MEDIAWIKI_ENVIRONMENT" do
|
68
|
+
expect(ENV).to receive(:[]).with("MEDIAWIKI_ENVIRONMENT").and_return("foo")
|
69
|
+
expect(Environment).to receive(:load).with("foo", ENV)
|
70
|
+
subject
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#==" do
|
75
|
+
subject { env == other }
|
76
|
+
|
77
|
+
context "given an environment with the same configuration" do
|
78
|
+
let(:other) { Environment.new(config) }
|
79
|
+
|
80
|
+
it "considers them equal" do
|
81
|
+
expect(subject).to be(true)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context "given an environment with different configuration" do
|
86
|
+
let(:other) { Environment.new(config.merge(some: "extra")) }
|
87
|
+
|
88
|
+
it "considers them not equal" do
|
89
|
+
expect(subject).to be(false)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#as_user" do
|
95
|
+
context "when both an alternative user and password are defined" do
|
96
|
+
let(:config) do
|
97
|
+
{
|
98
|
+
mediawiki_user: "user",
|
99
|
+
mediawiki_password: "pass",
|
100
|
+
mediawiki_user_b: "user b",
|
101
|
+
mediawiki_password_b: "pass b",
|
102
|
+
}
|
103
|
+
end
|
104
|
+
|
105
|
+
it "yields the alternative user and password in the new environment" do
|
106
|
+
expect { |block| env.as_user(:b, &block) }.to yield_with_args("user b", "pass b")
|
107
|
+
|
108
|
+
env.as_user(:b) do
|
109
|
+
expect(env[:mediawiki_user]).to eq("user b")
|
110
|
+
expect(env[:mediawiki_password]).to eq("pass b")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context "when an alternative for the password isn't defined" do
|
116
|
+
let(:config) do
|
117
|
+
{
|
118
|
+
mediawiki_user: "user",
|
119
|
+
mediawiki_password: "pass",
|
120
|
+
mediawiki_user_b: "user b",
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
124
|
+
it "falls back to using the base defined password" do
|
125
|
+
expect { |block| env.as_user(:b, &block) }.to yield_with_args("user b", "pass")
|
126
|
+
|
127
|
+
env.as_user(:b) do
|
128
|
+
expect(env[:mediawiki_user]).to eq("user b")
|
129
|
+
expect(env[:mediawiki_password]).to eq("pass")
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe "#browser_factory" do
|
136
|
+
subject { env.browser_factory }
|
137
|
+
|
138
|
+
it "is a factory for the configured browser" do
|
139
|
+
expect(subject).to be_a(BrowserFactory::Firefox)
|
140
|
+
end
|
141
|
+
|
142
|
+
context "given an explicit type of browser" do
|
143
|
+
subject { env.browser_factory(:chrome) }
|
144
|
+
|
145
|
+
it "is a factory for that type" do
|
146
|
+
expect(subject).to be_a(BrowserFactory::Chrome)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context "caching in a cloned environment" do
|
151
|
+
let(:env1) { env }
|
152
|
+
let(:env2) { env1.clone }
|
153
|
+
|
154
|
+
let(:factory1) { env.browser_factory(browser1) }
|
155
|
+
let(:factory2) { env2.browser_factory(browser2) }
|
156
|
+
|
157
|
+
context "with the same local/remote behavior as before" do
|
158
|
+
before do
|
159
|
+
expect(env1).to receive(:remote?).at_least(:once).and_return(false)
|
160
|
+
expect(env2).to receive(:remote?).at_least(:once).and_return(false)
|
161
|
+
end
|
162
|
+
|
163
|
+
context "and the same type of browser as before" do
|
164
|
+
let(:browser1) { :firefox }
|
165
|
+
let(:browser2) { :firefox }
|
166
|
+
|
167
|
+
it "returns a cached factory" do
|
168
|
+
expect(factory1).to be(factory2)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
context "and a different type of browser than before" do
|
173
|
+
let(:browser1) { :firefox }
|
174
|
+
let(:browser2) { :chrome }
|
175
|
+
|
176
|
+
it "returns a new factory" do
|
177
|
+
expect(factory1).not_to be(factory2)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
context "with different local/remote behavior as before" do
|
183
|
+
before do
|
184
|
+
expect(env1).to receive(:remote?).at_least(:once).and_return(false)
|
185
|
+
expect(env2).to receive(:remote?).at_least(:once).and_return(true)
|
186
|
+
end
|
187
|
+
|
188
|
+
context "but the same type of browser as before" do
|
189
|
+
let(:browser1) { :firefox }
|
190
|
+
let(:browser2) { :firefox }
|
191
|
+
|
192
|
+
it "returns a cached factory" do
|
193
|
+
expect(factory1).not_to be(factory2)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context "and a different type of browser than before" do
|
198
|
+
let(:browser1) { :firefox }
|
199
|
+
let(:browser2) { :chrome }
|
200
|
+
|
201
|
+
it "returns a new factory" do
|
202
|
+
expect(factory1).not_to be(factory2)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
describe "#browser_name" do
|
210
|
+
subject { env.browser_name }
|
211
|
+
|
212
|
+
let(:browser) { "Chrome" }
|
213
|
+
|
214
|
+
it "is always a lowercase symbol" do
|
215
|
+
expect(subject).to be(:chrome)
|
216
|
+
end
|
217
|
+
|
218
|
+
context "missing browser configuration" do
|
219
|
+
let(:browser) { nil }
|
220
|
+
|
221
|
+
it "defaults to :firefox" do
|
222
|
+
expect(subject).to be(:firefox)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
describe "#env" do
|
228
|
+
subject { env.env }
|
229
|
+
|
230
|
+
it { is_expected.to be(env) }
|
231
|
+
end
|
232
|
+
|
233
|
+
describe "#in_browser" do
|
234
|
+
it "executes in the new environment with a new browser session" do
|
235
|
+
expect { |block| env.in_browser(:a, &block) }.to yield_with_args(:a)
|
236
|
+
|
237
|
+
env.in_browser(:a) do
|
238
|
+
expect(env[:_browser_session]).to eq(:a)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
context "given browser configuration overrides" do
|
243
|
+
it "executes in the new environment with the prefixed overrides" do
|
244
|
+
expect { |block| env.in_browser(:a, language: "eo", &block) }.
|
245
|
+
to yield_with_args("eo", :a)
|
246
|
+
|
247
|
+
env.in_browser(:a, language: "eo") do
|
248
|
+
expect(env[:browser_language]).to eq("eo")
|
249
|
+
expect(env[:_browser_session]).to eq(:a)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
describe "#lookup" do
|
256
|
+
subject { env.lookup(key, options) }
|
257
|
+
|
258
|
+
let(:config) { { foo: "foo_value", foo_b: "foo_b_value", bar: "bar_value" } }
|
259
|
+
|
260
|
+
context "for a key that exists" do
|
261
|
+
let(:key) { :foo }
|
262
|
+
let(:options) { {} }
|
263
|
+
|
264
|
+
it "returns the configuration" do
|
265
|
+
expect(subject).to eq("foo_value")
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
context "for a key that doesn't exist" do
|
270
|
+
let(:key) { :baz }
|
271
|
+
|
272
|
+
context "given no default value" do
|
273
|
+
let(:options) { {} }
|
274
|
+
|
275
|
+
it "raises a ConfigurationError" do
|
276
|
+
expect { subject }.to raise_error(ConfigurationError)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
context "given a default value" do
|
281
|
+
let(:options) { { default: default } }
|
282
|
+
let(:default) { double(Object) }
|
283
|
+
|
284
|
+
it { is_expected.to be(default) }
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
context "for an alternative that exists" do
|
289
|
+
let(:key) { :foo }
|
290
|
+
let(:options) { { id: :b } }
|
291
|
+
|
292
|
+
it "returns the configured alternative" do
|
293
|
+
expect(subject).to eq("foo_b_value")
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
context "for an alternative that doesn't exist" do
|
298
|
+
let(:key) { :foo }
|
299
|
+
|
300
|
+
context "given no default value" do
|
301
|
+
let(:options) { { id: :c } }
|
302
|
+
|
303
|
+
it "raises a ConfigurationError" do
|
304
|
+
expect { subject }.to raise_error(ConfigurationError)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
context "given a default value" do
|
309
|
+
let(:options) { { id: :c, default: default } }
|
310
|
+
let(:default) { double(Object) }
|
311
|
+
|
312
|
+
it { is_expected.to be(default) }
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
describe "#on_wiki" do
|
318
|
+
let(:config) do
|
319
|
+
{
|
320
|
+
mediawiki_url: "http://an.example/wiki",
|
321
|
+
mediawiki_url_b: "http://altb.example/wiki",
|
322
|
+
mediawiki_url_c: "http://altc.example/wiki",
|
323
|
+
}
|
324
|
+
end
|
325
|
+
|
326
|
+
it "executes in the new environment using the alternative wiki URL" do
|
327
|
+
expect { |block| env.on_wiki(:b, &block) }.to yield_with_args("http://altb.example/wiki")
|
328
|
+
|
329
|
+
env.on_wiki(:b) do
|
330
|
+
expect(env[:mediawiki_url]).to eq("http://altb.example/wiki")
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
describe "#user" do
|
336
|
+
subject { env.user(id) }
|
337
|
+
|
338
|
+
let(:config) { { mediawiki_user: "mw_user", mediawiki_user_b: "mw_user_b" } }
|
339
|
+
|
340
|
+
context "given no alternative ID" do
|
341
|
+
let(:id) { nil }
|
342
|
+
|
343
|
+
it "returns the configured :mediawiki_user" do
|
344
|
+
expect(subject).to eq("mw_user")
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
context "given an alternative ID" do
|
349
|
+
let(:id) { :b }
|
350
|
+
|
351
|
+
it "returns the configured alternative :mediawiki_user" do
|
352
|
+
expect(subject).to eq("mw_user_b")
|
353
|
+
end
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
describe "#user_label" do
|
358
|
+
subject { env.user_label(id) }
|
359
|
+
|
360
|
+
let(:config) { { mediawiki_user: "mw_user", mediawiki_user_b: "mw_user_b" } }
|
361
|
+
|
362
|
+
context "given no alternative ID" do
|
363
|
+
let(:id) { nil }
|
364
|
+
|
365
|
+
it "returns the configured :mediawiki_user with underscores replaced" do
|
366
|
+
expect(subject).to eq("mw user")
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
context "given an alternative ID" do
|
371
|
+
let(:id) { :b }
|
372
|
+
|
373
|
+
it "returns the configured alternative :mediawiki_user with underscores replaced" do
|
374
|
+
expect(subject).to eq("mw user b")
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
describe "#wiki_url" do
|
380
|
+
subject { env.wiki_url(url) }
|
381
|
+
|
382
|
+
let(:env) { Environment.new(mediawiki_url: "http://an.example/wiki/") }
|
383
|
+
|
384
|
+
context "with no given url" do
|
385
|
+
let(:url) { nil }
|
386
|
+
|
387
|
+
it "is the configured :mediawiki_url" do
|
388
|
+
expect(subject).to eq("http://an.example/wiki/")
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
392
|
+
context "when the given URL is a relative path" do
|
393
|
+
let(:url) { "some/path" }
|
394
|
+
|
395
|
+
it "is the configured :mediawiki_url with the path appended" do
|
396
|
+
expect(subject).to eq("http://an.example/wiki/some/path")
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
context "when the given URL is an absolute path" do
|
401
|
+
let(:url) { "/some/path" }
|
402
|
+
|
403
|
+
it "is the configured :mediawiki_url with the path replaced" do
|
404
|
+
expect(subject).to eq("http://an.example/some/path")
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
context "when the given URL is an absolute URL" do
|
409
|
+
let(:url) { "http://another.example" }
|
410
|
+
|
411
|
+
it "is given absolute URL" do
|
412
|
+
expect(subject).to eq("http://another.example")
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
416
|
+
context "when the given URL is a relative path with a namespace" do
|
417
|
+
let(:url) { "some:path" }
|
418
|
+
|
419
|
+
it "is the configured :mediawiki_url with the path replaced" do
|
420
|
+
expect(subject).to eq("http://an.example/wiki/some:path")
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
424
|
+
end
|
425
|
+
|
426
|
+
describe "#with_alternative" do
|
427
|
+
let(:config) do
|
428
|
+
{
|
429
|
+
mediawiki_url: "http://a.example/wiki",
|
430
|
+
mediawiki_url_b: "http://b.example/wiki",
|
431
|
+
mediawiki_api_url: "http://a.example/api",
|
432
|
+
mediawiki_api_url_b: "http://b.example/api",
|
433
|
+
}
|
434
|
+
end
|
435
|
+
|
436
|
+
context "given one option name and an ID" do
|
437
|
+
it "executes in the new environment that substitutes it using the alternative" do
|
438
|
+
expect { |block| env.with_alternative(:mediawiki_url, :b, &block) }.
|
439
|
+
to yield_with_args("http://b.example/wiki")
|
440
|
+
|
441
|
+
env.with_alternative(:mediawiki_url, :b) do
|
442
|
+
expect(env[:mediawiki_url]).to eq("http://b.example/wiki")
|
443
|
+
end
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
context "given multiple option names and an ID" do
|
448
|
+
it "executes in the new environment that substitutes both using the alternatives" do
|
449
|
+
expect { |block| env.with_alternative([:mediawiki_url, :mediawiki_api_url], :b, &block) }.
|
450
|
+
to yield_with_args("http://b.example/wiki", "http://b.example/api")
|
451
|
+
|
452
|
+
env.with_alternative([:mediawiki_url, :mediawiki_api_url], :b) do
|
453
|
+
expect(env[:mediawiki_url]).to eq("http://b.example/wiki")
|
454
|
+
expect(env[:mediawiki_api_url]).to eq("http://b.example/api")
|
455
|
+
end
|
456
|
+
end
|
457
|
+
end
|
458
|
+
|
459
|
+
context "following block evaluation" do
|
460
|
+
it "restores the original configuration" do
|
461
|
+
env.with_alternative(:mediawiki_url, :b)
|
462
|
+
expect(env[:mediawiki_url]).to eq("http://a.example/wiki")
|
463
|
+
end
|
464
|
+
|
465
|
+
context "when an exception is raised within the block" do
|
466
|
+
it "restores the original configuration and lets the exception be raised" do
|
467
|
+
expect { env.with_alternative(:mediawiki_url, :b) { raise "error" } }.to raise_error
|
468
|
+
expect(env[:mediawiki_url]).to eq("http://a.example/wiki")
|
469
|
+
end
|
470
|
+
end
|
471
|
+
end
|
472
|
+
end
|
473
|
+
end
|
474
|
+
end
|