Skip to content

Commit

Permalink
Added unit-tests and EventMappers for SubscriptionEvents
Browse files Browse the repository at this point in the history
Signed-off-by: David Schwilk <david.schwilk@bosch.io>
  • Loading branch information
DerSchwilk committed Feb 27, 2020
1 parent 50ffa01 commit d25ba7f
Show file tree
Hide file tree
Showing 5 changed files with 396 additions and 43 deletions.
Expand Up @@ -18,7 +18,11 @@

import org.eclipse.ditto.json.JsonArray;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonParseException;
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.model.base.common.HttpStatusCode;
import org.eclipse.ditto.model.base.exceptions.DittoRuntimeException;
import org.eclipse.ditto.protocoladapter.Adaptable;
import org.eclipse.ditto.protocoladapter.JsonifiableMapper;
import org.eclipse.ditto.signals.events.thingsearch.SubscriptionComplete;
import org.eclipse.ditto.signals.events.thingsearch.SubscriptionCreated;
Expand All @@ -41,7 +45,6 @@ static SubscriptionEventMappingStrategies getInstance() {
return INSTANCE;
}

//TODO: Implement Exception + Array for SubscriptionFailed and SubscriptionHasNext
private static Map<String, JsonifiableMapper<SubscriptionEvent<?>>> initMappingStrategies() {
final Map<String, JsonifiableMapper<SubscriptionEvent<?>>> mappingStrategies = new HashMap<>();
mappingStrategies.put(SubscriptionCreated.TYPE,
Expand All @@ -52,14 +55,46 @@ private static Map<String, JsonifiableMapper<SubscriptionEvent<?>>> initMappingS
dittoHeadersFrom(adaptable)));
mappingStrategies.put(SubscriptionFailed.TYPE,
adaptable -> SubscriptionFailed.of(Objects.requireNonNull(subscriptionIdFrom(adaptable)),
DittoRuntimeException.fromUnknownErrorJson(
JsonObject.empty(), dittoHeadersFrom(adaptable)).get(), dittoHeadersFrom(adaptable)));
errorFrom(adaptable), dittoHeadersFrom(adaptable)));
mappingStrategies.put(SubscriptionHasNext.TYPE,
adaptable -> SubscriptionHasNext.of(Objects.requireNonNull(subscriptionIdFrom(adaptable)),
JsonArray.empty(), dittoHeadersFrom(adaptable)));
itemsFrom(adaptable), dittoHeadersFrom(adaptable)));

return mappingStrategies;
}

private static JsonArray itemsFrom(final Adaptable adaptable) {
if (adaptable.getPayload().getValue().isPresent()) {
final JsonObject value = JsonObject.of(
adaptable
.getPayload()
.getValue()
.map(JsonValue::formatAsString)
.orElseThrow(() -> JsonParseException.newBuilder().build()));

return value.getValue("items").map(JsonValue::asArray).orElse(JsonArray.empty());
}
return JsonArray.empty();
}

private static DittoRuntimeException errorFrom(final Adaptable adaptable) {
if (adaptable.getPayload().getValue().isPresent()) {
final JsonObject value = JsonObject.of(
adaptable
.getPayload()
.getValue()
.map(JsonValue::formatAsString)
.orElseThrow(() -> JsonParseException.newBuilder().build()));

return DittoRuntimeException.fromUnknownErrorJson(
JsonObject.of(value.getValue("error").map(JsonValue::formatAsString)
.orElseThrow(() -> JsonParseException.newBuilder().build())), dittoHeadersFrom(adaptable))
.orElseThrow(() -> JsonParseException.newBuilder().build());


}
return DittoRuntimeException.newBuilder(JsonParseException.newBuilder().build().toString(),
HttpStatusCode.BAD_REQUEST).build();
}

}
Expand Up @@ -23,7 +23,7 @@
import org.eclipse.ditto.protocoladapter.PayloadBuilder;
import org.eclipse.ditto.protocoladapter.ProtocolFactory;
import org.eclipse.ditto.protocoladapter.TopicPath;
import org.eclipse.ditto.protocoladapter.UnknownCommandException;
import org.eclipse.ditto.protocoladapter.UnknownEventException;
import org.eclipse.ditto.protocoladapter.adaptables.MappingStrategiesFactory;
import org.eclipse.ditto.signals.events.things.ThingEvent;
import org.eclipse.ditto.signals.events.thingsearch.SubscriptionComplete;
Expand Down Expand Up @@ -52,58 +52,55 @@ public static SubscriptionEventAdapter of(final HeaderTranslator headerTranslato
}

