package com.mosquito.project.service; import com.mosquito.project.config.PosterConfig; import com.mosquito.project.persistence.entity.ShortLinkEntity; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.util.HashMap; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; class PosterRenderServiceTest { @BeforeAll static void enableHeadlessMode() { System.setProperty("java.awt.headless", "true"); } @Test void renderPosterHtml_includesElementsAndShortUrl() { ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); ShortLinkEntity shortLink = new ShortLinkEntity(); shortLink.setCode("short123"); when(shortLinkService.create(anyString())).thenReturn(shortLink); PosterConfig posterConfig = buildPosterConfig(buildHtmlElements()); PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); String html = service.renderPosterHtml(10L, 20L, "custom"); assertTrue(html.contains("/r/short123")); assertTrue(html.contains("data=%2Fr%2Fshort123")); assertTrue(html.contains("Hello 10")); assertTrue(html.contains("https://example.com/image.png")); assertTrue(html.contains("立即加入")); } @Test void renderPoster_generatesPngBytes() { ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); PosterConfig posterConfig = buildPosterConfig(buildImageElements()); PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); byte[] bytes = service.renderPoster(11L, 22L, "custom"); assertTrue(bytes.length > 0); } private PosterConfig buildPosterConfig(Map elements) { PosterConfig posterConfig = new PosterConfig(); posterConfig.setDefaultTemplate("default"); PosterConfig.PosterTemplate template = new PosterConfig.PosterTemplate(); template.setWidth(300); template.setHeight(400); template.setBackgroundColor("#ffffff"); template.setElements(elements); Map templates = new HashMap<>(); templates.put("default", template); templates.put("custom", template); posterConfig.setTemplates(templates); return posterConfig; } private Map buildHtmlElements() { Map elements = new HashMap<>(); elements.put("text", element("text", 10, 10, 200, 30, "Hello {{activityId}}")); elements.put("qrcode", element("qrcode", 10, 50, 120, 120, "{{shortUrl}}")); elements.put("image", element("image", 10, 200, 80, 80, "https://example.com/image.png")); elements.put("button", element("button", 10, 300, 120, 40, "立即加入")); return elements; } private Map buildImageElements() { Map elements = new HashMap<>(); elements.put("text", element("text", 10, 10, 200, 30, "Poster {{activityId}}")); elements.put("qrcode", element("qrcode", 10, 60, 120, 120, "{{shortUrl}}")); elements.put("rect", element("rect", 10, 200, 80, 40, "")); return elements; } private PosterConfig.PosterElement element(String type, int x, int y, int width, int height, String content) { PosterConfig.PosterElement element = new PosterConfig.PosterElement(); element.setType(type); element.setX(x); element.setY(y); element.setWidth(width); element.setHeight(height); element.setContent(content); element.setColor("#000000"); element.setFontSize("16px"); element.setFontFamily("Arial"); element.setTextAlign("left"); return element; } @Test void renderPosterHtml_shouldUseDefaultTemplate_whenTemplateNotFound() { ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); ShortLinkEntity shortLink = new ShortLinkEntity(); shortLink.setCode("default123"); when(shortLinkService.create(anyString())).thenReturn(shortLink); PosterConfig posterConfig = buildPosterConfig(buildHtmlElements()); PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); String html = service.renderPosterHtml(10L, 20L, "nonexistent"); assertTrue(html.contains("/r/default123")); } @Test void renderPoster_shouldUseDefaultTemplate_whenTemplateNotFound() { ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); PosterConfig posterConfig = buildPosterConfig(buildImageElements()); PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); byte[] bytes = service.renderPoster(11L, 22L, "nonexistent"); assertTrue(bytes.length > 0); } @Test void renderPosterHtml_shouldHandleButtonWithBackground() { ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); ShortLinkEntity shortLink = new ShortLinkEntity(); shortLink.setCode("btn123"); when(shortLinkService.create(anyString())).thenReturn(shortLink); Map elements = new HashMap<>(); PosterConfig.PosterElement button = element("button", 10, 10, 120, 40, "Click"); button.setBackground("#ff0000"); button.setBorderRadius("5px"); elements.put("button", button); PosterConfig posterConfig = buildPosterConfig(elements); PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); String html = service.renderPosterHtml(1L, 2L, "custom"); assertTrue(html.contains("background: #ff0000")); assertTrue(html.contains("border-radius: 5px")); } @Test void renderPosterHtml_shouldHandleNullContent() { ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); ShortLinkEntity shortLink = new ShortLinkEntity(); shortLink.setCode("null123"); when(shortLinkService.create(anyString())).thenReturn(shortLink); Map elements = new HashMap<>(); PosterConfig.PosterElement text = element("text", 10, 10, 200, 30, null); elements.put("text", text); PosterConfig posterConfig = buildPosterConfig(elements); PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); String html = service.renderPosterHtml(1L, 2L, "custom"); assertTrue(html.contains("")); } @Test void renderPoster_shouldHandleRectElement() { ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); Map elements = new HashMap<>(); PosterConfig.PosterElement rect = element("rect", 10, 10, 100, 50, ""); rect.setBackground("#00ff00"); elements.put("rect", rect); PosterConfig posterConfig = buildPosterConfig(elements); PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); byte[] bytes = service.renderPoster(1L, 2L, "custom"); assertTrue(bytes.length > 0); } @Test void renderPoster_shouldHandleRectWithNullBackground() { ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); Map elements = new HashMap<>(); PosterConfig.PosterElement rect = element("rect", 10, 10, 100, 50, ""); rect.setBackground(null); elements.put("rect", rect); PosterConfig posterConfig = buildPosterConfig(elements); PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); byte[] bytes = service.renderPoster(1L, 2L, "custom"); assertTrue(bytes.length > 0); } }