feat: polish inbox and issue list workflows

This commit is contained in:
Dotta 2026-04-10 22:26:21 -05:00
parent 548721248e
commit dab95740be
37 changed files with 1674 additions and 411 deletions

View file

@ -1,6 +1,8 @@
import express from "express";
import request from "supertest";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { errorHandler } from "../middleware/index.js";
import { routineRoutes } from "../routes/routines.js";
const companyId = "22222222-2222-4222-8222-222222222222";
const agentId = "11111111-1111-4111-8111-111111111111";
@ -83,28 +85,22 @@ const mockLogActivity = vi.hoisted(() => vi.fn());
const mockTrackRoutineCreated = vi.hoisted(() => vi.fn());
const mockGetTelemetryClient = vi.hoisted(() => vi.fn());
function registerRouteMocks() {
vi.doMock("@paperclipai/shared/telemetry", () => ({
trackRoutineCreated: mockTrackRoutineCreated,
trackErrorHandlerCrash: vi.fn(),
}));
vi.mock("@paperclipai/shared/telemetry", () => ({
trackRoutineCreated: mockTrackRoutineCreated,
trackErrorHandlerCrash: vi.fn(),
}));
vi.doMock("../telemetry.js", () => ({
getTelemetryClient: mockGetTelemetryClient,
}));
vi.mock("../telemetry.js", () => ({
getTelemetryClient: mockGetTelemetryClient,
}));
vi.doMock("../services/index.js", () => ({
accessService: () => mockAccessService,
logActivity: mockLogActivity,
routineService: () => mockRoutineService,
}));
}
vi.mock("../services/index.js", () => ({
accessService: () => mockAccessService,
logActivity: mockLogActivity,
routineService: () => mockRoutineService,
}));
async function createApp(actor: Record<string, unknown>) {
const [{ routineRoutes }, { errorHandler }] = await Promise.all([
import("../routes/routines.js"),
import("../middleware/index.js"),
]);
function createApp(actor: Record<string, unknown>) {
const app = express();
app.use(express.json());
app.use((req, _res, next) => {
@ -118,9 +114,7 @@ async function createApp(actor: Record<string, unknown>) {
describe("routine routes", () => {
beforeEach(() => {
vi.resetModules();
registerRouteMocks();
vi.clearAllMocks();
vi.resetAllMocks();
mockGetTelemetryClient.mockReturnValue({ track: vi.fn() });
mockRoutineService.create.mockResolvedValue(routine);
mockRoutineService.get.mockResolvedValue(routine);
@ -136,7 +130,7 @@ describe("routine routes", () => {
});
it("requires tasks:assign permission for non-admin board routine creation", async () => {
const app = await createApp({
const app = createApp({
type: "board",
userId: "board-user",
source: "session",
@ -158,7 +152,7 @@ describe("routine routes", () => {
});
it("requires tasks:assign permission to retarget a routine assignee", async () => {
const app = await createApp({
const app = createApp({
type: "board",
userId: "board-user",
source: "session",
@ -179,7 +173,7 @@ describe("routine routes", () => {
it("requires tasks:assign permission to reactivate a routine", async () => {
mockRoutineService.get.mockResolvedValue(pausedRoutine);
const app = await createApp({
const app = createApp({
type: "board",
userId: "board-user",
source: "session",
@ -199,7 +193,7 @@ describe("routine routes", () => {
});
it("requires tasks:assign permission to create a trigger", async () => {
const app = await createApp({
const app = createApp({
type: "board",
userId: "board-user",
source: "session",
@ -221,7 +215,7 @@ describe("routine routes", () => {
});
it("requires tasks:assign permission to update a trigger", async () => {
const app = await createApp({
const app = createApp({
type: "board",
userId: "board-user",
source: "session",
@ -241,7 +235,7 @@ describe("routine routes", () => {
});
it("requires tasks:assign permission to manually run a routine", async () => {
const app = await createApp({
const app = createApp({
type: "board",
userId: "board-user",
source: "session",
@ -260,7 +254,7 @@ describe("routine routes", () => {
it("allows routine creation when the board user has tasks:assign", async () => {
mockAccessService.canUser.mockResolvedValue(true);
const app = await createApp({
const app = createApp({
type: "board",
userId: "board-user",
source: "session",