diff --git a/pom.xml b/pom.xml index 1ff88c5..169ca6b 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ http://github.com/NoEnv/vertx-wiremongo - 5.1.9-SNAPSHOT + 5.2.0 diff --git a/src/main/java/com/noenv/wiremongo/WireMongoClient.java b/src/main/java/com/noenv/wiremongo/WireMongoClient.java index 942dc77..9b3b43c 100644 --- a/src/main/java/com/noenv/wiremongo/WireMongoClient.java +++ b/src/main/java/com/noenv/wiremongo/WireMongoClient.java @@ -4,6 +4,7 @@ import com.noenv.wiremongo.command.Command; import com.noenv.wiremongo.command.CountCommand; import com.noenv.wiremongo.command.CountWithOptionsCommand; +import com.noenv.wiremongo.command.PingCommand; import com.noenv.wiremongo.command.RunCommandCommand; import com.noenv.wiremongo.command.aggregate.AggregateBaseCommand; import com.noenv.wiremongo.command.aggregate.AggregateWithOptionsCommand; @@ -275,6 +276,11 @@ public Future runCommand(String commandName, JsonObject command) { return call(new RunCommandCommand(commandName, command)); } + @Override + public Future<@Nullable JsonObject> ping() { + return call(new PingCommand()); + } + @Override public Future distinct(String collection, String fieldName, String resultClassname) { return call(new DistinctCommand(collection, fieldName, resultClassname)); diff --git a/src/main/java/com/noenv/wiremongo/WireMongoCommands.java b/src/main/java/com/noenv/wiremongo/WireMongoCommands.java index 4613f8e..aacd8a3 100644 --- a/src/main/java/com/noenv/wiremongo/WireMongoCommands.java +++ b/src/main/java/com/noenv/wiremongo/WireMongoCommands.java @@ -193,6 +193,10 @@ default RunCommand runCommand() { return addMapping(new RunCommand()); } + default Ping ping() { + return addMapping(new Ping()); + } + default Aggregate aggregate() { return addMapping(new Aggregate()); } diff --git a/src/main/java/com/noenv/wiremongo/command/PingCommand.java b/src/main/java/com/noenv/wiremongo/command/PingCommand.java new file mode 100644 index 0000000..02f2671 --- /dev/null +++ b/src/main/java/com/noenv/wiremongo/command/PingCommand.java @@ -0,0 +1,7 @@ +package com.noenv.wiremongo.command; + +public class PingCommand extends CommandBase { + public PingCommand() { + super("ping"); + } +} diff --git a/src/main/java/com/noenv/wiremongo/mapping/Mapping.java b/src/main/java/com/noenv/wiremongo/mapping/Mapping.java index ef57a54..9ee7c78 100644 --- a/src/main/java/com/noenv/wiremongo/mapping/Mapping.java +++ b/src/main/java/com/noenv/wiremongo/mapping/Mapping.java @@ -150,6 +150,8 @@ static Mapping create(JsonObject json) { return new CreateIndexWithOptions(json); case "runCommand": return new RunCommand(json); + case "ping": + return new Ping(json); case "count": return new Count(json); case "countWithOptions": diff --git a/src/main/java/com/noenv/wiremongo/mapping/Ping.java b/src/main/java/com/noenv/wiremongo/mapping/Ping.java new file mode 100644 index 0000000..6c957ad --- /dev/null +++ b/src/main/java/com/noenv/wiremongo/mapping/Ping.java @@ -0,0 +1,25 @@ +package com.noenv.wiremongo.mapping; + +import com.noenv.wiremongo.command.PingCommand; +import io.vertx.core.json.JsonObject; + +public class Ping extends MappingBase { + + public Ping() { + super("ping"); + } + + public Ping(JsonObject json) { + super(json); + } + + @Override + public Ping returns(final JsonObject response) { + return stub(c -> null == response ? null : response.copy()); + } + + @Override + protected JsonObject parseResponse(Object jsonValue) { + return (JsonObject) jsonValue; + } +} diff --git a/src/test/java/com/noenv/wiremongo/mapping/PingTest.java b/src/test/java/com/noenv/wiremongo/mapping/PingTest.java new file mode 100644 index 0000000..78a640c --- /dev/null +++ b/src/test/java/com/noenv/wiremongo/mapping/PingTest.java @@ -0,0 +1,65 @@ +package com.noenv.wiremongo.mapping; + +import com.noenv.wiremongo.TestBase; +import io.vertx.core.json.JsonObject; +import io.vertx.ext.unit.TestContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; +import io.vertx.rxjava3.CompletableHelper; +import io.vertx.rxjava3.MaybeHelper; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(VertxUnitRunner.class) +public class PingTest extends TestBase { + + @Test + public void testPing(TestContext ctx) { + Mapping m = mock.ping() + .returns(new JsonObject().put("ok", 1)); + + db.rxPing() + .subscribe(MaybeHelper.toObserver(ctx.asyncAssertSuccess(r -> { + ctx.assertEquals(1, r.getInteger("ok")); + mock.removeMapping(m); + }))); + } + + @Test + public void testPingError(TestContext ctx) { + Mapping m = mock.ping() + .returnsError(new Exception("intentional")); + + db.rxPing() + .doOnError(assertIntentionalError(ctx, "intentional")) + .subscribe(MaybeHelper.toObserver(ctx.asyncAssertFailure(ex -> mock.removeMapping(m)))); + } + + @Test + public void testPingReturnedObjectNotModified(TestContext ctx) { + final JsonObject given = new JsonObject().put("ok", 1).put("field", "value"); + final JsonObject expected = given.copy(); + + Mapping m = mock.ping().returns(given); + + db.rxPing() + .doOnSuccess(actual -> ctx.assertEquals(expected, actual)) + .doOnSuccess(actual -> { + actual.put("ok", "replace"); + actual.remove("field"); + actual.put("add", "add"); + }) + .repeat(2) + .ignoreElements() + .subscribe(CompletableHelper.toObserver(ctx.asyncAssertSuccess(v -> mock.removeMapping(m)))); + } + + @Test + public void testPingMappingFromJson(TestContext ctx) { + Mapping m = Mapping.create(new JsonObject() + .put("method", "ping") + .put("response", new JsonObject().put("ok", 1))); + + ctx.assertTrue(m instanceof Ping); + ctx.assertEquals("ping", ((Ping) m).method()); + } +}