@@ -8,16 +8,20 @@ package api
88import (
99 "bytes"
1010 "context"
11+ "encoding/json"
1112 "errors"
1213 "io"
1314 _http "net/http"
1415 "testing"
1516
1617 "github.com/go-faker/faker/v4"
1718 "github.com/stretchr/testify/assert"
19+ "github.com/stretchr/testify/require"
1820
21+ "github.com/ARM-software/embedded-development-services-client/client"
1922 "github.com/ARM-software/golang-utils/utils/commonerrors"
2023 "github.com/ARM-software/golang-utils/utils/commonerrors/errortest"
24+ "github.com/ARM-software/golang-utils/utils/field"
2125)
2226
2327func TestIsAPICallSuccessful (t * testing.T ) {
@@ -104,6 +108,66 @@ func TestCallAndCheckSuccess(t *testing.T) {
104108 assert .Equal (t , actualErr .Error (), expectedErr )
105109 })
106110
111+ t .Run ("api call successful, marshalling failed due to missing required field in response" , func (t * testing.T ) {
112+ expectedErrorMessage := client.ErrorResponse {
113+ Fields : []client.FieldObject {{
114+ FieldName : faker .Name (),
115+ FieldPath : field .ToOptionalString (faker .Name ()),
116+ Message : faker .Sentence (),
117+ }},
118+ HttpStatusCode : 200 ,
119+ Message : faker .Sentence (),
120+ RequestId : faker .UUIDDigit (),
121+ }
122+ response , err := expectedErrorMessage .ToMap ()
123+ require .NoError (t , err )
124+ delete (response , "message" )
125+
126+ reducedResponse , err := json .Marshal (response )
127+ require .NoError (t , err )
128+
129+ errorResponse := client.ErrorResponse {}
130+ errM := errorResponse .UnmarshalJSON (reducedResponse )
131+ require .Error (t , errM )
132+
133+ parentCtx := context .Background ()
134+ _ , err = CallAndCheckSuccess [client.ErrorResponse ](parentCtx , "test" ,
135+ func (ctx context.Context ) (* client.ErrorResponse , * _http.Response , error ) {
136+ return & errorResponse , & _http.Response {StatusCode : 200 , Body : io .NopCloser (bytes .NewReader (reducedResponse ))}, errM
137+ })
138+ require .Error (t , err )
139+ errortest .AssertError (t , err , commonerrors .ErrMarshalling )
140+ })
141+
142+ t .Run ("api call successful, strict marshalling failed but recovery" , func (t * testing.T ) {
143+ expectedErrorMessage := client.ErrorResponse {
144+ Fields : []client.FieldObject {{
145+ FieldName : faker .Name (),
146+ FieldPath : field .ToOptionalString (faker .Name ()),
147+ Message : faker .Sentence (),
148+ }},
149+ HttpStatusCode : 200 ,
150+ Message : faker .Sentence (),
151+ RequestId : faker .UUIDDigit (),
152+ }
153+ response , err := expectedErrorMessage .ToMap ()
154+ require .NoError (t , err )
155+ response [faker .Word ()] = faker .Name ()
156+ response [faker .Word ()] = faker .Sentence ()
157+ response [faker .Word ()] = faker .Paragraph ()
158+ response [faker .Word ()] = faker .UUIDDigit ()
159+ extendedResponse , err := json .Marshal (response )
160+ require .NoError (t , err )
161+ errMessage := "no error"
162+ parentCtx := context .Background ()
163+ result , err := CallAndCheckSuccess [client.ErrorResponse ](parentCtx , errMessage ,
164+ func (ctx context.Context ) (* client.ErrorResponse , * _http.Response , error ) {
165+ return & client.ErrorResponse {}, & _http.Response {StatusCode : 200 , Body : io .NopCloser (bytes .NewReader (extendedResponse ))}, errors .New (errMessage )
166+ })
167+ require .NoError (t , err )
168+ assert .Equal (t , expectedErrorMessage , * result )
169+ })
170+
107171 t .Run ("api call successful, empty response" , func (t * testing.T ) {
108172 errMessage := "no error"
109173 parentCtx := context .Background ()
@@ -152,7 +216,7 @@ func TestGenericCallAndCheckSuccess(t *testing.T) {
152216 assert .Equal (t , actualErr .Error (), expectedErr )
153217 })
154218
155- t .Run ("no context error, api call successful" , func (t * testing.T ) {
219+ t .Run ("api call successful but error marshalling " , func (t * testing.T ) {
156220 errMessage := "no error"
157221 parentCtx := context .Background ()
158222 _ , err := GenericCallAndCheckSuccess (parentCtx , errMessage ,
@@ -164,7 +228,8 @@ func TestGenericCallAndCheckSuccess(t *testing.T) {
164228 }
165229 return & tmp , & _http.Response {StatusCode : 200 }, errors .New (errMessage )
166230 })
167- assert .NoError (t , err )
231+ require .Error (t , err )
232+ errortest .AssertError (t , err , commonerrors .ErrMarshalling )
168233 })
169234
170235 t .Run ("api call successful, empty response" , func (t * testing.T ) {
@@ -178,11 +243,10 @@ func TestGenericCallAndCheckSuccess(t *testing.T) {
178243 })
179244
180245 t .Run ("api call successful, incorrect response" , func (t * testing.T ) {
181- errMessage := "response error"
182246 parentCtx := context .Background ()
183- _ , err := GenericCallAndCheckSuccess (parentCtx , errMessage ,
247+ _ , err := GenericCallAndCheckSuccess (parentCtx , "response error" ,
184248 func (ctx context.Context ) (struct {}, * _http.Response , error ) {
185- return struct {}{}, & _http.Response {StatusCode : 200 }, errors . New ( errMessage )
249+ return struct {}{}, & _http.Response {StatusCode : 200 }, nil
186250 })
187251 errortest .AssertError (t , err , commonerrors .ErrConflict )
188252 })
0 commit comments