From 6cff7e3d31b9fe7bf1dc61ff225811124d30e06d Mon Sep 17 00:00:00 2001 From: Edwin Hoogerbeets Date: Mon, 24 Aug 2026 13:27:39 -0700 Subject: [PATCH] Add FLUENT to restclient IntegrityCheckerType so it matches the server enum. Jackson deserializes checkers by name, so repo-view/update failed when a repository used a Fluent checker. Tests assert every client name round-trips and that the two enums have the same name set. Co-authored-by: Cursor --- .../rest/entity/IntegrityCheckerType.java | 1 + .../rest/entity/IntegrityCheckerTypeTest.java | 35 +++++++++++++++++++ .../IntegrityCheckerTypeTest.java | 34 ++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 restclient/src/test/java/com/box/l10n/mojito/rest/entity/IntegrityCheckerTypeTest.java create mode 100644 webapp/src/test/java/com/box/l10n/mojito/service/assetintegritychecker/integritychecker/IntegrityCheckerTypeTest.java diff --git a/restclient/src/main/java/com/box/l10n/mojito/rest/entity/IntegrityCheckerType.java b/restclient/src/main/java/com/box/l10n/mojito/rest/entity/IntegrityCheckerType.java index 345a0862e4..2b674d78cf 100644 --- a/restclient/src/main/java/com/box/l10n/mojito/rest/entity/IntegrityCheckerType.java +++ b/restclient/src/main/java/com/box/l10n/mojito/rest/entity/IntegrityCheckerType.java @@ -7,6 +7,7 @@ */ public enum IntegrityCheckerType { MESSAGE_FORMAT, + FLUENT, MESSAGE_FORMAT_DOUBLE_BRACES, PRINTF_LIKE, PRINTF_LIKE_IGNORE_PERCENTAGE_AFTER_BRACKETS, diff --git a/restclient/src/test/java/com/box/l10n/mojito/rest/entity/IntegrityCheckerTypeTest.java b/restclient/src/test/java/com/box/l10n/mojito/rest/entity/IntegrityCheckerTypeTest.java new file mode 100644 index 0000000000..65e91110af --- /dev/null +++ b/restclient/src/test/java/com/box/l10n/mojito/rest/entity/IntegrityCheckerTypeTest.java @@ -0,0 +1,35 @@ +package com.box.l10n.mojito.rest.entity; + +import static org.junit.Assert.assertEquals; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; + +/** + * The restclient enum is deserialized from server JSON by name. A missing constant (historically + * {@code FLUENT}) makes {@code repo-view} / {@code repo-update} fail for that checker. + */ +public class IntegrityCheckerTypeTest { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Test + public void everyTypeDeserializesFromItsJsonName() throws Exception { + for (IntegrityCheckerType type : IntegrityCheckerType.values()) { + IntegrityCheckerType parsed = + objectMapper.readValue("\"" + type.name() + "\"", IntegrityCheckerType.class); + assertEquals(type.name(), type, parsed); + } + } + + @Test + public void everyTypeDeserializesInACheckerPayload() throws Exception { + for (IntegrityCheckerType type : IntegrityCheckerType.values()) { + String json = + "{\"assetExtension\":\"ftl\",\"integrityCheckerType\":\"" + type.name() + "\"}"; + IntegrityChecker checker = objectMapper.readValue(json, IntegrityChecker.class); + assertEquals(type.name(), "ftl", checker.getAssetExtension()); + assertEquals(type.name(), type, checker.getIntegrityCheckerType()); + } + } +} diff --git a/webapp/src/test/java/com/box/l10n/mojito/service/assetintegritychecker/integritychecker/IntegrityCheckerTypeTest.java b/webapp/src/test/java/com/box/l10n/mojito/service/assetintegritychecker/integritychecker/IntegrityCheckerTypeTest.java new file mode 100644 index 0000000000..23a63c43e4 --- /dev/null +++ b/webapp/src/test/java/com/box/l10n/mojito/service/assetintegritychecker/integritychecker/IntegrityCheckerTypeTest.java @@ -0,0 +1,34 @@ +package com.box.l10n.mojito.service.assetintegritychecker.integritychecker; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; +import org.junit.jupiter.api.Test; + +/** + * Restclient {@code IntegrityCheckerType} is a name-only mirror of this server enum. Jackson + * deserializes by name, not ordinal — ordinals already diverge ({@code SIMPLE_PRINTF_LIKE}). + */ +public class IntegrityCheckerTypeTest { + + @Test + public void restclientEnumHasTheSameNameSetAsTheServer() { + Set serverNames = + Arrays.stream(IntegrityCheckerType.values()).map(Enum::name).collect(Collectors.toSet()); + Set restclientNames = + Arrays.stream(com.box.l10n.mojito.rest.entity.IntegrityCheckerType.values()) + .map(Enum::name) + .collect(Collectors.toSet()); + + Set onlyOnServer = new TreeSet<>(serverNames); + onlyOnServer.removeAll(restclientNames); + Set onlyOnRestclient = new TreeSet<>(restclientNames); + onlyOnRestclient.removeAll(serverNames); + + assertEquals(Set.of(), onlyOnServer, "on server but missing from restclient"); + assertEquals(Set.of(), onlyOnRestclient, "on restclient but missing from server"); + } +}