js_spec 0.3.2 → 0.3.3
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.
- data/CHANGES +3 -0
- data/Rakefile +1 -1
- data/core/JSSpecExtensions.js +5 -11
- data/spec/integration/integration_spec_helper.rb +1 -1
- data/spec/spec_suite.rb +0 -1
- data/spec/unit/js_test_core/resources/spec_dir_spec.rb +6 -6
- data/spec/unit/js_test_core/resources/spec_file_spec.rb +4 -4
- data/spec/unit/unit_spec_helper.rb +1 -3
- data/vendor/js-test-core/CHANGES +4 -0
- data/vendor/js-test-core/lib/js_test_core/client.rb +19 -16
- data/vendor/js-test-core/lib/js_test_core/resources.rb +2 -2
- data/vendor/js-test-core/lib/js_test_core/resources/runner.rb +17 -15
- data/vendor/js-test-core/lib/js_test_core/resources/{suite.rb → session.rb} +8 -4
- data/vendor/js-test-core/lib/js_test_core/resources/{suite_finish.rb → session_finish.rb} +5 -5
- data/vendor/js-test-core/lib/js_test_core/resources/web_root.rb +6 -3
- data/vendor/js-test-core/spec/unit/js_test_core/client_spec.rb +22 -21
- data/vendor/js-test-core/spec/unit/js_test_core/resources/runners/runner_spec.rb +83 -63
- data/vendor/js-test-core/spec/unit/js_test_core/resources/{suite_finish_spec.rb → session_finish_spec.rb} +15 -18
- data/vendor/js-test-core/spec/unit/js_test_core/resources/session_spec.rb +82 -0
- data/vendor/js-test-core/spec/unit/js_test_core/resources/specs/spec_dir_spec.rb +3 -3
- data/vendor/js-test-core/spec/unit/unit_spec_helper.rb +37 -10
- data/vendor/js-test-core/vendor/thin-rest/lib/thin_rest/resource.rb +4 -0
- metadata +84 -87
- data/spec/functional/functional_spec_helper.rb +0 -18
- data/spec/functional/server_spec.rb +0 -5
- data/spec/functional_suite.rb +0 -10
- data/vendor/js-test-core/spec/unit/js_test_core/resources/suite_spec.rb +0 -86
@@ -3,12 +3,12 @@ require File.expand_path("#{File.dirname(__FILE__)}/../../../unit_spec_helper")
|
|
3
3
|
module JsTestCore
|
4
4
|
module Resources
|
5
5
|
describe Runner do
|
6
|
-
attr_reader :request, :driver, :
|
6
|
+
attr_reader :request, :driver, :session_id, :selenium_browser_start_command, :body
|
7
7
|
|
8
8
|
def self.before_with_selenium_browser_start_command(selenium_browser_start_command="selenium browser start command")
|
9
9
|
before do
|
10
|
-
@driver =
|
11
|
-
@
|
10
|
+
@driver = FakeSeleniumDriver.new
|
11
|
+
@session_id = FakeSeleniumDriver::SESSION_ID
|
12
12
|
@selenium_browser_start_command = selenium_browser_start_command
|
13
13
|
@body = "selenium_browser_start_command=#{selenium_browser_start_command}"
|
14
14
|
stub(Selenium::SeleniumDriver).new('localhost', 4444, selenium_browser_start_command, 'http://0.0.0.0:8080') do
|
@@ -27,13 +27,13 @@ module JsTestCore
|
|
27
27
|
before do
|
28
28
|
@runner = Runner.new(:connection => connection, :selenium_browser_start_command => selenium_browser_start_command)
|
29
29
|
stub(runner).driver {driver}
|
30
|
-
stub(driver).session_id {
|
30
|
+
stub(driver).session_id {session_id}
|
31
31
|
Runner.register(runner)
|
32
32
|
end
|
33
33
|
|
34
34
|
context "when passed an id for which there is a corresponding Runner" do
|
35
35
|
it "returns the Runner" do
|
36
|
-
Runner.find(
|
36
|
+
Runner.find(session_id).should == runner
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -48,26 +48,26 @@ module JsTestCore
|
|
48
48
|
describe ".finalize" do
|
49
49
|
attr_reader :runner
|
50
50
|
before_with_selenium_browser_start_command
|
51
|
-
describe "when there is a runner for the passed in
|
51
|
+
describe "when there is a runner for the passed in session_id" do
|
52
52
|
before do
|
53
53
|
@runner = Runner.new(:connection => connection, :selenium_browser_start_command => selenium_browser_start_command)
|
54
54
|
stub(runner).driver {driver}
|
55
55
|
stub(driver).session_id {"DEADBEEF"}
|
56
56
|
|
57
57
|
Runner.register(runner)
|
58
|
-
runner.
|
58
|
+
runner.session_id.should == session_id
|
59
59
|
end
|
60
60
|
|
61
|
-
it "finalizes the Runner that has the
|
62
|
-
mock(driver).stop
|
61
|
+
it "finalizes the Runner that has the session_id and keeps the Runner in memory" do
|
62
|
+
mock.proxy(driver).stop
|
63
63
|
mock.proxy(runner).finalize("Browser output")
|
64
|
-
Runner.find(
|
65
|
-
Runner.finalize(
|
66
|
-
Runner.find(
|
64
|
+
Runner.find(session_id).should == runner
|
65
|
+
Runner.finalize(session_id, "Browser output")
|
66
|
+
Runner.find(session_id).should == runner
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
-
describe "when there is not a runner for the passed in
|
70
|
+
describe "when there is not a runner for the passed in session_id" do
|
71
71
|
it "does nothing" do
|
72
72
|
lambda do
|
73
73
|
Runner.finalize("6666666", "nothing happens")
|
@@ -84,21 +84,27 @@ module JsTestCore
|
|
84
84
|
stub(connection).send_body
|
85
85
|
end
|
86
86
|
|
87
|
-
it "responds with a 200 and the
|
88
|
-
stub(driver).start
|
89
|
-
stub(driver).open
|
90
|
-
stub(driver).session_id {suite_id}
|
91
|
-
|
87
|
+
it "responds with a 200 and the session_id" do
|
92
88
|
mock(connection).send_head
|
93
|
-
mock(connection).send_body("
|
89
|
+
mock(connection).send_body("session_id=#{session_id}")
|
90
|
+
connection.receive_data("POST /runners HTTP/1.1\r\nHost: _\r\nContent-Length: #{body.length}\r\n\r\n#{body}")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "starts the Selenium Driver, creates a SessionID cookie, and opens the spec page" do
|
94
|
+
mock(driver).start
|
95
|
+
stub(driver).session_id {session_id}
|
96
|
+
mock(driver).create_cookie("session_id=#{session_id}")
|
97
|
+
mock(driver).open("/")
|
98
|
+
mock(driver).open("/specs")
|
99
|
+
|
100
|
+
mock(Selenium::SeleniumDriver).new('localhost', 4444, selenium_browser_start_command, 'http://0.0.0.0:8080') do
|
101
|
+
driver
|
102
|
+
end
|
94
103
|
connection.receive_data("POST /runners HTTP/1.1\r\nHost: _\r\nContent-Length: #{body.length}\r\n\r\n#{body}")
|
95
104
|
end
|
96
105
|
|
97
106
|
describe "when a selenium_host parameter is passed into the request" do
|
98
107
|
before do
|
99
|
-
stub(driver).start
|
100
|
-
stub(driver).open
|
101
|
-
stub(driver).session_id {suite_id}
|
102
108
|
body << "&selenium_host=another-machine"
|
103
109
|
end
|
104
110
|
|
@@ -112,9 +118,6 @@ module JsTestCore
|
|
112
118
|
|
113
119
|
describe "when a selenium_host parameter is not passed into the request" do
|
114
120
|
before do
|
115
|
-
stub(driver).start
|
116
|
-
stub(driver).open
|
117
|
-
stub(driver).session_id {suite_id}
|
118
121
|
body << "&selenium_host="
|
119
122
|
end
|
120
123
|
|
@@ -128,9 +131,6 @@ module JsTestCore
|
|
128
131
|
|
129
132
|
describe "when a selenium_port parameter is passed into the request" do
|
130
133
|
before do
|
131
|
-
stub(driver).start
|
132
|
-
stub(driver).open
|
133
|
-
stub(driver).session_id {suite_id}
|
134
134
|
body << "&selenium_port=4000"
|
135
135
|
end
|
136
136
|
|
@@ -144,9 +144,6 @@ module JsTestCore
|
|
144
144
|
|
145
145
|
describe "when a selenium_port parameter is not passed into the request" do
|
146
146
|
before do
|
147
|
-
stub(driver).start
|
148
|
-
stub(driver).open
|
149
|
-
stub(driver).session_id {suite_id}
|
150
147
|
body << "&selenium_port="
|
151
148
|
end
|
152
149
|
|
@@ -159,13 +156,15 @@ module JsTestCore
|
|
159
156
|
end
|
160
157
|
|
161
158
|
describe "when a spec_url is passed into the request" do
|
162
|
-
it "runs Selenium with the passed in host and part to run the specified spec
|
159
|
+
it "runs Selenium with the passed in host and part to run the specified spec session in Firefox" do
|
163
160
|
mock(Selenium::SeleniumDriver).new('localhost', 4444, selenium_browser_start_command, 'http://another-host:8080') do
|
164
161
|
driver
|
165
162
|
end
|
166
163
|
mock(driver).start
|
167
|
-
|
168
|
-
mock(driver).
|
164
|
+
stub(driver).create_cookie
|
165
|
+
mock(driver).open("/")
|
166
|
+
mock(driver).open("/specs/subdir")
|
167
|
+
mock(driver).session_id {session_id}.at_least(1)
|
169
168
|
|
170
169
|
body << "&spec_url=http://another-host:8080/specs/subdir"
|
171
170
|
connection.receive_data("POST /runners HTTP/1.1\r\nHost: _\r\nContent-Length: #{body.length}\r\n\r\n#{body}")
|
@@ -179,10 +178,12 @@ module JsTestCore
|
|
179
178
|
end
|
180
179
|
end
|
181
180
|
|
182
|
-
it "uses Selenium to run the entire spec
|
181
|
+
it "uses Selenium to run the entire spec session in Firefox" do
|
183
182
|
mock(driver).start
|
184
|
-
|
185
|
-
mock(driver).
|
183
|
+
stub(driver).create_cookie
|
184
|
+
mock(driver).open("/")
|
185
|
+
mock(driver).open("/specs")
|
186
|
+
mock(driver).session_id {session_id}.at_least(1)
|
186
187
|
|
187
188
|
body << "&spec_url="
|
188
189
|
connection.receive_data("POST /runners HTTP/1.1\r\nHost: _\r\nContent-Length: #{body.length}\r\n\r\n#{body}")
|
@@ -198,16 +199,12 @@ module JsTestCore
|
|
198
199
|
stub(connection).send_head
|
199
200
|
stub(connection).send_body
|
200
201
|
|
201
|
-
stub(driver).start
|
202
|
-
stub(driver).open
|
203
|
-
stub(driver).session_id {suite_id}
|
204
|
-
|
205
202
|
mock(connection).send_head
|
206
|
-
mock(connection).send_body("
|
203
|
+
mock(connection).send_body("session_id=#{session_id}")
|
207
204
|
|
208
|
-
Runner.find(
|
205
|
+
Runner.find(session_id).should be_nil
|
209
206
|
connection.receive_data("POST /runners/firefox HTTP/1.1\r\nHost: _\r\n\r\n")
|
210
|
-
runner = Runner.find(
|
207
|
+
runner = Runner.find(session_id)
|
211
208
|
runner.class.should == Runner
|
212
209
|
runner.driver.should == driver
|
213
210
|
end
|
@@ -221,45 +218,68 @@ module JsTestCore
|
|
221
218
|
stub(connection).send_head
|
222
219
|
stub(connection).send_body
|
223
220
|
|
224
|
-
stub(driver).start
|
225
|
-
stub(driver).open
|
226
|
-
stub(driver).session_id {suite_id}
|
227
|
-
|
228
221
|
mock(connection).send_head
|
229
|
-
mock(connection).send_body("
|
222
|
+
mock(connection).send_body("session_id=#{session_id}")
|
230
223
|
|
231
|
-
Runner.find(
|
224
|
+
Runner.find(session_id).should be_nil
|
232
225
|
connection.receive_data("POST /runners/iexplore HTTP/1.1\r\nHost: _\r\n\r\n")
|
233
|
-
runner = Runner.find(
|
226
|
+
runner = Runner.find(session_id)
|
234
227
|
runner.class.should == Runner
|
235
228
|
runner.driver.should == driver
|
236
229
|
end
|
237
230
|
end
|
238
231
|
|
232
|
+
describe "#running?" do
|
233
|
+
before_with_selenium_browser_start_command
|
234
|
+
context "when the driver#session_started? is true" do
|
235
|
+
it "returns true" do
|
236
|
+
create_runner_connection = create_connection
|
237
|
+
stub(create_runner_connection).send_head
|
238
|
+
stub(create_runner_connection).send_body
|
239
|
+
create_runner_connection.receive_data("POST /runners HTTP/1.1\r\nHost: _\r\nContent-Length: #{body.length}\r\n\r\n#{body}")
|
240
|
+
|
241
|
+
runner = Resources::Runner.find(session_id)
|
242
|
+
runner.driver.session_started?.should be_true
|
243
|
+
runner.should be_running
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
context "when the driver#session_started? is false" do
|
248
|
+
it "returns false" do
|
249
|
+
create_runner_connection = create_connection
|
250
|
+
stub(create_runner_connection).send_head
|
251
|
+
stub(create_runner_connection).send_body
|
252
|
+
create_runner_connection.receive_data("POST /runners HTTP/1.1\r\nHost: _\r\nContent-Length: #{body.length}\r\n\r\n#{body}")
|
253
|
+
|
254
|
+
runner = Resources::Runner.find(session_id)
|
255
|
+
runner.driver.stop
|
256
|
+
runner.driver.session_started?.should be_false
|
257
|
+
runner.should_not be_running
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
239
262
|
describe "#finalize" do
|
240
263
|
attr_reader :runner
|
241
264
|
before_with_selenium_browser_start_command
|
242
265
|
before do
|
243
|
-
stub(driver).start
|
244
|
-
stub(driver).open
|
245
|
-
stub(driver).session_id {suite_id}
|
246
|
-
|
247
266
|
create_runner_connection = create_connection
|
248
267
|
stub(create_runner_connection).send_head
|
249
268
|
stub(create_runner_connection).send_body
|
250
269
|
create_runner_connection.receive_data("POST /runners HTTP/1.1\r\nHost: _\r\nContent-Length: #{body.length}\r\n\r\n#{body}")
|
251
|
-
@runner = Resources::Runner.find(
|
252
|
-
mock(driver).stop
|
270
|
+
@runner = Resources::Runner.find(session_id)
|
271
|
+
mock.proxy(driver).stop
|
253
272
|
end
|
254
273
|
|
255
|
-
it "kills the browser and stores the #
|
256
|
-
|
257
|
-
runner.finalize(
|
258
|
-
runner.
|
274
|
+
it "kills the browser and stores the #session_run_result" do
|
275
|
+
session_run_result = "The session run result"
|
276
|
+
runner.finalize(session_run_result)
|
277
|
+
runner.session_run_result.should == session_run_result
|
259
278
|
end
|
260
279
|
|
261
|
-
it "
|
262
|
-
runner.finalize("")
|
280
|
+
it "sets #session_run_result" do
|
281
|
+
runner.finalize("the result")
|
282
|
+
runner.session_run_result.should == "the result"
|
263
283
|
end
|
264
284
|
|
265
285
|
context "when passed an empty string" do
|
@@ -2,26 +2,27 @@ require File.expand_path("#{File.dirname(__FILE__)}/../../unit_spec_helper")
|
|
2
2
|
|
3
3
|
module JsTestCore
|
4
4
|
module Resources
|
5
|
-
describe
|
5
|
+
describe SessionFinish do
|
6
6
|
attr_reader :stdout
|
7
7
|
before do
|
8
8
|
@stdout = StringIO.new
|
9
|
-
|
9
|
+
SessionFinish.const_set(:STDOUT, stdout)
|
10
10
|
end
|
11
11
|
|
12
12
|
after do
|
13
|
-
|
13
|
+
SessionFinish.__send__(:remove_const, :STDOUT)
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
|
-
|
16
|
+
|
17
|
+
describe "POST /session/finish" do
|
18
|
+
context "when session_id cookie is not set" do
|
18
19
|
it "writes the body of the request to stdout" do
|
19
20
|
stub(connection).send_head
|
20
21
|
stub(connection).send_body
|
21
22
|
|
22
23
|
text = "The text in the POST body"
|
23
24
|
body = "text=#{text}"
|
24
|
-
connection.receive_data("POST /
|
25
|
+
connection.receive_data("POST /session/finish HTTP/1.1\r\nHost: _\r\nContent-Length: #{body.length}\r\n\r\n#{body}")
|
25
26
|
stdout.string.should == "#{text}\n"
|
26
27
|
end
|
27
28
|
|
@@ -31,22 +32,18 @@ module JsTestCore
|
|
31
32
|
|
32
33
|
mock(connection).send_head
|
33
34
|
mock(connection).send_body("")
|
34
|
-
connection.receive_data("POST /
|
35
|
+
connection.receive_data("POST /session/finish HTTP/1.1\r\nHost: _\r\nContent-Length: #{body.length}\r\n\r\n#{body}")
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
38
|
-
context "when
|
39
|
-
attr_reader :
|
39
|
+
context "when session_id cookie is set'" do
|
40
|
+
attr_reader :session_id, :driver
|
40
41
|
before do
|
41
|
-
@
|
42
|
-
@driver =
|
42
|
+
@session_id = FakeSeleniumDriver::SESSION_ID
|
43
|
+
@driver = FakeSeleniumDriver.new
|
43
44
|
stub(Selenium::SeleniumDriver).new('localhost', 4444, '*firefox', 'http://0.0.0.0:8080') do
|
44
45
|
driver
|
45
46
|
end
|
46
|
-
stub(driver).start
|
47
|
-
stub(driver).open
|
48
|
-
stub(driver).session_id {suite_id}
|
49
|
-
stub(Thread).start.yields
|
50
47
|
|
51
48
|
firefox_connection = Thin::JsTestCoreConnection.new(Guid.new)
|
52
49
|
stub(firefox_connection).send_head
|
@@ -60,11 +57,11 @@ module JsTestCore
|
|
60
57
|
body = "text=#{text}"
|
61
58
|
stub(connection).send_head
|
62
59
|
stub(connection).send_body
|
63
|
-
mock.proxy(Runner).finalize(
|
60
|
+
mock.proxy(Runner).finalize(session_id.to_s, text)
|
64
61
|
mock(driver).stop
|
65
62
|
stub(connection).close_connection
|
66
63
|
|
67
|
-
connection.receive_data("POST /
|
64
|
+
connection.receive_data("POST /session/finish HTTP/1.1\r\nCookie: session_id=#{session_id}\r\nHost: _\r\nContent-Length: #{body.length}\r\n\r\n#{body}")
|
68
65
|
end
|
69
66
|
|
70
67
|
it "responds with a blank body" do
|
@@ -73,7 +70,7 @@ module JsTestCore
|
|
73
70
|
|
74
71
|
mock(connection).send_head
|
75
72
|
mock(connection).send_body("")
|
76
|
-
connection.receive_data("POST /
|
73
|
+
connection.receive_data("POST /session/finish HTTP/1.1\r\nCookie: session_id=#{session_id}\r\nHost: _\r\nContent-Length: 0\r\n\r\n")
|
77
74
|
end
|
78
75
|
end
|
79
76
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../unit_spec_helper")
|
2
|
+
|
3
|
+
module JsTestCore
|
4
|
+
module Resources
|
5
|
+
describe Session do
|
6
|
+
describe "GET /sessions/:session_id" do
|
7
|
+
attr_reader :driver, :session_id
|
8
|
+
|
9
|
+
context "when there is no Runner with the :session_id" do
|
10
|
+
it "responds with a 404" do
|
11
|
+
session_id = "invalid_session_id"
|
12
|
+
Runner.find(session_id).should be_nil
|
13
|
+
|
14
|
+
mock(connection).send_head(404)
|
15
|
+
mock(connection).send_body("")
|
16
|
+
|
17
|
+
connection.receive_data("GET /sessions/#{session_id} HTTP/1.1\r\nHost: _\r\n\r\n")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when there is a Runner with the :session_id" do
|
22
|
+
attr_reader :session_runner
|
23
|
+
before do
|
24
|
+
@driver = FakeSeleniumDriver.new
|
25
|
+
@session_id = FakeSeleniumDriver::SESSION_ID
|
26
|
+
stub(Selenium::SeleniumDriver).new('localhost', 4444, '*firefox', 'http://0.0.0.0:8080') do
|
27
|
+
driver
|
28
|
+
end
|
29
|
+
|
30
|
+
connection_that_starts_firefox = create_connection
|
31
|
+
stub(connection_that_starts_firefox).send_head
|
32
|
+
stub(connection_that_starts_firefox).send_body
|
33
|
+
connection_that_starts_firefox.receive_data("POST /runners/firefox HTTP/1.1\r\nHost: _\r\nContent-Length: 0\r\n\r\n")
|
34
|
+
@session_runner = Runner.find(session_id)
|
35
|
+
session_runner.should be_running
|
36
|
+
end
|
37
|
+
|
38
|
+
context "when a Runner with the :session_id is running" do
|
39
|
+
it "responds with a 200 and status=running" do
|
40
|
+
mock(connection).send_head
|
41
|
+
mock(connection).send_body("status=#{Resources::Session::RUNNING}")
|
42
|
+
|
43
|
+
connection.receive_data("GET /sessions/#{session_id} HTTP/1.1\r\nHost: _\r\n\r\n")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when a Runner with the :session_id has completed" do
|
48
|
+
context "when the session has a status of 'success'" do
|
49
|
+
before do
|
50
|
+
session_runner.finalize("")
|
51
|
+
session_runner.should be_successful
|
52
|
+
end
|
53
|
+
|
54
|
+
it "responds with a 200 and status=success" do
|
55
|
+
mock(connection).send_head
|
56
|
+
mock(connection).send_body("status=#{Resources::Session::SUCCESSFUL_COMPLETION}")
|
57
|
+
|
58
|
+
connection.receive_data("GET /sessions/#{session_id} HTTP/1.1\r\nHost: _\r\n\r\n")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when the session has a status of 'failure'" do
|
63
|
+
attr_reader :reason
|
64
|
+
before do
|
65
|
+
@reason = "Failure stuff"
|
66
|
+
session_runner.finalize(reason)
|
67
|
+
session_runner.should be_failed
|
68
|
+
end
|
69
|
+
|
70
|
+
it "responds with a 200 and status=failure and reason" do
|
71
|
+
mock(connection).send_head
|
72
|
+
mock(connection).send_body("status=#{Resources::Session::FAILURE_COMPLETION}&reason=#{reason}")
|
73
|
+
|
74
|
+
connection.receive_data("GET /sessions/#{session_id} HTTP/1.1\r\nHost: _\r\n\r\n")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -90,10 +90,10 @@ module JsTestCore
|
|
90
90
|
|
91
91
|
describe "GET /" do
|
92
92
|
context "when WebRoot.dispatch_specs has been invoked" do
|
93
|
-
it "
|
93
|
+
it "renders a home page" do
|
94
94
|
WebRoot.dispatch_specs
|
95
|
-
mock(connection).send_head(
|
96
|
-
mock(connection).send_body(
|
95
|
+
mock(connection).send_head(200, :Location => '/specs')
|
96
|
+
mock(connection).send_body(is_a(String))
|
97
97
|
|
98
98
|
connection.receive_data("GET / HTTP/1.1\r\nHost: _\r\n\r\n")
|
99
99
|
end
|