From 6df9a6d2df534fd6a625392e1e0e1c06b7129536 Mon Sep 17 00:00:00 2001 From: Tony Dehnke Date: Tue, 24 Feb 2026 04:13:36 +0000 Subject: [PATCH] test(mattermost): add normalize.ts unit tests Cover normalizeMattermostMessagingTarget and looksLikeMattermostTargetId with 17 tests: prefix handling, #channel directory fallback, bare name fallback, 26-char ID matching, DM channel format, and false-positive rejection for short strings. --- extensions/mattermost/src/normalize.test.ts | 96 +++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 extensions/mattermost/src/normalize.test.ts diff --git a/extensions/mattermost/src/normalize.test.ts b/extensions/mattermost/src/normalize.test.ts new file mode 100644 index 00000000000..11d8acb2f73 --- /dev/null +++ b/extensions/mattermost/src/normalize.test.ts @@ -0,0 +1,96 @@ +import { describe, expect, it } from "vitest"; +import { looksLikeMattermostTargetId, normalizeMattermostMessagingTarget } from "./normalize.js"; + +describe("normalizeMattermostMessagingTarget", () => { + it("returns undefined for empty input", () => { + expect(normalizeMattermostMessagingTarget("")).toBeUndefined(); + expect(normalizeMattermostMessagingTarget(" ")).toBeUndefined(); + }); + + it("normalizes channel: prefix", () => { + expect(normalizeMattermostMessagingTarget("channel:abc123")).toBe("channel:abc123"); + expect(normalizeMattermostMessagingTarget("Channel:ABC")).toBe("channel:ABC"); + }); + + it("normalizes group: prefix to channel:", () => { + expect(normalizeMattermostMessagingTarget("group:abc123")).toBe("channel:abc123"); + }); + + it("normalizes user: prefix", () => { + expect(normalizeMattermostMessagingTarget("user:abc123")).toBe("user:abc123"); + }); + + it("normalizes mattermost: prefix to user:", () => { + expect(normalizeMattermostMessagingTarget("mattermost:abc123")).toBe("user:abc123"); + }); + + it("keeps @username targets", () => { + expect(normalizeMattermostMessagingTarget("@alice")).toBe("@alice"); + expect(normalizeMattermostMessagingTarget("@Alice")).toBe("@Alice"); + }); + + it("returns undefined for #channel (triggers directory lookup)", () => { + expect(normalizeMattermostMessagingTarget("#bookmarks")).toBeUndefined(); + expect(normalizeMattermostMessagingTarget("#off-topic")).toBeUndefined(); + expect(normalizeMattermostMessagingTarget("# ")).toBeUndefined(); + }); + + it("returns undefined for bare names (triggers directory lookup)", () => { + expect(normalizeMattermostMessagingTarget("bookmarks")).toBeUndefined(); + expect(normalizeMattermostMessagingTarget("off-topic")).toBeUndefined(); + }); + + it("returns undefined for empty prefixed values", () => { + expect(normalizeMattermostMessagingTarget("channel:")).toBeUndefined(); + expect(normalizeMattermostMessagingTarget("user:")).toBeUndefined(); + expect(normalizeMattermostMessagingTarget("@")).toBeUndefined(); + expect(normalizeMattermostMessagingTarget("#")).toBeUndefined(); + }); +}); + +describe("looksLikeMattermostTargetId", () => { + it("returns false for empty input", () => { + expect(looksLikeMattermostTargetId("")).toBe(false); + expect(looksLikeMattermostTargetId(" ")).toBe(false); + }); + + it("recognizes prefixed targets", () => { + expect(looksLikeMattermostTargetId("channel:abc")).toBe(true); + expect(looksLikeMattermostTargetId("Channel:abc")).toBe(true); + expect(looksLikeMattermostTargetId("user:abc")).toBe(true); + expect(looksLikeMattermostTargetId("group:abc")).toBe(true); + expect(looksLikeMattermostTargetId("mattermost:abc")).toBe(true); + }); + + it("recognizes @username", () => { + expect(looksLikeMattermostTargetId("@alice")).toBe(true); + }); + + it("does NOT recognize #channel (should go to directory)", () => { + expect(looksLikeMattermostTargetId("#bookmarks")).toBe(false); + expect(looksLikeMattermostTargetId("#off-topic")).toBe(false); + }); + + it("recognizes 26-char alphanumeric Mattermost IDs", () => { + expect(looksLikeMattermostTargetId("abcdefghijklmnopqrstuvwxyz")).toBe(true); + expect(looksLikeMattermostTargetId("12345678901234567890123456")).toBe(true); + expect(looksLikeMattermostTargetId("AbCdEf1234567890abcdef1234")).toBe(true); + }); + + it("recognizes DM channel format (26__26)", () => { + expect( + looksLikeMattermostTargetId("abcdefghijklmnopqrstuvwxyz__12345678901234567890123456"), + ).toBe(true); + }); + + it("rejects short strings that are not Mattermost IDs", () => { + expect(looksLikeMattermostTargetId("password")).toBe(false); + expect(looksLikeMattermostTargetId("hi")).toBe(false); + expect(looksLikeMattermostTargetId("bookmarks")).toBe(false); + expect(looksLikeMattermostTargetId("off-topic")).toBe(false); + }); + + it("rejects strings longer than 26 chars that are not DM format", () => { + expect(looksLikeMattermostTargetId("abcdefghijklmnopqrstuvwxyz1")).toBe(false); + }); +});