polonium 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +7 -0
- data/README +27 -12
- data/Rakefile +2 -2
- data/init.rb +9 -0
- data/lib/polonium/adapters/rspec.rb +19 -13
- data/lib/polonium/adapters/test_unit.rb +1 -1
- data/lib/polonium/configuration.rb +32 -97
- data/lib/polonium/driver.rb +25 -28
- data/lib/polonium/dsl/selenium_dsl.rb +67 -8
- data/lib/polonium/element.rb +60 -30
- data/lib/polonium/page.rb +13 -2
- data/lib/polonium/server_runners/external_server_runner.rb +20 -0
- data/lib/polonium/server_runners/mongrel_server_runner.rb +63 -0
- data/lib/polonium/server_runners/server_runner.rb +36 -0
- data/lib/polonium/server_runners/webrick_server_runner.rb +49 -0
- data/lib/polonium/test_case.rb +1 -19
- data/lib/polonium/wait_for.rb +4 -1
- data/lib/polonium.rb +6 -4
- data/spec/polonium/configuration_spec.rb +41 -99
- data/spec/polonium/driver_spec.rb +112 -62
- data/spec/polonium/element_spec.rb +69 -24
- data/spec/polonium/server_runners/external_server_runner_spec.rb +33 -0
- data/spec/polonium/server_runners/mongrel_server_runner_spec.rb +69 -0
- data/spec/polonium/server_runners/server_runner_spec.rb +36 -0
- data/spec/polonium/server_runners/webrick_server_runner_spec.rb +121 -0
- data/spec/polonium/test_case_spec.rb +538 -649
- data/spec/rspec/options_spec.rb +23 -22
- data/spec/spec_helper.rb +0 -18
- data/spec/spec_suite.rb +1 -1
- data/spec/test_unit/testrunnermediator_spec.rb +2 -2
- metadata +50 -41
- data/lib/polonium/dsl/test_unit_dsl.rb +0 -61
- data/lib/polonium/mongrel_selenium_server_runner.rb +0 -37
- data/lib/polonium/server_runner.rb +0 -33
- data/lib/polonium/webrick_selenium_server_runner.rb +0 -33
- data/spec/polonium/mongrel_selenium_server_runner_spec.rb +0 -35
- data/spec/polonium/server_runner_spec.rb +0 -42
- data/spec/polonium/webrick_selenium_server_runner_spec.rb +0 -117
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
2
|
|
3
3
|
module Polonium
|
4
|
-
describe Driver
|
4
|
+
describe Driver do
|
5
5
|
it_should_behave_like "Selenium"
|
6
6
|
attr_reader :driver, :commands
|
7
7
|
before do
|
@@ -15,90 +15,140 @@ module Polonium
|
|
15
15
|
def sample_text
|
16
16
|
"test text"
|
17
17
|
end
|
18
|
-
end
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
driver.timeout_in_milliseconds.should == 30000
|
29
|
-
end
|
19
|
+
describe "#initialize" do
|
20
|
+
it "initializes with defaults" do
|
21
|
+
driver.server_host.should == "localhost"
|
22
|
+
driver.server_port.should == 4444
|
23
|
+
driver.browser_start_command.should == "*iexplore"
|
24
|
+
driver.browser_url.should == "localhost:3000"
|
25
|
+
driver.timeout_in_milliseconds.should == 30000
|
26
|
+
end
|
30
27
|
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
it "should start" do
|
29
|
+
mock(driver).do_command.
|
30
|
+
with("getNewBrowserSession", ["*iexplore", "localhost:3000"]).returns(" 12345")
|
34
31
|
|
35
|
-
|
36
|
-
|
32
|
+
driver.start
|
33
|
+
driver.instance_variable_get(:@session_id).should == "12345"
|
34
|
+
end
|
37
35
|
end
|
38
|
-
end
|
39
|
-
|
40
|
-
describe Driver, "#inner_html_js" do
|
41
|
-
it_should_behave_like "Polonium::Driver"
|
42
36
|
|
43
|
-
|
44
|
-
|
45
|
-
|
37
|
+
describe "#inner_html_js" do
|
38
|
+
it "returns findElement command in js" do
|
39
|
+
driver.inner_html_js(sample_locator).should ==
|
40
|
+
%Q|this.page().findElement("#{sample_locator}").innerHTML|
|
41
|
+
end
|
46
42
|
end
|
47
|
-
end
|
48
43
|
|
49
|
-
|
50
|
-
|
44
|
+
describe "#open and #open_and_wait" do
|
45
|
+
it "opens page and waits for it to load" do
|
46
|
+
mock(driver).do_command("open", ["http://localhost:4000"])
|
47
|
+
mock(driver).do_command("waitForPageToLoad", [driver.default_timeout]) {result}
|
48
|
+
mock(driver).do_command("getTitle", []) {result("Some Title")}
|
51
49
|
|
52
|
-
|
53
|
-
is_element_present_results = [false, true]
|
54
|
-
mock(driver).do_command('isElementPresent', [sample_locator]).times(2) do
|
55
|
-
result(is_element_present_results.shift)
|
56
|
-
end
|
57
|
-
mock(driver).do_command('getEval', [driver.inner_html_js(sample_locator)]) do
|
58
|
-
result(sample_text)
|
50
|
+
driver.open("http://localhost:4000")
|
59
51
|
end
|
60
52
|
|
61
|
-
|
53
|
+
it "aliases #open_and_wait to #open" do
|
54
|
+
driver.method(:open_and_wait).should == driver.method(:open)
|
55
|
+
end
|
62
56
|
end
|
63
57
|
|
64
|
-
|
65
|
-
|
66
|
-
|
58
|
+
describe "#type" do
|
59
|
+
it "types when element is present and types" do
|
60
|
+
is_element_present_results = [false, true]
|
61
|
+
mock(driver).do_command("isElementPresent", ["id=foobar"]).twice do
|
62
|
+
result(is_element_present_results.shift)
|
63
|
+
end
|
64
|
+
mock(driver).do_command("type", ["id=foobar", "The Text"]) do
|
65
|
+
result()
|
66
|
+
end
|
67
|
+
|
68
|
+
driver.type "id=foobar", "The Text"
|
67
69
|
end
|
68
70
|
|
69
|
-
|
70
|
-
driver.
|
71
|
-
|
72
|
-
|
71
|
+
it "fails when element is not present" do
|
72
|
+
mock(driver).do_command("isElementPresent", ["id=foobar"]).times(4) do
|
73
|
+
result(false)
|
74
|
+
end
|
75
|
+
dont_allow(driver).do_command("type", ["id=foobar", "The Text"])
|
73
76
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
result(is_element_present_results.shift)
|
77
|
+
proc {
|
78
|
+
driver.type "id=foobar", "The Text"
|
79
|
+
}.should raise_error(Test::Unit::AssertionFailedError)
|
78
80
|
end
|
79
|
-
|
80
|
-
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "#click" do
|
84
|
+
it "click when element is present and types" do
|
85
|
+
is_element_present_results = [false, true]
|
86
|
+
mock(driver).do_command("isElementPresent", ["id=foobar"]).twice do
|
87
|
+
result(is_element_present_results.shift)
|
88
|
+
end
|
89
|
+
mock(driver).do_command("click", ["id=foobar"]) {result}
|
90
|
+
|
91
|
+
driver.click "id=foobar"
|
81
92
|
end
|
82
93
|
|
83
|
-
|
84
|
-
|
85
|
-
|
94
|
+
it "fails when element is not present" do
|
95
|
+
is_element_present_results = [false, false, false, false]
|
96
|
+
mock(driver).do_command("isElementPresent", ["id=foobar"]).times(4) do
|
97
|
+
result(is_element_present_results.shift)
|
98
|
+
end
|
99
|
+
dont_allow(driver).do_command("click", [])
|
100
|
+
|
101
|
+
proc {
|
102
|
+
driver.click "id=foobar"
|
103
|
+
}.should raise_error(Test::Unit::AssertionFailedError)
|
104
|
+
end
|
86
105
|
end
|
87
|
-
end
|
88
106
|
|
89
|
-
|
90
|
-
|
107
|
+
describe "#select" do
|
108
|
+
it "types when element is present and types" do
|
109
|
+
is_element_present_results = [false, true]
|
110
|
+
mock(driver).do_command("isElementPresent", ["id=foobar"]).twice do
|
111
|
+
result is_element_present_results.shift
|
112
|
+
end
|
113
|
+
mock(driver).do_command("select", ["id=foobar", "value=3"]) {result}
|
91
114
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
115
|
+
driver.select "id=foobar", "value=3"
|
116
|
+
end
|
117
|
+
|
118
|
+
it "fails when element is not present" do
|
119
|
+
mock(driver).do_command("isElementPresent", ["id=foobar"]).times(4) do
|
120
|
+
result false
|
121
|
+
end
|
122
|
+
dont_allow(driver).do_command("select", ["id=foobar", "value=3"])
|
96
123
|
|
97
|
-
|
124
|
+
proc {
|
125
|
+
driver.select "id=foobar", "value=3"
|
126
|
+
}.should raise_error(Test::Unit::AssertionFailedError)
|
127
|
+
end
|
98
128
|
end
|
99
129
|
|
100
|
-
|
101
|
-
|
130
|
+
describe "#click" do
|
131
|
+
it "click when element is present and types" do
|
132
|
+
is_element_present_results = [false, true]
|
133
|
+
mock(driver).do_command("isElementPresent", ["id=foobar"]).twice do
|
134
|
+
result is_element_present_results.shift
|
135
|
+
end
|
136
|
+
mock(driver).do_command("click", ["id=foobar"]) {result}
|
137
|
+
|
138
|
+
driver.click "id=foobar"
|
139
|
+
end
|
140
|
+
|
141
|
+
it "fails when element is not present" do
|
142
|
+
is_element_present_results = [false, false, false, false]
|
143
|
+
mock(driver).is_element_present("id=foobar").times(4) do
|
144
|
+
is_element_present_results.shift
|
145
|
+
end
|
146
|
+
dont_allow(driver).do_command("click", ["id=foobar"])
|
147
|
+
|
148
|
+
proc {
|
149
|
+
driver.click "id=foobar"
|
150
|
+
}.should raise_error(Test::Unit::AssertionFailedError)
|
151
|
+
end
|
102
152
|
end
|
103
|
-
end
|
153
|
+
end
|
104
154
|
end
|
@@ -109,7 +109,7 @@ module Polonium
|
|
109
109
|
|
110
110
|
describe "#assert_value" do
|
111
111
|
it "passes when element is present and value is expected value" do
|
112
|
-
element_ticks = [
|
112
|
+
element_ticks = [true, true, true, true]
|
113
113
|
mock(driver).is_element_present(element_locator) do
|
114
114
|
element_ticks.shift
|
115
115
|
end.times(4)
|
@@ -121,7 +121,7 @@ module Polonium
|
|
121
121
|
end
|
122
122
|
|
123
123
|
it "fails when element is present and not expected value" do
|
124
|
-
|
124
|
+
stub(driver).is_element_present(element_locator) {true}
|
125
125
|
stub(driver).get_value(element_locator) {"jane"}
|
126
126
|
proc do
|
127
127
|
element.assert_value("joe")
|
@@ -149,14 +149,8 @@ module Polonium
|
|
149
149
|
end
|
150
150
|
|
151
151
|
describe "#assert_attribute" do
|
152
|
-
attr_reader :element_locator
|
153
|
-
|
154
|
-
before do
|
155
|
-
element_locator = "id=foobar"
|
156
|
-
end
|
157
|
-
|
158
152
|
it "passes when element is present and value is expected value" do
|
159
|
-
element_ticks = [
|
153
|
+
element_ticks = [true, true, true, true]
|
160
154
|
mock(driver).is_element_present(element_locator) do
|
161
155
|
element_ticks.shift
|
162
156
|
end.times(4)
|
@@ -186,13 +180,36 @@ module Polonium
|
|
186
180
|
end
|
187
181
|
end
|
188
182
|
|
183
|
+
describe "#assert_attribute_does_not_contain" do
|
184
|
+
it "passes when element is present and value does not contain the illegal value" do
|
185
|
+
stub(driver).is_element_present(element_locator) {true}
|
186
|
+
stub(driver).get_attribute("#{element_locator}@theattribute") { "jane" }
|
187
|
+
element.assert_attribute_does_not_contain('theattribute', "joe")
|
188
|
+
end
|
189
|
+
|
190
|
+
it "passes when element is present and value does contain the illegal value" do
|
191
|
+
stub(driver).is_element_present(element_locator) {true}
|
192
|
+
stub(driver).get_attribute("#{element_locator}@theattribute") { "jane" }
|
193
|
+
proc do
|
194
|
+
element.assert_attribute_does_not_contain('theattribute', "jane")
|
195
|
+
end.should raise_error(Test::Unit::AssertionFailedError)
|
196
|
+
end
|
197
|
+
|
198
|
+
it "fails when element is not present" do
|
199
|
+
stub(driver).is_element_present(element_locator) {false}
|
200
|
+
proc do
|
201
|
+
element.assert_attribute_does_not_contain('theattribute', "jane")
|
202
|
+
end.should raise_error(Test::Unit::AssertionFailedError)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
189
206
|
describe "#assert_selected" do
|
190
207
|
before do
|
191
208
|
@element_locator = "id=foobar"
|
192
209
|
end
|
193
210
|
|
194
211
|
it "passes when element is present and value is expected value" do
|
195
|
-
element_ticks = [
|
212
|
+
element_ticks = [true, true, true, true]
|
196
213
|
mock(driver).is_element_present(element_locator) do
|
197
214
|
element_ticks.shift
|
198
215
|
end.times(4)
|
@@ -229,7 +246,7 @@ module Polonium
|
|
229
246
|
end
|
230
247
|
|
231
248
|
it "passes when element exists and is visible" do
|
232
|
-
element_ticks = [
|
249
|
+
element_ticks = [true, true, true, true]
|
233
250
|
mock(driver).is_element_present(element_locator) do
|
234
251
|
element_ticks.shift
|
235
252
|
end.times(4)
|
@@ -262,7 +279,7 @@ module Polonium
|
|
262
279
|
end
|
263
280
|
|
264
281
|
it "passes when element exists and is not visible" do
|
265
|
-
element_ticks = [
|
282
|
+
element_ticks = [true, true, true, true]
|
266
283
|
mock(driver).is_element_present(element_locator) do
|
267
284
|
element_ticks.shift
|
268
285
|
end.times(4)
|
@@ -295,7 +312,7 @@ module Polonium
|
|
295
312
|
end
|
296
313
|
|
297
314
|
it "passes when element is present and value is expected value" do
|
298
|
-
element_ticks = [
|
315
|
+
element_ticks = [true, true, true, true]
|
299
316
|
mock(driver).is_element_present(element_locator) do
|
300
317
|
element_ticks.shift
|
301
318
|
end.times(4)
|
@@ -328,7 +345,7 @@ module Polonium
|
|
328
345
|
end
|
329
346
|
|
330
347
|
it "passes when element is present and value is expected value" do
|
331
|
-
element_ticks = [
|
348
|
+
element_ticks = [true, true, true, true]
|
332
349
|
mock(driver).is_element_present(element_locator) do
|
333
350
|
element_ticks.shift
|
334
351
|
end.times(4)
|
@@ -361,7 +378,7 @@ module Polonium
|
|
361
378
|
end
|
362
379
|
|
363
380
|
it "passes when element is present and value is expected value" do
|
364
|
-
element_ticks = [
|
381
|
+
element_ticks = [true, true, true, true]
|
365
382
|
mock(driver).is_element_present(element_locator) do
|
366
383
|
element_ticks.shift
|
367
384
|
end.times(4)
|
@@ -400,7 +417,7 @@ module Polonium
|
|
400
417
|
|
401
418
|
describe "when passed a String" do
|
402
419
|
it "passes when element is present and the element contains text" do
|
403
|
-
element_ticks = [
|
420
|
+
element_ticks = [true, true, true, true]
|
404
421
|
mock(driver).is_element_present(element_locator) do
|
405
422
|
element_ticks.shift
|
406
423
|
end.times(4)
|
@@ -422,7 +439,7 @@ module Polonium
|
|
422
439
|
|
423
440
|
describe "when passed a Regexp" do
|
424
441
|
it "passes when element is present and the element contains text that matches the regexp" do
|
425
|
-
element_ticks = [
|
442
|
+
element_ticks = [true, true, true, true]
|
426
443
|
mock(driver).is_element_present(element_locator) do
|
427
444
|
element_ticks.shift
|
428
445
|
end.times(4)
|
@@ -467,7 +484,7 @@ module Polonium
|
|
467
484
|
|
468
485
|
describe "when passed a String" do
|
469
486
|
it "passes when element is present and the element does not contain text" do
|
470
|
-
element_ticks = [
|
487
|
+
element_ticks = [true, true, true, true]
|
471
488
|
mock(driver).is_element_present(element_locator) do
|
472
489
|
element_ticks.shift
|
473
490
|
end.times(4)
|
@@ -489,7 +506,7 @@ module Polonium
|
|
489
506
|
|
490
507
|
describe "when passed a Regexp" do
|
491
508
|
it "passes when element is present and the element does not contain text that matches the Regexp" do
|
492
|
-
element_ticks = [
|
509
|
+
element_ticks = [true, true, true, true]
|
493
510
|
mock(driver).is_element_present(element_locator) do
|
494
511
|
element_ticks.shift
|
495
512
|
end.times(4)
|
@@ -524,7 +541,7 @@ module Polonium
|
|
524
541
|
end
|
525
542
|
|
526
543
|
it "passes when element is present and value is expected value" do
|
527
|
-
element_ticks = [
|
544
|
+
element_ticks = [true, true, true, true]
|
528
545
|
mock(driver).is_element_present(@element_locator) do
|
529
546
|
element_ticks.shift
|
530
547
|
end.times(4)
|
@@ -558,7 +575,7 @@ module Polonium
|
|
558
575
|
end
|
559
576
|
|
560
577
|
it "passes when element is present and passed in text and Regexp matches are in order" do
|
561
|
-
element_ticks = [
|
578
|
+
element_ticks = [true, true, true, true]
|
562
579
|
mock(driver).is_element_present(@element_locator) do
|
563
580
|
element_ticks.shift
|
564
581
|
end.times(4)
|
@@ -589,12 +606,40 @@ module Polonium
|
|
589
606
|
end.should raise_error(Test::Unit::AssertionFailedError)
|
590
607
|
end
|
591
608
|
end
|
609
|
+
|
610
|
+
describe "#assert_number_of_children" do
|
611
|
+
before do
|
612
|
+
@element_locator = "id=foobar"
|
613
|
+
@evaled_js = "this.page().findElement('#{@element_locator}').childNodes.length"
|
614
|
+
end
|
615
|
+
|
616
|
+
it "passes when element is present and it contains the correct number of (direct) children" do
|
617
|
+
stub(driver).is_element_present(@element_locator) {true}
|
618
|
+
stub(driver).get_eval(@evaled_js) { 3 }
|
619
|
+
element.assert_number_of_children(3)
|
620
|
+
end
|
621
|
+
|
622
|
+
it "fails when element is present and it contains the wrong number of (direct) children" do
|
623
|
+
stub(driver).is_element_present(@element_locator) {true}
|
624
|
+
stub(driver).get_eval(@evaled_js) { 999 }
|
625
|
+
proc do
|
626
|
+
element.assert_number_of_children(3)
|
627
|
+
end.should raise_error(Test::Unit::AssertionFailedError)
|
628
|
+
end
|
629
|
+
|
630
|
+
it "fails when element is not present" do
|
631
|
+
stub(driver).is_element_present(@element_locator) {false}
|
632
|
+
proc do
|
633
|
+
element.assert_number_of_children 3
|
634
|
+
end.should raise_error(Test::Unit::AssertionFailedError)
|
635
|
+
end
|
636
|
+
end
|
592
637
|
|
593
638
|
describe "#method_missing" do
|
594
639
|
it "delegates command to the driver" do
|
595
|
-
element.methods.should_not include('
|
596
|
-
mock(driver).
|
597
|
-
element.
|
640
|
+
element.methods.should_not include('foobar')
|
641
|
+
mock(driver).foobar(@element_locator)
|
642
|
+
element.foobar
|
598
643
|
end
|
599
644
|
end
|
600
645
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
|
2
|
+
|
3
|
+
module Polonium
|
4
|
+
module ServerRunners
|
5
|
+
describe ExternalServerRunner do
|
6
|
+
attr_reader :configuration, :rails_env, :rails_root, :runner, :start_server_cmd, :stop_server_cmd
|
7
|
+
before do
|
8
|
+
@configuration = Configuration.new
|
9
|
+
@rails_env = configuration.rails_env = 'test'
|
10
|
+
@rails_root = configuration.rails_root = File.dirname(__FILE__)
|
11
|
+
@start_server_cmd = "cd #{rails_root}; script/server -e #{rails_env} -p #{configuration.internal_app_server_port} -c #{rails_root}"
|
12
|
+
@stop_server_cmd = "ps ax | grep 'script/server -e #{rails_env}' | sed /grep/d | awk '{print $1}' | xargs kill -9 2>/dev/null"
|
13
|
+
|
14
|
+
@runner = ExternalServerRunner.new(configuration)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#start" do
|
18
|
+
it "stops the server, then starts an external rails server" do
|
19
|
+
mock(runner).system(stop_server_cmd).ordered
|
20
|
+
mock(runner).system(start_server_cmd).ordered
|
21
|
+
runner.start
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#stop" do
|
26
|
+
it "stops the server" do
|
27
|
+
mock(runner).system(stop_server_cmd).ordered
|
28
|
+
runner.stop
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
|
2
|
+
|
3
|
+
module Polonium
|
4
|
+
module ServerRunners
|
5
|
+
describe MongrelServerRunner do
|
6
|
+
describe "#start_server" do
|
7
|
+
attr_reader :configuration
|
8
|
+
before do
|
9
|
+
@configuration = Configuration.new
|
10
|
+
end
|
11
|
+
|
12
|
+
it "initializes server and runs app_server_initialization callback" do
|
13
|
+
runner = MongrelServerRunner.new(configuration)
|
14
|
+
|
15
|
+
fake_rails = "fake rails"
|
16
|
+
mongrel_configurator = nil
|
17
|
+
mock.proxy(runner).create_mongrel_configurator do |mongrel_configurator|
|
18
|
+
mongrel_configurator = mongrel_configurator
|
19
|
+
stub(configuration).create_mongrel_configurator {mongrel_configurator}
|
20
|
+
mock(mongrel_configurator).run
|
21
|
+
stub(mongrel_configurator).log
|
22
|
+
mock(mongrel_configurator).join
|
23
|
+
mock(mongrel_configurator).rails {fake_rails}
|
24
|
+
mock(mongrel_configurator).uri("/", {:handler => fake_rails})
|
25
|
+
mock(mongrel_configurator).load_plugins
|
26
|
+
mock(mongrel_configurator).listener.yields(mongrel_configurator)
|
27
|
+
mongrel_configurator
|
28
|
+
end
|
29
|
+
|
30
|
+
callback_mongrel = nil
|
31
|
+
configuration.app_server_initialization = proc do |mongrel|
|
32
|
+
callback_mongrel = mongrel
|
33
|
+
end
|
34
|
+
stub(runner).defaults do
|
35
|
+
; {:environment => ""};
|
36
|
+
end
|
37
|
+
mock(Thread).start.yields
|
38
|
+
|
39
|
+
runner.start
|
40
|
+
callback_mongrel.should == mongrel_configurator
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#create_mongrel_configurator" do
|
44
|
+
it "creates Mongrel configurator" do
|
45
|
+
configuration.internal_app_server_host = "localhost"
|
46
|
+
configuration.internal_app_server_port = 4000
|
47
|
+
configuration.rails_env = "test"
|
48
|
+
configuration.rails_root = rails_root = File.dirname(__FILE__)
|
49
|
+
|
50
|
+
runner = MongrelServerRunner.new(configuration)
|
51
|
+
configurator = runner.send(:create_mongrel_configurator)
|
52
|
+
configurator.defaults[:host].should == "localhost"
|
53
|
+
configurator.defaults[:port].should == 4000
|
54
|
+
configurator.defaults[:cwd].should == configuration.rails_root
|
55
|
+
configurator.defaults[:log_file].should == "#{configuration.rails_root}/log/mongrel.log"
|
56
|
+
configurator.defaults[:pid_file].should == "#{configuration.rails_root}/log/mongrel.pid"
|
57
|
+
configurator.defaults[:environment].should == "test"
|
58
|
+
configurator.defaults[:docroot].should == "#{rails_root}/public"
|
59
|
+
configurator.defaults[:mime_map].should be_nil
|
60
|
+
configurator.defaults[:daemon].should == false
|
61
|
+
configurator.defaults[:debug].should == false
|
62
|
+
configurator.defaults[:includes].should == ["mongrel"]
|
63
|
+
configurator.defaults[:config_script].should be_nil
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
|
2
|
+
|
3
|
+
module Polonium
|
4
|
+
module ServerRunners
|
5
|
+
describe ServerRunner do
|
6
|
+
before(:each) do
|
7
|
+
@runner = ServerRunner.new(Configuration.new)
|
8
|
+
class << @runner
|
9
|
+
public :start_server, :stop_server
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should initialize started? to be false" do
|
14
|
+
@runner.started?.should == false
|
15
|
+
end
|
16
|
+
|
17
|
+
it "start method should start new thread and set started" do
|
18
|
+
mock(@runner).start_server
|
19
|
+
stub(@runner).stop_server
|
20
|
+
@runner.start
|
21
|
+
end
|
22
|
+
|
23
|
+
it "stop method should set started? to false" do
|
24
|
+
def @runner.stop_server;
|
25
|
+
end
|
26
|
+
@runner.instance_eval {@started = true}
|
27
|
+
@runner.stop
|
28
|
+
@runner.started?.should == false
|
29
|
+
end
|
30
|
+
|
31
|
+
it "start_server method should raise a NotImplementedError by default" do
|
32
|
+
proc {@runner.start_server}.should raise_error(NotImplementedError)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
|
2
|
+
|
3
|
+
module Polonium
|
4
|
+
module ServerRunners
|
5
|
+
describe WebrickServerRunner do
|
6
|
+
attr_reader :configuration, :mock_server
|
7
|
+
before(:each) do
|
8
|
+
Object.const_set(:RAILS_ROOT, "foobar")
|
9
|
+
end
|
10
|
+
|
11
|
+
after(:each) do
|
12
|
+
Object.instance_eval {remove_const :RAILS_ROOT}
|
13
|
+
end
|
14
|
+
|
15
|
+
it "start method should initialize the HttpServer with parameters" do
|
16
|
+
runner = create_runner_that_is_stubbed_so_start_method_works
|
17
|
+
runner.start
|
18
|
+
end
|
19
|
+
|
20
|
+
it "start method should mount and start the server" do
|
21
|
+
runner = create_runner_that_is_stubbed_so_start_method_works
|
22
|
+
runner.start
|
23
|
+
end
|
24
|
+
|
25
|
+
it "start method should require environment when rails_root is not set" do
|
26
|
+
runner = create_runner_that_is_stubbed_so_start_method_works
|
27
|
+
requires = []
|
28
|
+
stub(runner).require {|val| requires << val}
|
29
|
+
|
30
|
+
runner.start
|
31
|
+
requires.any? {|r| r =~ /\/config\/environment/}.should == true
|
32
|
+
end
|
33
|
+
|
34
|
+
it "start method should trap server.shutdown" do
|
35
|
+
runner = create_runner_that_is_stubbed_so_start_method_works
|
36
|
+
|
37
|
+
(
|
38
|
+
class << runner;
|
39
|
+
self;
|
40
|
+
end).class_eval {attr_reader :trap_signal_name}
|
41
|
+
def runner.trap(signal_name, &block)
|
42
|
+
@trap_signal_name = signal_name
|
43
|
+
block.call
|
44
|
+
end
|
45
|
+
mock(mock_server).shutdown
|
46
|
+
|
47
|
+
runner.start
|
48
|
+
runner.trap_signal_name.should == "INT"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should shutdown webrick server" do
|
52
|
+
runner = create_runner_that_is_stubbed_so_start_method_works
|
53
|
+
runner.start
|
54
|
+
mock(mock_server).shutdown
|
55
|
+
runner.stop
|
56
|
+
end
|
57
|
+
|
58
|
+
def create_runner_that_is_stubbed_so_start_method_works
|
59
|
+
configuration = Polonium::Configuration.new
|
60
|
+
runner = WebrickServerRunner.new(configuration)
|
61
|
+
class << runner;
|
62
|
+
public :start_server;
|
63
|
+
end
|
64
|
+
|
65
|
+
stub(runner).require
|
66
|
+
|
67
|
+
configuration.internal_app_server_port = 4000
|
68
|
+
configuration.internal_app_server_host = "localhost"
|
69
|
+
configuration.rails_env = "test"
|
70
|
+
|
71
|
+
@mock_server = "mock_server"
|
72
|
+
stub(WEBrick::HTTPServer).new {mock_server}
|
73
|
+
|
74
|
+
stub(mock_server).mount('/')
|
75
|
+
mock(mock_server) do |s|
|
76
|
+
s.mount(
|
77
|
+
'/',
|
78
|
+
DispatchServlet,
|
79
|
+
{
|
80
|
+
:port => configuration.internal_app_server_port,
|
81
|
+
:ip => configuration.internal_app_server_host,
|
82
|
+
:environment => configuration.rails_env,
|
83
|
+
:server_root => File.expand_path("#{configuration.rails_root}/public/"),
|
84
|
+
:server_type => WEBrick::SimpleServer,
|
85
|
+
:charset => "UTF-8",
|
86
|
+
:mime_types => WEBrick::HTTPUtils::DefaultMimeTypes,
|
87
|
+
:working_directory => File.expand_path(configuration.rails_root.to_s)
|
88
|
+
}
|
89
|
+
)
|
90
|
+
s.start
|
91
|
+
end
|
92
|
+
|
93
|
+
mock(Thread).start.yields
|
94
|
+
|
95
|
+
return runner
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "#create_webrick_server" do
|
99
|
+
it "creates webrick http server" do
|
100
|
+
configuration = Polonium::Configuration.new
|
101
|
+
configuration.internal_app_server_port = 4000
|
102
|
+
configuration.internal_app_server_host = "localhost"
|
103
|
+
|
104
|
+
mock_logger = "logger"
|
105
|
+
mock(configuration).new_logger {mock_logger}
|
106
|
+
mock(WEBrick::HTTPServer).new({
|
107
|
+
:Port => 4000,
|
108
|
+
:BindAddress => "localhost",
|
109
|
+
:ServerType => WEBrick::SimpleServer,
|
110
|
+
:MimeTypes => WEBrick::HTTPUtils::DefaultMimeTypes,
|
111
|
+
:Logger => mock_logger,
|
112
|
+
:AccessLog => []
|
113
|
+
})
|
114
|
+
runner = WebrickServerRunner.new(configuration)
|
115
|
+
server = runner.send(:create_webrick_server)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|