Skip to content

Commit 1372bfb

Browse files
committed
Move adapter-version specific tests back to adapter.rb.
1 parent db77ec3 commit 1372bfb

File tree

7 files changed

+148
-153
lines changed

7 files changed

+148
-153
lines changed

fixtures/protocol/rack/an_adapter.rb

Lines changed: 0 additions & 144 deletions
This file was deleted.

lib/protocol/rack/adapter/generic.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ def self.parse_file(...)
2222
::Rack::Builder.parse_file(...).first
2323
end
2424

25+
def self.streaming?
26+
false
27+
end
28+
2529
# Initialize the rack adaptor middleware.
2630
# @parameter app [Object] The rack middleware.
2731
def initialize(app)

lib/protocol/rack/adapter/rack3.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ def self.parse_file(...)
2020
::Rack::Builder.parse_file(...)
2121
end
2222

23+
def self.streaming?
24+
true
25+
end
26+
2327
def make_environment(request)
2428
request_path, query_string = request.path.split("?", 2)
2529
server_name, server_port = (request.authority || "").split(":", 2)

test/protocol/rack/adapter.rb

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,152 @@
33
# Released under the MIT License.
44
# Copyright, 2022-2024, by Samuel Williams.
55

6+
require "sus/fixtures/console"
7+
68
require "protocol/rack/adapter"
9+
require "protocol/rack/server_context"
10+
11+
require "rack/lint"
712

813
describe Protocol::Rack::Adapter do
14+
include Sus::Fixtures::Console::CapturedLogger
15+
916
let(:rackup_path) {File.expand_path(".adapter/config.ru", __dir__)}
1017

1118
it "can load rackup files" do
1219
expect(subject.parse_file(rackup_path)).to be_a(Proc)
1320
end
21+
22+
AnApplication = Sus::Shared("an application") do
23+
include Protocol::Rack::ServerContext
24+
25+
let(:protocol) {subject}
26+
27+
with "successful response" do
28+
let(:app) do
29+
::Rack::Lint.new(
30+
lambda do |env|
31+
[200, {}, ["Hello World!"]]
32+
end
33+
)
34+
end
35+
36+
let(:response) {client.get("/")}
37+
38+
it "get valid HTTP_HOST" do
39+
expect(response.read).to be == "Hello World!"
40+
end
41+
end
42+
43+
with "HTTP_HOST" do
44+
let(:app) do
45+
lambda do |env|
46+
[200, {}, ["HTTP_HOST: #{env['HTTP_HOST']}"]]
47+
end
48+
end
49+
50+
let(:response) {client.get("/")}
51+
52+
it "get valid HTTP_HOST" do
53+
expect(response.read).to be =~ /HTTP_HOST: (.*?):(\d+)+/
54+
end
55+
end
56+
57+
with "connection: close", timeout: 1 do
58+
let(:app) do
59+
lambda do |env|
60+
[200, {"connection" => "close"}, ["Hello World!"]]
61+
end
62+
end
63+
64+
let(:response) {client.get("/")}
65+
66+
it "get valid response" do
67+
expect(response.read).to be == "Hello World!"
68+
end
69+
end
70+
71+
with "non-string header value" do
72+
let(:app) do
73+
lambda do |env|
74+
[200, {"x-custom" => 123}, ["Hello World!"]]
75+
end
76+
end
77+
78+
let(:response) {client.get("/")}
79+
80+
it "get valid response" do
81+
expect(response.read).to be == "Hello World!"
82+
expect(response.headers["x-custom"]).to be == ["123"]
83+
end
84+
end
85+
86+
with "REQUEST_URI", timeout: 1 do
87+
let(:app) do
88+
lambda do |env|
89+
[200, {}, ["REQUEST_URI: #{env['REQUEST_URI']}"]]
90+
end
91+
end
92+
93+
let(:response) {client.get("/?foo=bar")}
94+
95+
it "get valid REQUEST_URI" do
96+
expect(response.read).to be == "REQUEST_URI: /?foo=bar"
97+
end
98+
end
99+
100+
with "streaming response" do
101+
let(:app) do
102+
lambda do |env|
103+
body = lambda do |stream|
104+
stream.write("Hello Streaming World")
105+
stream.close
106+
end
107+
108+
[200, {}, body]
109+
end
110+
end
111+
112+
let(:response) {client.get("/")}
113+
114+
it "can read streaming response" do
115+
skip "Streaming response not supported"
116+
117+
expect(response.read).to be == "Hello Streaming World"
118+
end
119+
end
120+
121+
with "error handling" do
122+
let(:response) {client.get("/")}
123+
124+
with "nil response" do
125+
let(:app) {->(env) {nil}}
126+
127+
it "raises an error" do
128+
expect(response.status).to be == 500
129+
expect(response.read).to be == "ArgumentError: Status must be an integer!"
130+
end
131+
end
132+
133+
with "nil headers" do
134+
let(:app) {->(env) {[200, nil, []]}}
135+
136+
it "raises an error" do
137+
expect(response.status).to be == 500
138+
expect(response.read).to be == "ArgumentError: Headers must not be nil!"
139+
end
140+
end
141+
end
142+
end
143+
144+
[
145+
Async::HTTP::Protocol::HTTP10,
146+
Async::HTTP::Protocol::HTTP11,
147+
Async::HTTP::Protocol::HTTP2,
148+
].each do |klass|
149+
describe(klass, unique: klass.name) do
150+
# The adapter is Rack version specific, so we run integration tests in CI with different versions of Rack to ensure compatibility.
151+
it_behaves_like AnApplication
152+
end
153+
end
14154
end