private static String getActionNameWithFirstLetterUpperCase(final TopicPath topicPath) {
return topicPath.getAction()
.map(TopicPath.Action::toString)
return topicPath.getSearchAction()
.map(TopicPath.SearchAction::toString)
.map(AbstractAdapter::upperCaseFirst)
.orElseThrow(() -> new NullPointerException("TopicPath did not contain an Action!"));
}


@Override
protected String getType(final Adaptable adaptable) {
final TopicPath topicPath = adaptable.getTopicPath();
final JsonPointer path = adaptable.getPayload().getPath();
final String eventName = payloadPathMatcher.match(path) + getActionNameWithFirstLetterUpperCase(topicPath);
return topicPath.getGroup() + "." + topicPath.getCriterion() + ":" + eventName;
return SubscriptionEvent.TYPE_PREFIX + adaptable.getTopicPath().getSearchAction().orElse(null);
}

@Override
protected Adaptable mapSignalToAdaptable(final SubscriptionEvent<?> event, final TopicPath.Channel channel) {

TopicPath topicPath = null;
final PayloadBuilder payloadBuilder = Payload.newBuilder();
final PayloadBuilder payloadBuilder = Payload.newBuilder(event.getResourcePath());

final String eventName = event.getClass().getSimpleName().toLowerCase();
if (eventName.startsWith(TopicPath.SearchAction.GENERATED.toString())) {
final String eventName = event.getClass().getSimpleName().toLowerCase().replace("subscription", "");
if (eventName.startsWith(TopicPath.SearchAction.GENERATED.toString().toLowerCase())) {
topicPath = TopicPath.fromNamespace("_").things().twin().search().generated().build();
SubscriptionCreated createdEvent = (SubscriptionCreated) event;
payloadBuilder.withValue(JsonObject.of(
String.format("{\"subscriptionId\": \"%s\"}", createdEvent.getSubscriptionId())));

} else if (eventName.startsWith(TopicPath.SearchAction.CANCEL.toString())) {
topicPath = TopicPath.fromNamespace("_").things().twin().search().cancel().build();
} else if (eventName.startsWith(TopicPath.SearchAction.COMPLETE.toString().toLowerCase())) {
topicPath = TopicPath.fromNamespace("_").things().twin().search().complete().build();
SubscriptionComplete completedEvent = (SubscriptionComplete) event;
payloadBuilder.withValue(JsonObject.of(
String.format("{\"subscriptionId\": \"%s\"}", completedEvent.getSubscriptionId())));

} else if (eventName.startsWith(TopicPath.SearchAction.FAILED.toString())) {
} else if (eventName.startsWith(TopicPath.SearchAction.FAILED.toString().toLowerCase())) {
topicPath = TopicPath.fromNamespace("_").things().twin().search().failed().build();
SubscriptionFailed failedEvent = (SubscriptionFailed) event;
payloadBuilder.withValue(JsonObject.of(
String.format("{\"subscriptionId\": \"%s\", \"error\": \"%s\"}",
String.format("{\"subscriptionId\": \"%s\", \"error\": %s}",
failedEvent.getSubscriptionId(),
failedEvent.getError())));
failedEvent.getError().toJson())));

} else if (eventName.startsWith(TopicPath.SearchAction.HAS_NEXT.toString())) {
} else if (eventName.startsWith(TopicPath.SearchAction.HAS_NEXT.toString().toLowerCase())) {
topicPath = TopicPath.fromNamespace("_").things().twin().search().hasNext().build();
SubscriptionHasNext hasNextEvent = (SubscriptionHasNext) event;
payloadBuilder.withValue(JsonObject.of(
String.format("{\"subscriptionId\": \"%s\", \"items\": \"%s\"}",
String.format("{\"subscriptionId\": \"%s\", \"items\": %s}",
hasNextEvent.getSubscriptionId(),
hasNextEvent.getItems())));

} else {
throw UnknownCommandException.newBuilder(eventName).build();
throw UnknownEventException.newBuilder(eventName).build();
}


Expand Down
Expand Up @@ -56,6 +56,6 @@ public Adaptable mapSignalToAdaptable(final ThingSearchCommand<?> command, final
protected String getType(final Adaptable adaptable) {

return ThingSearchCommand.TYPE_PREFIX + adaptable.getTopicPath().getSearchAction().orElse(null);
}

}
}
}
Expand Up @@ -17,16 +17,12 @@

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import javax.annotation.Nullable;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.ditto.json.JsonArray;
import org.eclipse.ditto.json.JsonFieldSelector;
import org.eclipse.ditto.json.JsonObject;
Expand All @@ -35,6 +31,7 @@
import org.eclipse.ditto.model.base.auth.AuthorizationSubject;
import org.eclipse.ditto.model.base.common.DittoConstants;
import org.eclipse.ditto.model.base.common.HttpStatusCode;
import org.eclipse.ditto.model.base.exceptions.DittoRuntimeException;
import org.eclipse.ditto.model.base.headers.DittoHeaderDefinition;
import org.eclipse.ditto.model.base.headers.DittoHeaders;
import org.eclipse.ditto.model.base.json.JsonSchemaVersion;
Expand Down Expand Up @@ -70,7 +67,8 @@
*/
public final class TestConstants {

public static final Set<String> NAMESPACES = new HashSet<>(Arrays.asList("org.eclipse.ditto.test","org.eclipse.ditto.footest"));
public static final Set<String> NAMESPACES =
new HashSet<>(Arrays.asList("org.eclipse.ditto.test", "org.eclipse.ditto.footest"));
public static final String NAMESPACE = "org.eclipse.ditto.test";

public static final String NAME = "myThing";
Expand Down Expand Up @@ -193,6 +191,22 @@ public static Adaptable adaptable(final TopicPath topicPath, final JsonPointer p
.build();
}

public static final String FILTER = "eq(attributes/foo, bar)";

public static final List<String> OPTIONS = Arrays.asList("sort(+thingId)", "cursor(200)");

public static final JsonFieldSelector FIELDS = JsonFieldSelector.newInstance("/attributes", "/definition");

public static final String SUBSCRIPTION_ID = "123456781234";

public static final long DEMAND = 12;

public static final JsonArray ITEMS =
JsonArray.of(THING.toJson(), THING2.toJson());

public static final DittoRuntimeException EXCEPTION =
DittoRuntimeException.newBuilder("TestException", HttpStatusCode.BAD_REQUEST).build();

public static class Policies {

static final String POLICY_NAME = "myPolicy";
Expand Down Expand Up @@ -242,16 +256,6 @@ public static class TopicPaths {

}

public static final String FILTER = "eq(attributes/foo, bar)";

public static final List<String> OPTIONS= Arrays.asList("sort(+thingId)", "cursor(200)");

public static final JsonFieldSelector FIELDS = JsonFieldSelector.newInstance("/attributes", "/definition");

public static final String SUBSCRIPTION_ID = "123456781234";

public static final long DEMAND = 12;

private TestConstants() {
throw new AssertionError();
}
Expand Down

0 comments on commit d25ba7f

Please sign in to comment.