|
1 | | -import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; |
| 1 | +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; |
2 | 2 | import type { SlackMonitorContext } from "./context.js"; |
3 | 3 | |
4 | 4 | const readChannelIngressStoreAllowFromForDmPolicyMock = vi.hoisted(() => vi.fn()); |
| 5 | +let authorizeSlackBotRoomMessage: typeof import("./auth.js").authorizeSlackBotRoomMessage; |
5 | 6 | let authorizeSlackSystemEventSender: typeof import("./auth.js").authorizeSlackSystemEventSender; |
6 | 7 | let clearSlackAllowFromCacheForTest: typeof import("./auth.js").clearSlackAllowFromCacheForTest; |
7 | 8 | let resolveSlackEffectiveAllowFrom: typeof import("./auth.js").resolveSlackEffectiveAllowFrom; |
@@ -109,12 +110,54 @@ describe("resolveSlackEffectiveAllowFrom", () => {
|
109 | 110 | |
110 | 111 | describe("authorizeSlackSystemEventSender", () => { |
111 | 112 | beforeAll(async () => { |
112 | | -({ authorizeSlackSystemEventSender, clearSlackAllowFromCacheForTest } = |
113 | | -await import("./auth.js")); |
| 113 | +({ |
| 114 | + authorizeSlackBotRoomMessage, |
| 115 | + authorizeSlackSystemEventSender, |
| 116 | + clearSlackAllowFromCacheForTest, |
| 117 | +} = await import("./auth.js")); |
114 | 118 | }); |
115 | 119 | |
116 | 120 | beforeEach(() => { |
117 | 121 | clearSlackAllowFromCacheForTest(); |
| 122 | +delete process.env.OPENCLAW_SLACK_CHANNEL_MEMBERS_CACHE_TTL_MS; |
| 123 | +}); |
| 124 | + |
| 125 | +afterEach(() => { |
| 126 | +delete process.env.OPENCLAW_SLACK_CHANNEL_MEMBERS_CACHE_TTL_MS; |
| 127 | +}); |
| 128 | + |
| 129 | +it("ignores non-decimal channel member cache ttl env values", async () => { |
| 130 | +process.env.OPENCLAW_SLACK_CHANNEL_MEMBERS_CACHE_TTL_MS = "0x0"; |
| 131 | +const conversationsMembers = vi.fn(async () => ({ |
| 132 | +members: ["UOWNER"], |
| 133 | +response_metadata: {}, |
| 134 | +})); |
| 135 | +const ctx = { |
| 136 | +allowFrom: [], |
| 137 | +accountId: "main", |
| 138 | +allowNameMatching: false, |
| 139 | +app: { client: { conversations: { members: conversationsMembers } } }, |
| 140 | +botToken: "xoxb-test", |
| 141 | +} as unknown as SlackMonitorContext; |
| 142 | + |
| 143 | +await expect( |
| 144 | +authorizeSlackBotRoomMessage({ |
| 145 | + ctx, |
| 146 | +channelId: "C1", |
| 147 | +senderId: "U_BOT", |
| 148 | +allowFromLower: ["uowner"], |
| 149 | +}), |
| 150 | +).resolves.toBe(true); |
| 151 | +await expect( |
| 152 | +authorizeSlackBotRoomMessage({ |
| 153 | + ctx, |
| 154 | +channelId: "C1", |
| 155 | +senderId: "U_BOT", |
| 156 | +allowFromLower: ["uowner"], |
| 157 | +}), |
| 158 | +).resolves.toBe(true); |
| 159 | + |
| 160 | +expect(conversationsMembers).toHaveBeenCalledTimes(1); |
118 | 161 | }); |
119 | 162 | |
120 | 163 | it("keeps non-interactive channel senders open when only global allowFrom is configured", async () => { |
|