Skip to content

Commit d5d045b

Browse files
authored
Simplify and clean up Sentry::RequestInterface's tests (#1660)
1 parent d9d6af4 commit d5d045b

File tree

1 file changed

+53
-103
lines changed

1 file changed

+53
-103
lines changed

sentry-ruby/spec/sentry/interfaces/request_interface_spec.rb

Lines changed: 53 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
require 'spec_helper'
44

55
RSpec.describe Sentry::RequestInterface do
6-
let(:exception) { ZeroDivisionError.new("divided by 0") }
7-
let(:additional_headers) { {} }
8-
let(:env) { Rack::MockRequest.env_for("/test", additional_headers) }
9-
let(:interface) { described_class.build(env: env) }
6+
let(:env) { Rack::MockRequest.env_for("/test") }
7+
8+
subject do
9+
described_class.build(env: env)
10+
end
1011

1112
before do
1213
Sentry.init do |config|
@@ -15,56 +16,49 @@
1516
end
1617

1718
describe "rack_env_whitelist" do
18-
it 'excludes non whitelisted params from rack env' do
19-
additional_env = { "random_param" => "text", "query_string" => "test" }
20-
new_env = env.merge(additional_env)
21-
interface = described_class.build(env: new_env)
19+
let(:additional_env) { { "random_param" => "text", "query_string" => "test" } }
20+
21+
before do
22+
env.merge!(additional_env)
23+
end
2224

23-
expect(interface.env).to_not include(additional_env)
25+
it 'excludes non whitelisted params from rack env' do
26+
expect(subject.env).to_not include(additional_env)
2427
end
2528

2629
it 'formats rack env according to the provided whitelist' do
2730
Sentry.configuration.rack_env_whitelist = %w(random_param query_string)
28-
additional_env = { "random_param" => "text", "query_string" => "test" }
29-
new_env = env.merge(additional_env)
30-
interface = described_class.build(env: new_env)
31-
32-
expect(interface.env).to eq(additional_env)
31+
expect(subject.env).to eq(additional_env)
3332
end
3433

3534
it 'keeps the original env intact when an empty whitelist is provided' do
3635
Sentry.configuration.rack_env_whitelist = []
37-
interface = described_class.build(env: env)
3836

39-
expect(interface.env).to eq(env)
37+
expect(subject.env).to eq(env)
4038
end
4139
end
4240

4341
describe 'format headers' do
4442
let(:additional_headers) { { "HTTP_VERSION" => "HTTP/1.1", "HTTP_COOKIE" => "test", "HTTP_X_REQUEST_ID" => "12345678" } }
43+
let(:env) { Rack::MockRequest.env_for("/test", additional_headers) }
4544

4645
it 'transforms headers to conform with the interface' do
47-
interface = described_class.build(env: env)
48-
49-
expect(interface.headers).to eq("Content-Length" => "0", "Version" => "HTTP/1.1", "X-Request-Id" => "12345678")
46+
expect(subject.headers).to eq("Content-Length" => "0", "Version" => "HTTP/1.1", "X-Request-Id" => "12345678")
5047
end
5148

5249
context 'from Rails middleware' do
5350
let(:additional_headers) { { "action_dispatch.request_id" => "12345678" } }
5451

5552
it 'transforms headers to conform with the interface' do
56-
interface = described_class.build(env: env)
57-
58-
expect(interface.headers).to eq("Content-Length" => "0", "X-Request-Id" => "12345678")
53+
expect(subject.headers).to eq("Content-Length" => "0", "X-Request-Id" => "12345678")
5954
end
6055
end
6156

6257
context 'with special characters' do
6358
let(:additional_headers) { { "HTTP_FOO" => "Tekirda\xC4" } }
6459

6560
it "doesn't cause any issue" do
66-
interface = described_class.build(env: env)
67-
json = JSON.generate(interface.to_hash)
61+
json = JSON.generate(subject.to_hash)
6862

6963
expect(JSON.parse(json)["headers"]).to eq({"Content-Length"=>"0", "Foo"=>"Tekirda�"})
7064
end
@@ -83,56 +77,42 @@
8377
end
8478

