From 0a683a61f40fa945101fbc9e2197a5faee3b311a Mon Sep 17 00:00:00 2001 From: Marcel Date: Thu, 23 Apr 2026 22:39:14 +0200 Subject: [PATCH] =?UTF-8?q?test(document):=20address=20@saraholt=20?= =?UTF-8?q?=E2=80=94=20lock=20JSON=20wire=20contract=20for=20thumbnailUrl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prior coverage only exercised getThumbnailUrl() as a Java method call. The new case serialises via ObjectMapper and asserts the resulting JSON contains "thumbnailUrl":"..." so we catch silent breakages in the wire contract (getter rename, @JsonIgnore, visibility drop) — not just regressions in the method's return value (#309). Co-Authored-By: Claude Opus 4.7 --- .../familienarchiv/model/DocumentTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/backend/src/test/java/org/raddatz/familienarchiv/model/DocumentTest.java b/backend/src/test/java/org/raddatz/familienarchiv/model/DocumentTest.java index 8b1f9c59..fbf48954 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/model/DocumentTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/model/DocumentTest.java @@ -1,5 +1,7 @@ package org.raddatz.familienarchiv.model; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.junit.jupiter.api.Test; import java.time.LocalDateTime; @@ -58,4 +60,26 @@ class DocumentTest { String expected = "/api/documents/" + id + "/thumbnail?v=2026-04-23T14%3A30%3A45"; assertThat(doc.getThumbnailUrl()).isEqualTo(expected); } + + @Test + void thumbnailUrl_isSerialisedToJson_soFrontendReceivesIt() throws Exception { + UUID id = UUID.fromString("99999999-aaaa-bbbb-cccc-111122223333"); + Document doc = Document.builder() + .id(id) + .title("Brief") + .originalFilename("brief.pdf") + .status(DocumentStatus.UPLOADED) + .thumbnailKey("thumbnails/" + id + ".jpg") + .thumbnailGeneratedAt(LocalDateTime.of(2026, 4, 23, 9, 0, 0)) + .build(); + + ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()); + String json = mapper.writeValueAsString(doc); + + // Locks the wire contract, not just the Java API: every Document JSON must carry + // `thumbnailUrl`. Protects against silent breakage if the getter gets renamed, + // hidden behind @JsonIgnore, or visibility-reduced — any of which would leave the + // frontend rendering the fallback icon on every surface. + assertThat(json).contains("\"thumbnailUrl\":\"" + doc.getThumbnailUrl() + "\""); + } }