20
20
import java .util .concurrent .CompletableFuture ;
21
21
import java .util .concurrent .CompletionStage ;
22
22
23
+ import org .assertj .core .api .SoftAssertions ;
23
24
import org .eclipse .ditto .json .JsonObject ;
24
25
import org .eclipse .ditto .model .base .acks .AcknowledgementLabel ;
25
26
import org .eclipse .ditto .model .base .acks .DittoAcknowledgementLabel ;
@@ -168,7 +169,7 @@ public void monitorAcknowledgementSendSuccessKeepOriginalResponse() {
168
169
}
169
170
170
171
@ Test
171
- public void monitorAcknowledgementSendFailureKeepOriginalResponse () {
172
+ public void monitorAcknowledgementSendSuccessInCaseOfHandledException () {
172
173
final var acknowledgement = Mockito .mock (Acknowledgement .class );
173
174
final var acknowledgementPayload = JsonObject .newBuilder ().set ("foo" , "bar" ).build ();
174
175
final var acknowledgementStatusCode = HttpStatusCode .INTERNAL_SERVER_ERROR ;
@@ -185,12 +186,53 @@ public void monitorAcknowledgementSendFailureKeepOriginalResponse() {
185
186
186
187
final Optional <CompletionStage <CommandResponse >> result = underTest .monitorAndAcknowledge (exceptionConverter );
187
188
188
- Mockito .verifyNoInteractions (publishedMonitor );
189
+ Mockito .verify (publishedMonitor ). success ( externalMessage );
189
190
Mockito .verify (acknowledgedMonitor ).failure (externalMessage , expectedException );
190
191
assertThat (result )
191
192
.hasValueSatisfying (resultFuture -> assertThat (resultFuture ).isCompletedWithValue (acknowledgement ));
192
193
}
193
194
195
+ @ Test
196
+ public void monitorAcknowledgementSendFailureInCaseOfUnhandledException () {
197
+ final var source = Mockito .mock (Signal .class );
198
+ final var thingId = ThingId .generateRandom ();
199
+ Mockito .when (source .getEntityId ()).thenReturn (thingId );
200
+ Mockito .when (source .getDittoHeaders ()).thenReturn (dittoHeaders );
201
+ Mockito .when (mappedOutboundSignal .getSource ()).thenReturn (source );
202
+ Mockito .when (autoAckTarget .getIssuedAcknowledgementLabel ()).thenReturn (Optional .of (ACKNOWLEDGEMENT_LABEL ));
203
+ final var thrownException = new IllegalStateException ("Test" );
204
+ final var acknowledgementPayload = JsonObject .newBuilder ()
205
+ .set ("message" , "Encountered <IllegalStateException>." )
206
+ .set ("description" , "Test" )
207
+ .build ();
208
+ final var acknowledgementStatusCode = HttpStatusCode .INTERNAL_SERVER_ERROR ;
209
+ final var expectedException = MessageSendingFailedException .newBuilder ()
210
+ .statusCode (acknowledgementStatusCode )
211
+ .message ("Received negative acknowledgement for label <" + ACKNOWLEDGEMENT_LABEL + ">." )
212
+ .description ("Payload: " + acknowledgementPayload )
213
+ .build ();
214
+ final CompletableFuture <CommandResponse <?>> failedFuture = new CompletableFuture <>();
215
+ failedFuture .completeExceptionally (thrownException );
216
+ final Sending underTest = new Sending (sendingContext , failedFuture , connectionIdResolver , logger );
217
+
218
+ final Optional <CompletionStage <CommandResponse >> result = underTest .monitorAndAcknowledge (exceptionConverter );
219
+
220
+ Mockito .verify (publishedMonitor ).exception (externalMessage , thrownException );
221
+ Mockito .verify (acknowledgedMonitor ).failure (externalMessage , expectedException );
222
+ assertThat (result ).hasValueSatisfying (
223
+ resultFuture -> assertThat (resultFuture ).isCompletedWithValueMatching (response -> {
224
+ final SoftAssertions softly = new SoftAssertions ();
225
+ softly .assertThat (response ).isInstanceOf (Acknowledgement .class );
226
+ final Acknowledgement ack = (Acknowledgement ) response ;
227
+ softly .assertThat (ack .getLabel ().toString ()).isEqualTo (ACKNOWLEDGEMENT_LABEL .toString ());
228
+ softly .assertThat (ack .getEntity ()).contains (acknowledgementPayload );
229
+ softly .assertThat (ack .getEntityId ().toString ()).isEqualTo (thingId .toString ());
230
+ softly .assertThat (ack .getStatusCode ()).isEqualTo (acknowledgementStatusCode );
231
+ softly .assertAll ();
232
+ return true ;
233
+ }));
234
+ }
235
+
194
236
@ Test
195
237
public void monitorLiveResponseSendSuccessKeepOriginalResponse () {
196
238
final var issuedAckLabel = DittoAcknowledgementLabel .LIVE_RESPONSE ;
@@ -215,23 +257,16 @@ public void monitorLiveResponseSendFailureKeepOriginalResponse() {
215
257
final var issuedAckLabel = DittoAcknowledgementLabel .LIVE_RESPONSE ;
216
258
Mockito .when (autoAckTarget .getIssuedAcknowledgementLabel ()).thenReturn (Optional .of (issuedAckLabel ));
217
259
final CommandResponse <?> commandResponse = Mockito .mock (CommandResponse .class );
218
- final var commandResponsePayload = JsonObject .newBuilder ().set ("foo" , "bar" ).build ();
219
260
final var commandResponseStatusCode = HttpStatusCode .CONFLICT ;
220
261
Mockito .when (commandResponse .getStatusCode ()).thenReturn (commandResponseStatusCode );
221
- Mockito .when (commandResponse .toJson ()).thenReturn (commandResponsePayload );
222
- final var expectedException = MessageSendingFailedException .newBuilder ()
223
- .statusCode (commandResponseStatusCode )
224
- .message ("Received negative acknowledgement for label <" + issuedAckLabel + ">." )
225
- .description ("Payload: " + commandResponsePayload )
226
- .build ();
227
262
final Sending underTest =
228
263
new Sending (sendingContext , CompletableFuture .completedStage (commandResponse ), connectionIdResolver ,
229
264
logger );
230
265
231
266
final Optional <CompletionStage <CommandResponse >> result = underTest .monitorAndAcknowledge (exceptionConverter );
232
267
233
- Mockito .verifyNoInteractions (publishedMonitor );
234
- Mockito .verify (acknowledgedMonitor ).failure (externalMessage , expectedException );
268
+ Mockito .verify (publishedMonitor ). success ( externalMessage );
269
+ Mockito .verify (acknowledgedMonitor ).success (externalMessage );
235
270
assertThat (result )
236
271
.hasValueSatisfying (resultFuture -> assertThat (resultFuture ).isCompletedWithValue (commandResponse ));
237
272
}
@@ -271,4 +306,4 @@ public void monitorAndAcknowledgeWhenFutureResponseTerminatedExceptionallyAndNoA
271
306
assertThat (result ).hasValueSatisfying (resultFuture -> assertThat (resultFuture ).isCompletedWithValue (null ));
272
307
}
273
308
274
- }
309
+ }
0 commit comments