8579
it "doesn't capture cookies info" do
86-
new_env = env.merge(
87-
::Rack::RACK_REQUEST_COOKIE_HASH => "cookies!"
88-
)
80+
env.merge!(::Rack::RACK_REQUEST_COOKIE_HASH => "cookies!")
8981

90-
interface = described_class.build(env: new_env)
91-
92-
expect(interface.cookies).to eq(nil)
93-
expect(interface.env["COOKIE"]).to eq(nil)
82+
expect(subject.cookies).to eq(nil)
83+
expect(subject.env["COOKIE"]).to eq(nil)
9484
end
9585

9686
describe "headers filtering" do
9787
it "filters out HTTP_COOKIE header" do
98-
new_env = env.merge(
99-
"HTTP_COOKIE" => "cookies!"
100-
)
88+
env.merge!("HTTP_COOKIE" => "cookies!")
10189

102-
interface = described_class.build(env: new_env)
103-
104-
expect(interface.headers["Cookie"]).to eq(nil)
90+
expect(subject.headers["Cookie"]).to eq(nil)
10591
end
10692

10793
it "filters out non-http headers" do
108-
expect(interface.headers["Request-Method"]).to eq(nil)
94+
expect(subject.headers["Request-Method"]).to eq(nil)
10995
end
11096

