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());
+ }
+}