Skip to content

Commit 920b77d

Browse files
committed
Support for mocked client requests.
1 parent 1456b43 commit 920b77d

File tree

3 files changed

+134
-0
lines changed

3 files changed

+134
-0
lines changed

lib/async/http/mock.rb

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# frozen_string_literal: true
2+
#
3+
# Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
4+
#
5+
# Permission is hereby granted, free of charge, to any person obtaining a copy
6+
# of this software and associated documentation files (the "Software"), to deal
7+
# in the Software without restriction, including without limitation the rights
8+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
# copies of the Software, and to permit persons to whom the Software is
10+
# furnished to do so, subject to the following conditions:
11+
#
12+
# The above copyright notice and this permission notice shall be included in
13+
# all copies or substantial portions of the Software.
14+
#
15+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21+
# THE SOFTWARE.
22+
23+
require_relative 'mock/endpoint'

lib/async/http/mock/endpoint.rb

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# frozen_string_literal: true
2+
#
3+
# Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
4+
#
5+
# Permission is hereby granted, free of charge, to any person obtaining a copy
6+
# of this software and associated documentation files (the "Software"), to deal
7+
# in the Software without restriction, including without limitation the rights
8+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
# copies of the Software, and to permit persons to whom the Software is
10+
# furnished to do so, subject to the following conditions:
11+
#
12+
# The above copyright notice and this permission notice shall be included in
13+
# all copies or substantial portions of the Software.
14+
#
15+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21+
# THE SOFTWARE.
22+
23+
require_relative '../protocol'
24+
25+
require 'async/queue'
26+
27+
module Async
28+
module HTTP
29+
module Mock
30+
# This is an endpoint which bridges a client with a local server.
31+
class Endpoint
32+
def initialize(protocol = Protocol::HTTP2, scheme = "http", authority = "localhost", queue: Queue.new)
33+
@protocol = protocol
34+
@scheme = scheme
35+
@authority = authority
36+
37+
@queue = queue
38+
end
39+
40+
attr :protocol
41+
attr :scheme
42+
attr :authority
43+
44+
# Processing incoming connections
45+
# @yield [::HTTP::Protocol::Request] the requests as they come in.
46+
def run(parent: Task.current, &block)
47+
while peer = @queue.dequeue
48+
stream = IO::Stream.new(peer, sync: false)
49+
50+
server = @protocol.server(peer)
51+
52+
parent.async do
53+
server.each(&block)
54+
end
55+
end
56+
end
57+
58+
def connect
59+
local, remote = Async::IO::Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM)
60+
61+
@queue.enqueue(remote)
62+
63+
return local
64+
end
65+
end
66+
end
67+
end
68+
end

spec/async/http/mock_spec.rb

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Copyright, 2019, by Samuel G. D. Williams. <http://www.codeotaku.com>
2+
#
3+
# Permission is hereby granted, free of charge, to any person obtaining a copy
4+
# of this software and associated documentation files (the "Software"), to deal
5+
# in the Software without restriction, including without limitation the rights
6+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7+
# copies of the Software, and to permit persons to whom the Software is
8+
# furnished to do so, subject to the following conditions:
9+
#
10+
# The above copyright notice and this permission notice shall be included in
11+
# all copies or substantial portions of the Software.
12+
#
13+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19+
# THE SOFTWARE.
20+
21+
require 'async/http/mock'
22+
require 'async/http/client'
23+
24+
RSpec.describe Async::HTTP::Mock, timeout: 5 do
25+
include_context Async::RSpec::Reactor
26+
27+
let(:endpoint) {Async::HTTP::Mock::Endpoint.new}
28+
29+
it "can respond to requests" do
30+
server = Async do
31+
endpoint.run do |request|
32+
::Protocol::HTTP::Response[200, [], ["Hello World"]]
33+
end
34+
end
35+
36+
client = Async::HTTP::Client.new(endpoint)
37+
38+
response = client.get("/index")
39+
40+
expect(response).to be_success
41+
expect(response.read).to be == "Hello World"
42+
end
43+
end

0 commit comments

Comments
 (0)