@@ -137,6 +137,93 @@ public MockResponse dispatch(@NotNull final RecordedRequest recordedRequest) {
137137 .hasMessage ("Inference request failed: 400: Not Found" );
138138 }
139139
140+ @ Test
141+ void testFallbackDetailAsArray () {
142+ final Dispatcher dispatcher = new Dispatcher () {
143+ @ NotNull
144+ @ Override
145+ public MockResponse dispatch (@ NotNull final RecordedRequest recordedRequest ) {
146+ return new MockResponse .Builder ()
147+ .code (422 )
148+ .body ("""
149+ {
150+ "detail": [{"loc": ["body"], "msg": "field required", "type": "value_error.missing"}]
151+ }""" )
152+ .build ();
153+ }
154+ };
155+ this .mockServer .getMockWebServer ().setDispatcher (dispatcher );
156+
157+ final KServeClientV2 <String > client = KServeClientV2 .<String >builder ()
158+ .serviceBaseUrl (this .mockServer .getServiceBaseUrl ())
159+ .modelName ("test-model" )
160+ .httpClient (KServeClient .getHttpClient (Duration .ofMillis (10000 )))
161+ .build ();
162+
163+ final InferenceRequest <String > fakeInferenceRequest = getFakeInferenceRequest ("data" );
164+ this .softly .assertThatThrownBy (
165+ () -> client .makeInferenceRequest (fakeInferenceRequest , FakePrediction .class , "" ))
166+ .isInstanceOf (InferenceRequestException .class )
167+ .hasMessageContaining ("field required" );
168+ }
169+
170+ @ Test
171+ void testFallbackUnknownJsonBody () {
172+ final Dispatcher dispatcher = new Dispatcher () {
173+ @ NotNull
174+ @ Override
175+ public MockResponse dispatch (@ NotNull final RecordedRequest recordedRequest ) {
176+ return new MockResponse .Builder ()
177+ .code (500 )
178+ .body ("""
179+ {
180+ "message": "Internal server error"
181+ }""" )
182+ .build ();
183+ }
184+ };
185+ this .mockServer .getMockWebServer ().setDispatcher (dispatcher );
186+
187+ final KServeClientV2 <String > client = KServeClientV2 .<String >builder ()
188+ .serviceBaseUrl (this .mockServer .getServiceBaseUrl ())
189+ .modelName ("test-model" )
190+ .httpClient (KServeClient .getHttpClient (Duration .ofMillis (10000 )))
191+ .build ();
192+
193+ final InferenceRequest <String > fakeInferenceRequest = getFakeInferenceRequest ("data" );
194+ this .softly .assertThatThrownBy (
195+ () -> client .makeInferenceRequest (fakeInferenceRequest , FakePrediction .class , "" ))
196+ .isInstanceOf (InferenceRequestException .class )
197+ .hasMessageContaining ("Unknown error occurred. Raw body:" );
198+ }
199+
200+ @ Test
201+ void testFallbackNonJsonBody () {
202+ final Dispatcher dispatcher = new Dispatcher () {
203+ @ NotNull
204+ @ Override
205+ public MockResponse dispatch (@ NotNull final RecordedRequest recordedRequest ) {
206+ return new MockResponse .Builder ()
207+ .code (503 )
208+ .body ("Service Unavailable" )
209+ .build ();
210+ }
211+ };
212+ this .mockServer .getMockWebServer ().setDispatcher (dispatcher );
213+
214+ final KServeClientV2 <String > client = KServeClientV2 .<String >builder ()
215+ .serviceBaseUrl (this .mockServer .getServiceBaseUrl ())
216+ .modelName ("test-model" )
217+ .httpClient (KServeClient .getHttpClient (Duration .ofMillis (10000 )))
218+ .build ();
219+
220+ final InferenceRequest <String > fakeInferenceRequest = getFakeInferenceRequest ("data" );
221+ this .softly .assertThatThrownBy (
222+ () -> client .makeInferenceRequest (fakeInferenceRequest , FakePrediction .class , "" ))
223+ .isInstanceOf (InferenceRequestException .class )
224+ .hasMessageContaining ("Service Unavailable" );
225+ }
226+
140227 @ Test
141228 void testRetry () throws IOException {
142229 this .mockServer .setUpForRetryTest ();
0 commit comments