test/protocol/rack/adapter/rack2.rb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
# Copyright, 2022-2024, by Samuel Williams.
55

66
require "sus/fixtures/console"
7-
require "protocol/rack/an_adapter"
87
require "protocol/rack/adapter/rack2"
98

109
describe Protocol::Rack::Adapter::Rack2 do
@@ -17,8 +16,6 @@
1716
let(:request) {Protocol::HTTP::Request.new("https", "example.com", "GET", "/", "http/1.1", Protocol::HTTP::Headers[{"accept" => "text/html"}], body)}
1817
let(:response) {adapter.call(request)}
1918

20-
it_behaves_like Protocol::Rack::AnAdapter
21-
2219
with "set-cookie headers that has multiple values" do
2320
let(:app) {->(env) {[200, {"set-cookie" => "a=b\nx=y"}, []]}}
2421

test/protocol/rack/adapter/rack3.rb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
require "sus/fixtures/console"
77

88
require "protocol/http/request"
9-
require "protocol/rack/an_adapter"
109
require "protocol/rack/adapter/rack3"
1110

1211
describe Protocol::Rack::Adapter::Rack3 do
@@ -19,8 +18,6 @@
1918
let(:request) {Protocol::HTTP::Request.new("https", "example.com", "GET", "/", "http/1.1", Protocol::HTTP::Headers[{"accept" => "text/html"}], body)}
2019
let(:response) {adapter.call(request)}
2120

22-
it_behaves_like Protocol::Rack::AnAdapter
23-
2421
with "set-cookie headers that has multiple values" do
2522
let(:app) {->(env) {[200, {"set-cookie" => ["a=b", "x=y"]}, []]}}
2623

test/protocol/rack/adapter/rack31.rb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
require "sus/fixtures/console"
77

88
require "protocol/http/request"
9-
require "protocol/rack/an_adapter"
109
require "protocol/rack/adapter/rack31"
1110

1211
describe Protocol::Rack::Adapter::Rack31 do
@@ -19,8 +18,6 @@
1918
let(:request) {Protocol::HTTP::Request.new("https", "example.com", "GET", "/", "http/1.1", Protocol::HTTP::Headers[{"accept" => "text/html"}], body)}
2019
let(:response) {adapter.call(request)}
2120

22-
it_behaves_like Protocol::Rack::AnAdapter
23-
2421
with "set-cookie headers that has multiple values" do
2522
let(:app) {->(env) {[200, {"set-cookie" => ["a=b", "x=y"]}, []]}}
2623

0 commit comments

Comments
 (0)