@@ -53,26 +53,67 @@ func TestResponseReaderFunc(t *testing.T) {
5353 assert .Equal (t , 490 , actual .Code )
5454}
5555
56+ type errResponse struct {
57+ A int `json:"a"`
58+ B string `json:"b"`
59+ }
60+
5661func TestResponseReaderFuncError (t * testing.T ) {
57- reader := ClientResponseReaderFunc (func (r ClientResponse , _ Consumer ) (any , error ) {
58- _ , _ = io .ReadAll (r .Body ())
59- return nil , NewAPIError ("fake" , errors .New ("writer closed" ), 490 )
62+ t .Parallel ()
63+
64+ t .Run ("with API error as string" , func (t * testing.T ) {
65+ reader := ClientResponseReaderFunc (func (r ClientResponse , _ Consumer ) (any , error ) {
66+ _ , _ = io .ReadAll (r .Body ())
67+
68+ return nil , NewAPIError ("fake" , errors .New ("writer closed" ), 490 )
69+ })
70+
71+ _ , err := reader .ReadResponse (response {}, nil )
72+ require .Error (t , err )
73+ require .ErrorContains (t , err , "'writer closed'" )
6074 })
61- _ , err := reader .ReadResponse (response {}, nil )
62- require .Error (t , err )
63- require .ErrorContains (t , err , "writer closed" )
64-
65- reader = func (r ClientResponse , _ Consumer ) (any , error ) {
66- _ , _ = io .ReadAll (r .Body ())
67- err := & fs.PathError {
68- Op : "write" ,
69- Path : "path/to/fake" ,
70- Err : fs .ErrClosed ,
71- }
72- return nil , NewAPIError ("fake" , err , 200 )
73- }
74- _ , err = reader .ReadResponse (response {}, nil )
75- require .Error (t , err )
76- assert .Contains (t , err .Error (), "file already closed" )
7775
76+ t .Run ("with API error as complex error" , func (t * testing.T ) {
77+ reader := ClientResponseReaderFunc (func (r ClientResponse , _ Consumer ) (any , error ) {
78+ _ , _ = io .ReadAll (r .Body ())
79+ err := & fs.PathError {
80+ Op : "write" ,
81+ Path : "path/to/fake" ,
82+ Err : fs .ErrClosed ,
83+ }
84+
85+ return nil , NewAPIError ("fake" , err , 200 )
86+ })
87+
88+ _ , err := reader .ReadResponse (response {}, nil )
89+ require .Error (t , err )
90+ assert .Contains (t , err .Error (), "file already closed" )
91+ })
92+
93+ t .Run ("with API error requiring escaping" , func (t * testing.T ) {
94+ reader := ClientResponseReaderFunc (func (r ClientResponse , _ Consumer ) (any , error ) {
95+ _ , _ = io .ReadAll (r .Body ())
96+ return nil , NewAPIError ("fake" , errors .New (`writer is \"terminated\" and 'closed'` ), 490 )
97+ })
98+
99+ _ , err := reader .ReadResponse (response {}, nil )
100+ require .Error (t , err )
101+ require .ErrorContains (t , err , `'writer is \\"terminated\\" and \'closed\''` )
102+ })
103+
104+ t .Run ("with API error as JSON" , func (t * testing.T ) {
105+ reader := ClientResponseReaderFunc (func (r ClientResponse , _ Consumer ) (any , error ) {
106+ _ , _ = io .ReadAll (r .Body ())
107+ obj := & errResponse { // does not implement error
108+ A : 555 ,
109+ B : "closed" ,
110+ }
111+
112+ return nil , NewAPIError ("fake" , obj , 200 )
113+ })
114+
115+ _ , err := reader .ReadResponse (response {}, nil )
116+ require .Error (t , err )
117+ assert .Contains (t , err .Error (), `{"a":555,"b":"closed"}` )
118+ })
78119}
0 commit comments