@@ -3,9 +3,9 @@ defmodule Sentry.TransportTest do
33
44 import Sentry.TestHelpers
55
6- alias Sentry . { Envelope , Event , HackneyClient , Transport }
6+ alias Sentry . { ClientError , Envelope , Event , HackneyClient , Transport }
77
8- describe "post_envelope /2" do
8+ describe "encode_and_post_envelope /2" do
99 setup do
1010 bypass = Bypass . open ( )
1111 put_test_config ( dsn: "http://public:secret@localhost:#{ bypass . port } /1" )
@@ -33,31 +33,46 @@ defmodule Sentry.TransportTest do
3333 Plug.Conn . resp ( conn , 200 , ~s< {"id":"123"}> )
3434 end )
3535
36- assert { :ok , "123" } = Transport . post_envelope ( envelope , HackneyClient )
36+ assert { :ok , "123" } = Transport . encode_and_post_envelope ( envelope , HackneyClient )
3737 end
3838
39- defmodule InvalidHTTPClient do
40- def post ( _endpoint , _headers , _body ) do
41- { :ok , "not an integer" , :badarg , % { } }
39+ test "returns an error if the HTTP client returns a badly-typed response" do
40+ defmodule InvalidHTTPClient do
41+ def post ( _endpoint , _headers , _body ) do
42+ Process . get ( :invalid_http_return_value ) ||
43+ raise "missing :invalid_http_return_value from pdict"
44+ end
4245 end
43- end
4446
45- test "returns an error with an invalid response from a POST request" do
4647 envelope = Envelope . from_event ( Event . create_event ( message: "Hello 1" ) )
4748
48- assert { :error ,
49- { :request_failure ,
50- { :malformed_http_client_response , "not an integer" , :badarg , % { } } } } =
51- Transport . post_envelope ( envelope , InvalidHTTPClient , _retries = [ ] )
49+ for { :ok , status , headers , body } = invalid_return_value <- [
50+ { :ok , 10000 , [ ] , "" } ,
51+ { :ok , 200 , % { } , "" } ,
52+ { :ok , 200 , [ ] , :not_a_binary }
53+ ] do
54+ Process . put ( :invalid_http_return_value , invalid_return_value )
55+
56+ assert { :request_failure , { :malformed_http_client_response , ^ status , ^ headers , ^ body } } =
57+ error ( fn ->
58+ Transport . encode_and_post_envelope ( envelope , InvalidHTTPClient , _retries = [ ] )
59+ end )
60+ end
61+ after
62+ Process . delete ( :invalid_http_return_value )
63+ :code . delete ( InvalidHTTPClient )
64+ :code . purge ( InvalidHTTPClient )
5265 end
5366
5467 test "returns the HTTP client's error if the HTTP client returns one" , % { bypass: bypass } do
5568 envelope = Envelope . from_event ( Event . create_event ( message: "Hello" ) )
5669
5770 Bypass . down ( bypass )
5871
59- assert { :error , { :request_failure , :econnrefused } } =
60- Transport . post_envelope ( envelope , HackneyClient , _retries = [ ] )
72+ assert { :request_failure , :econnrefused } =
73+ error ( fn ->
74+ Transport . encode_and_post_envelope ( envelope , HackneyClient , _retries = [ ] )
75+ end )
6176 end
6277
6378 test "returns an error if the response from Sentry is not 200" , % { bypass: bypass } do
@@ -69,10 +84,15 @@ defmodule Sentry.TransportTest do
6984 |> Plug.Conn . resp ( 400 , ~s< {}> )
7085 end )
7186
72- { :error , { _status , headers , _body } } =
73- Transport . post_envelope ( envelope , HackneyClient , _retries = [ ] )
87+ { :error , % ClientError { } = error } =
88+ Transport . encode_and_post_envelope ( envelope , HackneyClient , _retries = [ ] )
7489
90+ assert error . reason == :server_error
91+ assert { 400 , headers , "{}" } = error . http_response
7592 assert :proplists . get_value ( "x-sentry-error" , headers , nil ) == "some error"
93+
94+ assert Exception . message ( error ) =~
95+ "the Sentry server responded with an error, the details are below."
7696 end
7797
7898 test "returns an error if the HTTP client raises an error when making the request" ,
@@ -85,10 +105,10 @@ defmodule Sentry.TransportTest do
85105 end
86106 end
87107
88- assert { :error , { :error , % RuntimeError { } = exception , _stacktrace } } =
89- Transport . post_envelope ( envelope , RaisingHTTPClient , _retries = [ ] )
90-
91- assert exception . message == "I'm a really bad HTTP client"
108+ assert { :error , % RuntimeError { message: "I'm a really bad HTTP client" } , _stacktrace } =
109+ error ( fn ->
110+ Transport . encode_and_post_envelope ( envelope , RaisingHTTPClient , _retries = [ ] )
111+ end )
92112 after
93113 :code . delete ( RaisingHTTPClient )
94114 :code . purge ( RaisingHTTPClient )
@@ -104,8 +124,10 @@ defmodule Sentry.TransportTest do
104124 end
105125 end
106126
107- assert { :error , { :exit , :through_the_window , _stacktrace } } =
108- Transport . post_envelope ( envelope , ExitingHTTPClient , _retries = [ ] )
127+ assert { :exit , :through_the_window , _stacktrace } =
128+ error ( fn ->
129+ Transport . encode_and_post_envelope ( envelope , ExitingHTTPClient , _retries = [ ] )
130+ end )
109131 after
110132 :code . delete ( ExitingHTTPClient )
111133 :code . purge ( ExitingHTTPClient )
@@ -121,8 +143,10 @@ defmodule Sentry.TransportTest do
121143 end
122144 end
123145
124- assert { :error , { :throw , :catch_me_if_you_can , _stacktrace } } =
125- Transport . post_envelope ( envelope , ThrowingHTTPClient , _retries = [ ] )
146+ assert { :throw , :catch_me_if_you_can , _stacktrace } =
147+ error ( fn ->
148+ Transport . encode_and_post_envelope ( envelope , ThrowingHTTPClient , _retries = [ ] )
149+ end )
126150 after
127151 :code . delete ( ThrowingHTTPClient )
128152 :code . purge ( ThrowingHTTPClient )
@@ -145,10 +169,10 @@ defmodule Sentry.TransportTest do
145169
146170 put_test_config ( json_library: CrashingJSONLibrary )
147171
148- assert { :error , { :error , % RuntimeError { } = exception , _stacktrace } } =
149- Transport . post_envelope ( envelope , HackneyClient , _retries = [ ] )
150-
151- assert exception . message == "I'm a really bad JSON library"
172+ assert { :error , % RuntimeError { message: "I'm a really bad JSON library" } , _stacktrace } =
173+ error ( fn ->
174+ Transport . encode_and_post_envelope ( envelope , HackneyClient , _retries = [ ] )
175+ end )
152176 after
153177 :code . delete ( CrashingJSONLibrary )
154178 :code . purge ( CrashingJSONLibrary )
@@ -165,8 +189,10 @@ defmodule Sentry.TransportTest do
165189 Plug.Conn . resp ( conn , 200 , ~s< invalid JSON> )
166190 end )
167191
168- assert { :error , { :request_failure , % Jason.DecodeError { } } } =
169- Transport . post_envelope ( envelope , HackneyClient , _retries = [ 0 ] )
192+ assert { :request_failure , % Jason.DecodeError { } } =
193+ error ( fn ->
194+ Transport . encode_and_post_envelope ( envelope , HackneyClient , _retries = [ 0 ] )
195+ end )
170196
171197 assert_received { :request , ^ ref }
172198 assert_received { :request , ^ ref }
@@ -191,7 +217,8 @@ defmodule Sentry.TransportTest do
191217 end
192218 end )
193219
194- assert { :ok , "123" } = Transport . post_envelope ( envelope , HackneyClient , _retries = [ 10 , 25 ] )
220+ assert { :ok , "123" } =
221+ Transport . encode_and_post_envelope ( envelope , HackneyClient , _retries = [ 10 , 25 ] )
195222
196223 assert System . system_time ( :millisecond ) - start_time >= 35
197224
@@ -213,10 +240,18 @@ defmodule Sentry.TransportTest do
213240 |> Plug.Conn . resp ( 429 , ~s< {}> )
214241 end )
215242
216- assert { :error , :too_many_retries } =
217- Transport . post_envelope ( envelope , HackneyClient , _retries = [ ] )
243+ assert :too_many_retries =
244+ error ( fn ->
245+ Transport . encode_and_post_envelope ( envelope , HackneyClient , _retries = [ ] )
246+ end )
218247
219248 assert_received { :request , ^ ref }
220249 end
221250 end
251+
252+ defp error ( fun ) do
253+ assert { :error , % ClientError { } = error } = fun . ( )
254+ assert is_binary ( Exception . message ( error ) )
255+ error . reason
256+ end
222257end
0 commit comments