11197
it "doesn't filter out CONTENT_TYPE or CONTENT_LENGTH headers" do
112-
new_env = env.merge(
98+
env.merge!(
11399
"CONTENT_LENGTH" => 10,
114100
"CONTENT_TYPE" => "text/html"
115101
)
116102

117-
interface = described_class.build(env: new_env)
118-
119-
expect(interface.headers["Content-Length"]).to eq("10")
120-
expect(interface.headers["Content-Type"]).to eq("text/html")
103+
expect(subject.headers["Content-Length"]).to eq("10")
104+
expect(subject.headers["Content-Type"]).to eq("text/html")
121105
end
122106

123107
it 'does not ignore version headers which do not match SERVER_PROTOCOL' do
124-
new_env = env.merge("SERVER_PROTOCOL" => "HTTP/1.1", "HTTP_VERSION" => "HTTP/2.0")
108+
env.merge!("SERVER_PROTOCOL" => "HTTP/1.1", "HTTP_VERSION" => "HTTP/2.0")
125109

126-
interface = described_class.build(env: new_env)
127-
128-
expect(interface.headers["Version"]).to eq("HTTP/2.0")
110+
expect(subject.headers["Version"]).to eq("HTTP/2.0")
129111
end
130112

131113
it 'retains any literal "HTTP-" in the actual header name' do
132-
new_env = env.merge("HTTP_HTTP_CUSTOM_HTTP_HEADER" => "test")
133-
interface = described_class.build(env: new_env)
134-
135-
expect(interface.headers).to include("Http-Custom-Http-Header" => "test")
114+
env.merge!("HTTP_HTTP_CUSTOM_HTTP_HEADER" => "test")
115+
expect(subject.headers).to include("Http-Custom-Http-Header" => "test")
136116
end
137117

138118
it 'does not fail if an object in the env cannot be cast to string' do
@@ -142,39 +122,28 @@ def to_s
142122
end
143123
end.new
144124

145-
new_env = env.merge("HTTP_FOO" => "BAR", "rails_object" => obj)
125+
env.merge!("HTTP_FOO" => "BAR", "rails_object" => obj)
146126

147-
expect { described_class.build(env: new_env) }.to_not raise_error
127+
expect { described_class.build(env: env) }.to_not raise_error
148128
end
149129
end
150130

151131
it "doesn't store request body by default" do
152-
new_env = env.merge(
153-
"REQUEST_METHOD" => "POST",
154-
::Rack::RACK_INPUT => StringIO.new("data=ignore me")
155-
)
132+
env.merge!("REQUEST_METHOD" => "POST", ::Rack::RACK_INPUT => StringIO.new("data=ignore me"))
156133

157-
interface = described_class.build(env: new_env)
158-
159-
expect(interface.data).to eq(nil)
134+
expect(subject.data).to eq(nil)
160135
end
161136

162137
it "doesn't store request body by default" do
163-
new_env = env.merge(::Rack::RACK_INPUT => StringIO.new("ignore me"))
164-
165-
interface = described_class.build(env: new_env)
138+
env.merge!(::Rack::RACK_INPUT => StringIO.new("ignore me"))
166139

167-
expect(interface.data).to eq(nil)
140+
expect(subject.data).to eq(nil)
168141
end
169142

170143
it "doesn't store query_string by default" do
171-
new_env = env.merge(
172-
"QUERY_STRING" => "token=xxxx"
173-
)
144+
env.merge!("QUERY_STRING" => "token=xxxx")
174145

175-
interface = described_class.build(env: new_env)
176-
177-
expect(interface.query_string).to eq(nil)
146+
expect(subject.query_string).to eq(nil)
178147
end
179148

180149
context "with config.send_default_pii = true" do
@@ -183,51 +152,34 @@ def to_s
183152
end
184153

185154
it "stores cookies" do
186-
new_env = env.merge(
187-
::Rack::RACK_REQUEST_COOKIE_HASH => "cookies!"
188-
)
189-
190-
interface = described_class.build(env: new_env)
155+
env.merge!(::Rack::RACK_REQUEST_COOKIE_HASH => "cookies!")
191156

192-
expect(interface.cookies).to eq("cookies!")
157+
expect(subject.cookies).to eq("cookies!")
193158
end
194159

195160
it "stores form data" do
196-
new_env = env.merge(
197-
"REQUEST_METHOD" => "POST",
198-
::Rack::RACK_INPUT => StringIO.new("data=catch me")
199-
)
200-
201-
interface = described_class.build(env: new_env)
161+
env.merge!("REQUEST_METHOD" => "POST", ::Rack::RACK_INPUT => StringIO.new("data=catch me"))
202162

203-
expect(interface.data).to eq({ "data" => "catch me" })
163+
expect(subject.data).to eq({ "data" => "catch me" })
204164
end
205165

206166
it "stores query string" do
207-
new_env = env.merge(
208-
"QUERY_STRING" => "token=xxxx"
209-
)
210-
211-
interface = described_class.build(env: new_env)
167+
env.merge!("QUERY_STRING" => "token=xxxx")
212168

213-
expect(interface.query_string).to eq("token=xxxx")
169+
expect(subject.query_string).to eq("token=xxxx")
214170
end
215171

216172
it "stores request body" do
217-
new_env = env.merge(::Rack::RACK_INPUT => StringIO.new("catch me"))
173+
env.merge!(::Rack::RACK_INPUT => StringIO.new("catch me"))
218174

219-
interface = described_class.build(env: new_env)
220-
221-
expect(interface.data).to eq("catch me")
175+
expect(subject.data).to eq("catch me")
222176
end
223177

224178
it "force encodes request body to avoid encoding issue" do
225-
new_env = env.merge(::Rack::RACK_INPUT => StringIO.new("あ"))
226-
227-
interface = described_class.build(env: new_env)
179+
env.merge!(::Rack::RACK_INPUT => StringIO.new("あ"))
228180

229181
expect do
230-
JSON.generate(interface.to_hash)
182+
JSON.generate(subject.to_hash)
231183
end.not_to raise_error
232184
end
233185

@@ -241,12 +193,10 @@ def to_s
241193
"HTTP_X_FORWARDED_FOR" => ip
242194
)
243195

244-
interface = described_class.build(env: env)
245-
246-
expect(interface.env).to include("REMOTE_ADDR")
247-
expect(interface.headers.keys).to include("Client-Ip")
248-
expect(interface.headers.keys).to include("X-Real-Ip")
249-
expect(interface.headers.keys).to include("X-Forwarded-For")
196+
expect(subject.env).to include("REMOTE_ADDR")
197+
expect(subject.headers.keys).to include("Client-Ip")
198+
expect(subject.headers.keys).to include("X-Real-Ip")
199+
expect(subject.headers.keys).to include("X-Forwarded-For")
250200
end
251201
end
252202
end

0 commit comments

Comments
 (0)