googlechat: add tests for space type detection
This commit is contained in:
parent
145019d6f8
commit
2bf88742fe
@ -1,6 +1,6 @@
|
|||||||
import { describe, expect, it } from "vitest";
|
import { describe, expect, it } from "vitest";
|
||||||
|
|
||||||
import { isSenderAllowed } from "./monitor.js";
|
import { isSenderAllowed, resolveSpaceType } from "./monitor.js";
|
||||||
|
|
||||||
describe("isSenderAllowed", () => {
|
describe("isSenderAllowed", () => {
|
||||||
it("matches allowlist entries with users/<email>", () => {
|
it("matches allowlist entries with users/<email>", () => {
|
||||||
@ -25,3 +25,85 @@ describe("isSenderAllowed", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("resolveSpaceType", () => {
|
||||||
|
describe("modern spaceType field", () => {
|
||||||
|
it("detects DIRECT_MESSAGE as DM", () => {
|
||||||
|
const result = resolveSpaceType({ spaceType: "DIRECT_MESSAGE" });
|
||||||
|
expect(result.spaceType).toBe("DIRECT_MESSAGE");
|
||||||
|
expect(result.isGroup).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("detects SPACE as group", () => {
|
||||||
|
const result = resolveSpaceType({ spaceType: "SPACE" });
|
||||||
|
expect(result.spaceType).toBe("SPACE");
|
||||||
|
expect(result.isGroup).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("detects GROUP_CHAT as group", () => {
|
||||||
|
const result = resolveSpaceType({ spaceType: "GROUP_CHAT" });
|
||||||
|
expect(result.spaceType).toBe("GROUP_CHAT");
|
||||||
|
expect(result.isGroup).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("handles lowercase spaceType", () => {
|
||||||
|
const result = resolveSpaceType({ spaceType: "direct_message" });
|
||||||
|
expect(result.spaceType).toBe("DIRECT_MESSAGE");
|
||||||
|
expect(result.isGroup).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("deprecated type field fallback", () => {
|
||||||
|
it("maps legacy DM to DIRECT_MESSAGE", () => {
|
||||||
|
const result = resolveSpaceType({ type: "DM" });
|
||||||
|
expect(result.spaceType).toBe("DIRECT_MESSAGE");
|
||||||
|
expect(result.isGroup).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("maps legacy ROOM to SPACE", () => {
|
||||||
|
const result = resolveSpaceType({ type: "ROOM" });
|
||||||
|
expect(result.spaceType).toBe("SPACE");
|
||||||
|
expect(result.isGroup).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("handles lowercase legacy type", () => {
|
||||||
|
const result = resolveSpaceType({ type: "dm" });
|
||||||
|
expect(result.spaceType).toBe("DIRECT_MESSAGE");
|
||||||
|
expect(result.isGroup).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("field priority", () => {
|
||||||
|
it("prefers modern spaceType over deprecated type", () => {
|
||||||
|
const result = resolveSpaceType({ spaceType: "SPACE", type: "DM" });
|
||||||
|
expect(result.spaceType).toBe("SPACE");
|
||||||
|
expect(result.isGroup).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("falls back to type only when spaceType is missing", () => {
|
||||||
|
const result = resolveSpaceType({ type: "DM" });
|
||||||
|
expect(result.spaceType).toBe("DIRECT_MESSAGE");
|
||||||
|
expect(result.isGroup).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("falls back to type when spaceType is empty string", () => {
|
||||||
|
const result = resolveSpaceType({ spaceType: "", type: "DM" });
|
||||||
|
expect(result.spaceType).toBe("DIRECT_MESSAGE");
|
||||||
|
expect(result.isGroup).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("edge cases", () => {
|
||||||
|
it("treats empty space as group", () => {
|
||||||
|
const result = resolveSpaceType({});
|
||||||
|
expect(result.spaceType).toBe("");
|
||||||
|
expect(result.isGroup).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("treats unknown spaceType as group", () => {
|
||||||
|
const result = resolveSpaceType({ spaceType: "UNKNOWN_TYPE" });
|
||||||
|
expect(result.spaceType).toBe("UNKNOWN_TYPE");
|
||||||
|
expect(result.isGroup).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@ -297,6 +297,27 @@ function normalizeUserId(raw?: string | null): string {
|
|||||||
return trimmed.replace(/^users\//i, "").toLowerCase();
|
return trimmed.replace(/^users\//i, "").toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves the space type from Google Chat space object.
|
||||||
|
* Normalizes to modern 'spaceType' format with fallback for deprecated 'type' field.
|
||||||
|
*/
|
||||||
|
export function resolveSpaceType(space: { type?: string; spaceType?: string }): {
|
||||||
|
spaceType: string;
|
||||||
|
isGroup: boolean;
|
||||||
|
} {
|
||||||
|
// Normalize to modern 'spaceType' format
|
||||||
|
let spaceType = (space.spaceType ?? "").toUpperCase();
|
||||||
|
|
||||||
|
// @deprecated fallback: map legacy 'type' to modern values
|
||||||
|
if (!spaceType && space.type) {
|
||||||
|
const legacyType = space.type.toUpperCase();
|
||||||
|
spaceType = legacyType === "DM" ? "DIRECT_MESSAGE" : "SPACE";
|
||||||
|
}
|
||||||
|
|
||||||
|
const isGroup = spaceType !== "DIRECT_MESSAGE";
|
||||||
|
return { spaceType, isGroup };
|
||||||
|
}
|
||||||
|
|
||||||
export function isSenderAllowed(
|
export function isSenderAllowed(
|
||||||
senderId: string,
|
senderId: string,
|
||||||
senderEmail: string | undefined,
|
senderEmail: string | undefined,
|
||||||
@ -388,16 +409,7 @@ async function processMessageWithPipeline(params: {
|
|||||||
const spaceId = space.name ?? "";
|
const spaceId = space.name ?? "";
|
||||||
if (!spaceId) return;
|
if (!spaceId) return;
|
||||||
|
|
||||||
// Normalize to modern 'spaceType' format
|
const { isGroup } = resolveSpaceType(space);
|
||||||
let spaceType = (space.spaceType ?? "").toUpperCase();
|
|
||||||
|
|
||||||
// @deprecated fallback: map legacy 'type' to modern values
|
|
||||||
if (!spaceType && space.type) {
|
|
||||||
const legacyType = space.type.toUpperCase();
|
|
||||||
spaceType = legacyType === "DM" ? "DIRECT_MESSAGE" : "SPACE";
|
|
||||||
}
|
|
||||||
|
|
||||||
const isGroup = spaceType !== "DIRECT_MESSAGE";
|
|
||||||
const sender = message.sender ?? event.user;
|
const sender = message.sender ?? event.user;
|
||||||
const senderId = sender?.name ?? "";
|
const senderId = sender?.name ?? "";
|
||||||
const senderName = sender?.displayName ?? "";
|
const senderName = sender?.displayName ?? "";
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user