package cn.iocoder.yudao.module.im.util; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.im.dal.dataobject.message.content.QuoteMessage; import org.junit.jupiter.api.Test; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; /** * {@link ImMessageUtils} 的单元测试 * * @author 芋道源码 */ public class ImMessageUtilsTest { // ========== parseQuoteMessageId ========== @Test public void testParseQuoteMessageId_valid() { // 准备:content 含合法 quote 字段 String content = "{\"text\":\"你好\",\"quote\":{\"messageId\":1001,\"senderId\":2,\"type\":1}}"; // 调用 + 断言 assertEquals(1001L, ImMessageUtils.parseQuoteMessageId(content)); } @Test public void testParseQuoteMessageId_invalidJson() { // 准备:content 非合法 JSON // 调用 + 断言:解析失败返回 null assertNull(ImMessageUtils.parseQuoteMessageId("not a json")); } @Test public void testParseQuoteMessageId_noQuoteField() { // 准备:content 无 quote 字段 String content = "{\"text\":\"你好\"}"; // 调用 + 断言 assertNull(ImMessageUtils.parseQuoteMessageId(content)); } @Test public void testParseQuoteMessageId_quoteIsNotMap() { // 准备:quote 字段不是对象 String content = "{\"text\":\"你好\",\"quote\":\"oops\"}"; // 调用 + 断言 assertNull(ImMessageUtils.parseQuoteMessageId(content)); } @Test public void testParseQuoteMessageId_messageIdMissing() { // 准备:quote 对象内无 messageId String content = "{\"quote\":{\"senderId\":2}}"; // 调用 + 断言 assertNull(ImMessageUtils.parseQuoteMessageId(content)); } // ========== appendQuote ========== @Test public void testAppendQuote_existingContent() { // 准备:已有 text 字段的 content String content = "{\"text\":\"你好\"}"; QuoteMessage quote = new QuoteMessage().setMessageId(1001L).setSenderId(2L).setType(1).setContent("{}"); // 调用 String result = ImMessageUtils.appendQuote(content, quote); // 断言:保留原字段,注入 quote Map map = JsonUtils.parseMap(result); assertEquals("你好", map.get("text")); assertTrue(map.get("quote") instanceof Map); assertEquals(1001, ((Map) map.get("quote")).get("messageId")); } @Test public void testAppendQuote_blankContent() { // 准备:content 为空字符串,无法解析为 map QuoteMessage quote = new QuoteMessage().setMessageId(1001L); // 调用 String result = ImMessageUtils.appendQuote("", quote); // 断言:内部新建 map,仅含 quote Map map = JsonUtils.parseMap(result); assertEquals(1, map.size()); assertTrue(map.containsKey("quote")); } @Test public void testAppendQuote_overwriteExistingQuote() { // 准备:content 已经有一个旧 quote,期望被新 quote 覆盖 String content = "{\"text\":\"hi\",\"quote\":{\"messageId\":1}}"; QuoteMessage quote = new QuoteMessage().setMessageId(9999L).setSenderId(2L).setType(1); // 调用 String result = ImMessageUtils.appendQuote(content, quote); // 断言:quote.messageId 被覆盖为新值 Map map = JsonUtils.parseMap(result); assertEquals(9999, ((Map) map.get("quote")).get("messageId")); } // ========== removeQuote ========== @Test public void testRemoveQuote_blankContent() { // 调用 + 断言:空内容原样返回 assertEquals("", ImMessageUtils.removeQuote("")); assertNull(ImMessageUtils.removeQuote(null)); } @Test public void testRemoveQuote_noQuoteField() { // 准备:content 字符串里没有 quote 关键字,提前返回原值 String content = "{\"text\":\"你好\"}"; // 调用 + 断言:同一引用直接返回 assertEquals(content, ImMessageUtils.removeQuote(content)); } @Test public void testRemoveQuote_withQuote() { // 准备:含 quote 的 content String content = "{\"text\":\"你好\",\"quote\":{\"messageId\":1}}"; // 调用 String result = ImMessageUtils.removeQuote(content); // 断言:quote 被移除,保留其它字段 Map map = JsonUtils.parseMap(result); assertFalse(map.containsKey("quote")); assertEquals("你好", map.get("text")); } @Test public void testRemoveQuote_invalidJsonContainingQuoteToken() { // 准备:字符串包含 quote 字面量但解析失败 String content = "not-a-json-but-has-\"quote\"-token"; // 调用 + 断言:解析失败返回原值 assertEquals(content, ImMessageUtils.removeQuote(content)); } // ========== buildQuote ========== @Test public void testBuildQuote_stripsNestedQuote() { // 准备:被引用消息本身也含有 quote 字段;防止嵌套 String originalContent = "{\"text\":\"被引用\",\"quote\":{\"messageId\":777}}"; // 调用 QuoteMessage quote = ImMessageUtils.buildQuote(1001L, 2L, 1, originalContent); // 断言:基础字段透传,content 已被剥离 quote assertEquals(1001L, quote.getMessageId()); assertEquals(2L, quote.getSenderId()); assertEquals(1, quote.getType()); Map contentMap = JsonUtils.parseMap(quote.getContent()); assertFalse(contentMap.containsKey("quote")); assertEquals("被引用", contentMap.get("text")); } @Test public void testBuildQuote_originalWithoutQuote() { // 准备:被引用消息原本就没 quote 字段 String originalContent = "{\"text\":\"hi\"}"; // 调用 QuoteMessage quote = ImMessageUtils.buildQuote(1001L, 2L, 1, originalContent); // 断言:content 原样保留 assertEquals(originalContent, quote.getContent()); } }