| import fs from "node:fs"; |
| import os from "node:os"; |
| import path from "node:path"; |
| import { beforeEach, describe, expect, it } from "vitest"; |
| import { buildMSTeamsPollCard, createMSTeamsPollStoreFs, extractMSTeamsPollVote } from "./polls.js"; |
| import { setMSTeamsRuntime } from "./runtime.js"; |
| import { msteamsRuntimeStub } from "./test-runtime.js"; |
|
|
| describe("msteams polls", () => { |
| beforeEach(() => { |
| setMSTeamsRuntime(msteamsRuntimeStub); |
| }); |
|
|
| it("builds poll cards with fallback text", () => { |
| const card = buildMSTeamsPollCard({ |
| question: "Lunch?", |
| options: ["Pizza", "Sushi"], |
| }); |
|
|
| expect(card.pollId).toBeTruthy(); |
| expect(card.fallbackText).toContain("Poll: Lunch?"); |
| expect(card.fallbackText).toContain("1. Pizza"); |
| expect(card.fallbackText).toContain("2. Sushi"); |
| }); |
|
|
| it("extracts poll votes from activity values", () => { |
| const vote = extractMSTeamsPollVote({ |
| value: { |
| openclawPollId: "poll-1", |
| choices: "0,1", |
| }, |
| }); |
|
|
| expect(vote).toEqual({ |
| pollId: "poll-1", |
| selections: ["0", "1"], |
| }); |
| }); |
|
|
| it("stores and records poll votes", async () => { |
| const home = await fs.promises.mkdtemp(path.join(os.tmpdir(), "openclaw-msteams-polls-")); |
| const store = createMSTeamsPollStoreFs({ homedir: () => home }); |
| await store.createPoll({ |
| id: "poll-2", |
| question: "Pick one", |
| options: ["A", "B"], |
| maxSelections: 1, |
| createdAt: new Date().toISOString(), |
| votes: {}, |
| }); |
| await store.recordVote({ |
| pollId: "poll-2", |
| voterId: "user-1", |
| selections: ["0", "1"], |
| }); |
| const stored = await store.getPoll("poll-2"); |
| expect(stored?.votes["user-1"]).toEqual(["0"]); |
| }); |
| }); |
|
|