From e9e4ad531140d8d2df91f50ce5d730df7ebae39d Mon Sep 17 00:00:00 2001 From: Dominik Guggemos Date: Mon, 9 Nov 2020 11:46:45 +0100 Subject: [PATCH] fix error mapping in ImplicitThingCreationMessageMapper, add tests Signed-off-by: Dominik Guggemos --- .../ImplicitThingCreationMessageMapper.java | 7 +++-- ...mplicitThingCreationMessageMapperTest.java | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/services/connectivity/mapping/src/main/java/org/eclipse/ditto/services/connectivity/mapping/ImplicitThingCreationMessageMapper.java b/services/connectivity/mapping/src/main/java/org/eclipse/ditto/services/connectivity/mapping/ImplicitThingCreationMessageMapper.java index f39c9ca9bc..43d9920838 100644 --- a/services/connectivity/mapping/src/main/java/org/eclipse/ditto/services/connectivity/mapping/ImplicitThingCreationMessageMapper.java +++ b/services/connectivity/mapping/src/main/java/org/eclipse/ditto/services/connectivity/mapping/ImplicitThingCreationMessageMapper.java @@ -227,9 +227,12 @@ private static String getCopyPolicyFrom(final JsonObject thingJson) { @Override public List map(final Adaptable adaptable) { if (TopicPath.Criterion.ERRORS.equals(adaptable.getTopicPath().getCriterion())) { - throw GlobalErrorRegistry.getInstance().parse(adaptable.getPayload().toJson(), adaptable.getDittoHeaders()); + adaptable.getPayload().getValue().filter(JsonValue::isObject).map(JsonValue::asObject) + .ifPresent(jsonObject -> { + throw GlobalErrorRegistry.getInstance().parse(jsonObject, + adaptable.getDittoHeaders()); + }); } - return Collections.emptyList(); } diff --git a/services/connectivity/mapping/src/test/java/org/eclipse/ditto/services/connectivity/mapping/ImplicitThingCreationMessageMapperTest.java b/services/connectivity/mapping/src/test/java/org/eclipse/ditto/services/connectivity/mapping/ImplicitThingCreationMessageMapperTest.java index 5875f920b4..46984b2877 100644 --- a/services/connectivity/mapping/src/test/java/org/eclipse/ditto/services/connectivity/mapping/ImplicitThingCreationMessageMapperTest.java +++ b/services/connectivity/mapping/src/test/java/org/eclipse/ditto/services/connectivity/mapping/ImplicitThingCreationMessageMapperTest.java @@ -28,19 +28,24 @@ import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.json.JsonValue; import org.eclipse.ditto.model.base.headers.DittoHeaderDefinition; +import org.eclipse.ditto.model.base.headers.DittoHeaders; import org.eclipse.ditto.model.connectivity.MessageMapperConfigurationInvalidException; import org.eclipse.ditto.model.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.model.policies.PoliciesResourceType; import org.eclipse.ditto.model.policies.Policy; import org.eclipse.ditto.model.policies.SubjectIssuer; import org.eclipse.ditto.model.things.Thing; +import org.eclipse.ditto.model.things.ThingId; import org.eclipse.ditto.model.things.ThingsModelFactory; import org.eclipse.ditto.protocoladapter.Adaptable; import org.eclipse.ditto.protocoladapter.DittoProtocolAdapter; import org.eclipse.ditto.services.models.connectivity.ExternalMessage; import org.eclipse.ditto.services.models.connectivity.ExternalMessageFactory; import org.eclipse.ditto.signals.base.Signal; +import org.eclipse.ditto.signals.commands.things.ThingErrorResponse; +import org.eclipse.ditto.signals.commands.things.exceptions.ThingConflictException; import org.eclipse.ditto.signals.commands.things.modify.CreateThing; +import org.eclipse.ditto.signals.commands.things.modify.CreateThingResponse; import org.junit.Before; import org.junit.Test; @@ -282,6 +287,27 @@ public void throwErrorIfHeaderForPlaceholderIsMissing() { .isThrownBy(() -> underTest.map(externalMessage)); } + @Test + public void throwExceptionOnErrorResponse() { + underTest.configure(mappingConfig, createMapperConfig(THING_TEMPLATE, COMMAND_HEADERS)); + final ThingConflictException conflictException = + ThingConflictException.newBuilder(ThingId.generateRandom()).build(); + final Signal thingErrorResponse = ThingErrorResponse.of(conflictException); + final Adaptable errorAdaptable = DittoProtocolAdapter.newInstance().toAdaptable(thingErrorResponse); + assertThatExceptionOfType(ThingConflictException.class) + .isThrownBy(() -> underTest.map(errorAdaptable)); + } + + @Test + public void regularCommandResponsesAreNotMapped() { + underTest.configure(mappingConfig, createMapperConfig(THING_TEMPLATE, COMMAND_HEADERS)); + final Signal thingResponse = + CreateThingResponse.of(Thing.newBuilder().setId(ThingId.generateRandom()).build(), + DittoHeaders.empty()); + final Adaptable adaptable = DittoProtocolAdapter.newInstance().toAdaptable(thingResponse); + assertThat(underTest.map(adaptable)).isEmpty(); + } + private static Signal getFirstMappedSignal(final List mappingResult) { return mappingResult.stream().findFirst() .map(DITTO_PROTOCOL_ADAPTER::fromAdaptable)