diff --git a/tests/account-alias-selection.test.mjs b/tests/account-alias-selection.test.mjs index 144e578..1073d02 100644 --- a/tests/account-alias-selection.test.mjs +++ b/tests/account-alias-selection.test.mjs @@ -48,9 +48,9 @@ async function fixture(t, { rules = [], failAddress, slowAddress } = {}) { t.after(() => database.db.close()); await applyMigrations(database, join(root, "drizzle/migrations")); database.db.exec(` - INSERT INTO users (id, email, password_hash, name, role, created_at) VALUES - ('admin', 'owner@one.test', 'hash', 'Owner', 'admin', 1), - ('other', 'owner@foreign.test', 'hash', 'Other', 'admin', 1); + INSERT INTO users (id, email, password_hash, name, role, is_primary_admin, created_at) VALUES + ('admin', 'owner@one.test', 'hash', 'Owner', 'admin', 1, 1), + ('other', 'owner@foreign.test', 'hash', 'Other', 'admin', 0, 1); INSERT INTO domains (id, user_id, hostname, zone_id, status, created_at) VALUES ('one', 'admin', 'one.test', 'zone-one', 'active', 1), ('two', 'admin', 'two.test', 'zone-two', 'active', 1), diff --git a/tests/agent-email-tools.test.mjs b/tests/agent-email-tools.test.mjs index f9e0296..f91b43d 100644 --- a/tests/agent-email-tools.test.mjs +++ b/tests/agent-email-tools.test.mjs @@ -76,6 +76,7 @@ test("assistant reads mail, creates an editable reply draft, and invokes tools t const env = { DB: database, BUCKET: { get: async () => null, delete: async () => {} }, AI_BASE_URL: `http://127.0.0.1:${address.port}/v1`, AI_API_KEY: "test-key", AI_MODEL: "test-model" }; const context = { env, user: { id: "user-1", email: "owner@example.com", role: "user" }, mailboxId: "mailbox-1", origin: "chat" }; + const direct = { ...context, origin: "mcp" }; const listed = await runEmailTool(context, "list_emails", { folder: "inbox", limit: 20 }); assert.equal(listed.emails[0].id, "email-1"); const email = await runEmailTool(context, "get_email", { emailId: "email-1" }); @@ -94,13 +95,16 @@ test("assistant reads mail, creates an editable reply draft, and invokes tools t assert.equal(database.db.prepare("SELECT count(*) AS count FROM agent_send_approvals").get().count, 0); const newDraft = await runEmailTool(context, "draft_email", { to: "customer@example.net", subject: "Follow up", body: "Hello again." }); assert.equal(database.db.prepare("SELECT status FROM messages WHERE id = ?").get(newDraft.draftId).status, "draft"); - await runEmailTool(context, "discard_draft", { draftId: newDraft.draftId, expectedRevision: 1 }); + const pendingDiscard = await runEmailTool(context, "discard_draft", { draftId: newDraft.draftId, expectedRevision: 1 }); + assert.equal(pendingDiscard.status, "pending_approval"); + assert.ok(database.db.prepare("SELECT id FROM messages WHERE id = ?").get(newDraft.draftId)); + await runEmailTool(direct, "discard_draft", { draftId: newDraft.draftId, expectedRevision: 1 }); assert.equal(database.db.prepare("SELECT id FROM messages WHERE id = ?").get(newDraft.draftId), undefined); - await runEmailTool(context, "mark_email_read", { emailId: "email-1", read: true }); + await runEmailTool(direct, "mark_email_read", { emailId: "email-1", read: true }); assert.equal(database.db.prepare("SELECT read FROM messages WHERE id = 'email-1'").get().read, 1); - await runEmailTool(context, "move_email", { emailId: "email-1", destination: "archived" }); + await runEmailTool(direct, "move_email", { emailId: "email-1", destination: "archived" }); assert.equal(database.db.prepare("SELECT status FROM messages WHERE id = 'email-1'").get().status, "archived"); - await runEmailTool(context, "move_email", { emailId: "email-1", destination: "inbox" }); + await runEmailTool(direct, "move_email", { emailId: "email-1", destination: "inbox" }); const { stream } = await createAgentChatStream(context, "What arrived in my inbox?"); const events = (await new Response(stream).text()).trim().split("\n").map((line) => JSON.parse(line)); diff --git a/tests/i18n.test.mjs b/tests/i18n.test.mjs index 30c17b3..db98194 100644 --- a/tests/i18n.test.mjs +++ b/tests/i18n.test.mjs @@ -120,7 +120,7 @@ test("missing, invalid and unsupported locale values fall back to English", () = }); test("translation uses the requested catalog and falls back per key", async () => { - assert.equal(i18n.translate(await i18n.loadMessages("pt-BR"), "navigation.inbox"), "Caixa de entrada"); + assert.equal(i18n.translate(await i18n.loadMessages("pt-BR"), "navigation.inbox"), "Entrada"); assert.equal(i18n.translate({}, "navigation.inbox"), "Inbox"); }); @@ -132,7 +132,7 @@ test("preference cookie persists for a year, covers every path and is Secure on test("provider server rendering uses initial locale and labels the native language selector", async () => { const pt = await i18n.renderLanguage("pt-BR"); - assert.match(pt, /Caixa de entrada/); + assert.match(pt, /Entrada<\/span>/); assert.match(pt, /