From a4ce9ed10d6b69815037b0a1410e3d94af2ff42e Mon Sep 17 00:00:00 2001 From: Georg Aigner Date: Fri, 18 Sep 2026 13:02:09 +0200 Subject: [PATCH] support Vert.x 5.2.0: implement MongoClient.ping() Vert.x 5.2.0 adds a new abstract method to io.vertx.ext.mongo.MongoClient: Future<@Nullable JsonObject> ping(); WireMongoClient implements that interface, so the build fails against 5.2.0 until the method is provided. Implement it as a regular mockable command rather than an UnsupportedOperationException, so that callers can stub ping() like any other command. Wired in at the usual five points, modelled on the no-argument getCollections and the JsonObject-returning runCommand: - command/PingCommand.java - CommandBase with method name "ping" - mapping/Ping.java - MappingBase, defensive copy of the response in returns() - mapping/Mapping.java - "ping" case in the JSON mapping dispatch - WireMongoCommands.java - ping() stub factory - WireMongoClient.java - the MongoClient.ping() override No wiremongo-mocks/ping.json fixture is added on purpose. TestBase loads that directory globally in @BeforeClass, and because ping takes no arguments its mapping matches unconditionally, so a fixture there would intercept every ping call in the whole suite. The JSON dispatch path is covered directly via Mapping.create() instead. stack.version is bumped to 5.2.0 because the new method cannot compile against 5.1.x. The artifact version deliberately stays on 5.1.9-SNAPSHOT; the release version bump belongs to the release commit. --- pom.xml | 2 +- .../com/noenv/wiremongo/WireMongoClient.java | 6 ++ .../noenv/wiremongo/WireMongoCommands.java | 4 ++ .../noenv/wiremongo/command/PingCommand.java | 7 ++ .../com/noenv/wiremongo/mapping/Mapping.java | 2 + .../com/noenv/wiremongo/mapping/Ping.java | 25 +++++++ .../com/noenv/wiremongo/mapping/PingTest.java | 65 +++++++++++++++++++ 7 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/noenv/wiremongo/command/PingCommand.java create mode 100644 src/main/java/com/noenv/wiremongo/mapping/Ping.java create mode 100644 src/test/java/com/noenv/wiremongo/mapping/PingTest.java 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()); + } +}