Update Prisma and harden tests

This commit is contained in:
Esdras Renan 2025-11-08 00:28:52 -03:00
parent a2f9d4bd1a
commit d8eb38fe52
17 changed files with 171 additions and 119 deletions

View file

@ -185,7 +185,7 @@ describe("convex.machines.listTicketsHistory", () => {
})
expect(result.page).toHaveLength(1)
expect(result.page[0].id).toBe("ticket_match")
expect(result.page[0].id).toBe("ticket_match" as Id<"tickets">)
expect(result.isDone).toBe(true)
})
})

View file

@ -177,7 +177,7 @@ describe("convex.reports.backlogOverview", () => {
})
expect(result.rangeDays).toBe(7)
expect(result.statusCounts).toEqual({
expect(result.statusCounts).toMatchObject({
PENDING: 1,
PAUSED: 1,
RESOLVED: 1,

View file

@ -173,7 +173,7 @@ describe("convex.reports.csatOverview", () => {
expect(result.averageScore).toBe(4)
expect(result.distribution.find((entry) => entry.score === 5)?.total).toBe(1)
expect(result.distribution.find((entry) => entry.score === 3)?.total).toBe(1)
expect(result.recent[0]?.ticketId).toBe("ticket_a")
expect(result.recent[0]?.ticketId).toBe("ticket_a" as Id<"tickets">)
})
})

View file

@ -10,14 +10,14 @@ process.env.BETTER_AUTH_URL ??= process.env.NEXT_PUBLIC_APP_URL
const OriginalDate = Date
let fixedTimestamp: number | null = null
type MutableVi = typeof vi & {
mocked?: <T>(item: T) => T
setSystemTime?: (value: number | Date) => void
useFakeTimers?: (...args: Array<unknown>) => void
useRealTimers?: (...args: Array<unknown>) => void
type ExtendedVi = typeof vi & {
mocked?: typeof vi.mocked
setSystemTime?: typeof vi.setSystemTime
useFakeTimers?: typeof vi.useFakeTimers
useRealTimers?: typeof vi.useRealTimers
}
const viExtended = vi as MutableVi
const viExtended = vi as ExtendedVi
if (typeof window === "undefined" || typeof document === "undefined") {
const dom = new JSDOM("<!DOCTYPE html><html><body></body></html>", {
@ -57,40 +57,48 @@ const applyFixedDate = () => {
}
if (!viExtended.mocked) {
viExtended.mocked = <T>(item: T) => item
viExtended.mocked = ((item: unknown) => item) as typeof vi.mocked
}
if (!viExtended.setSystemTime) {
viExtended.setSystemTime = (value: number | Date) => {
fixedTimestamp = typeof value === "number" ? value : value.getTime()
viExtended.setSystemTime = ((value: string | number | Date) => {
if (typeof value === "string") {
const parsed = Date.parse(value)
fixedTimestamp = Number.isFinite(parsed) ? parsed : Date.now()
} else {
fixedTimestamp = value instanceof Date ? value.getTime() : value
}
applyFixedDate()
}
return viExtended
}) as typeof vi.setSystemTime
}
if (!viExtended.useFakeTimers) {
viExtended.useFakeTimers = () => {
// Bun's fake timers are not required for our current tests. This is a noop
// placeholder to keep compatibility with the previous Vitest API.
}
viExtended.useFakeTimers = ((..._args: Parameters<typeof vi.useFakeTimers>) => {
return viExtended
}) as typeof vi.useFakeTimers
} else {
const originalUseFakeTimers = viExtended.useFakeTimers.bind(vi)
viExtended.useFakeTimers = (...args: Array<unknown>) => {
originalUseFakeTimers(...args)
}
viExtended.useFakeTimers = ((...args: Parameters<typeof vi.useFakeTimers>) => {
const result = originalUseFakeTimers(...args)
return result ?? viExtended
}) as typeof vi.useFakeTimers
}
if (!viExtended.useRealTimers) {
viExtended.useRealTimers = () => {
viExtended.useRealTimers = ((..._args: Parameters<typeof vi.useRealTimers>) => {
fixedTimestamp = null
applyFixedDate()
}
return viExtended
}) as typeof vi.useRealTimers
} else {
const originalUseRealTimers = viExtended.useRealTimers.bind(vi)
viExtended.useRealTimers = (...args: Array<unknown>) => {
originalUseRealTimers(...args)
viExtended.useRealTimers = ((...args: Parameters<typeof vi.useRealTimers>) => {
const result = originalUseRealTimers(...args)
fixedTimestamp = null
applyFixedDate()
}
return result ?? viExtended
}) as typeof vi.useRealTimers
}
applyFixedDate()

View file

@ -1,10 +1,10 @@
import { describe, expect, it, vi } from "bun:test"
import { buildCommentAuthorSummary } from "../convex/tickets"
import type { Doc, Id } from "../convex/_generated/dataModel"
import type { Doc, Id, TableNames } from "../convex/_generated/dataModel"
function makeId<TableName extends string>(value: string) {
return value as unknown as Id<TableName>
function makeId<TableName extends TableNames>(value: string) {
return value as Id<TableName>
}
function makeComment(overrides: Partial<Doc<"ticketComments">> = {}) {

View file

@ -2,6 +2,7 @@ import { describe, expect, it } from "bun:test"
import { normalizeCustomFieldInputs } from "../src/lib/ticket-form-helpers"
import type { TicketFormFieldDefinition } from "../src/lib/ticket-form-types"
import type { Id } from "../convex/_generated/dataModel"
describe("ticket form helpers", () => {
const baseFields: TicketFormFieldDefinition[] = [
@ -56,9 +57,9 @@ describe("ticket form helpers", () => {
expect(result.ok).toBe(true)
if (result.ok) {
expect(result.payload).toEqual([
{ fieldId: "field-nome", value: "Ana Silva" },
{ fieldId: "field-numero", value: 123 },
{ fieldId: "field-select", value: "nova" },
{ fieldId: "field-nome" as Id<"ticketFields">, value: "Ana Silva" },
{ fieldId: "field-numero" as Id<"ticketFields">, value: 123 },
{ fieldId: "field-select" as Id<"ticketFields">, value: "nova" },
])
}
})

View file

@ -41,29 +41,28 @@ function buildTicket(overrides: Partial<TicketDoc> = {}): MockedTicket {
tenantId: "tenant-1",
reference: 41_000,
subject: "Computador não liga",
summary: null,
summary: undefined,
status: "AWAITING_ATTENDANCE",
priority: "MEDIUM",
channel: "EMAIL",
queueId: null,
queueSnapshot: null,
queueId: undefined,
requesterId: "user_requester" as Id<"users">,
requesterSnapshot: { name: "Cliente", email: "cliente@example.com" },
assigneeId: "user_agent" as Id<"users">,
assigneeSnapshot: { name: "Agente", email: "agente@example.com" },
companyId: null,
companySnapshot: null,
machineId: null,
machineSnapshot: null,
slaPolicyId: null,
dueAt: null,
firstResponseAt: null,
resolvedAt: null,
companyId: undefined,
companySnapshot: undefined,
machineId: undefined,
machineSnapshot: undefined,
slaPolicyId: undefined,
dueAt: undefined,
firstResponseAt: undefined,
resolvedAt: undefined,
createdAt: NOW - 50_000,
updatedAt: NOW - 1_000,
tags: [],
customFields: [],
activeSessionId: null,
activeSessionId: undefined,
totalWorkedMs: 0,
internalWorkedMs: 0,
externalWorkedMs: 0,
@ -74,15 +73,12 @@ function buildTicket(overrides: Partial<TicketDoc> = {}): MockedTicket {
csatRatedBy: undefined,
csatAssigneeId: undefined,
csatAssigneeSnapshot: undefined,
workSummary: undefined,
reopenDeadline: undefined,
reopenedAt: undefined,
formTemplate: undefined,
chatEnabled: true,
relatedTicketIds: undefined,
resolvedWithTicketId: undefined,
reopenWindowDays: undefined,
reopenedBy: undefined,
}
return { ...(base as TicketDoc), ...overrides }
}
@ -149,8 +145,12 @@ describe("convex.tickets.resolveTicketHandler", () => {
mockedRequireStaff.mockResolvedValue({
user: {
_id: "user_agent" as Id<"users">,
_creationTime: NOW - 5_000,
tenantId: "tenant-1",
name: "Agente",
email: "agente@example.com",
role: "ADMIN",
teams: [],
},
role: "ADMIN",
})
@ -214,8 +214,13 @@ describe("convex.tickets.reopenTicketHandler", () => {
mockedRequireUser.mockResolvedValue({
user: {
_id: ticket.requesterId,
_creationTime: NOW - 20_000,
tenantId: "tenant-1",
email: "cliente@example.com",
companyId: null,
name: "Cliente",
role: "COLLABORATOR",
companyId: undefined,
teams: [],
},
role: "COLLABORATOR",
})
@ -247,8 +252,13 @@ describe("convex.tickets.reopenTicketHandler", () => {
mockedRequireUser.mockResolvedValue({
user: {
_id: ticket.requesterId,
_creationTime: NOW - 25_000,
tenantId: "tenant-1",
email: "cliente@example.com",
companyId: null,
name: "Cliente",
role: "COLLABORATOR",
companyId: undefined,
teams: [],
},
role: "COLLABORATOR",
})

View file

@ -23,29 +23,28 @@ function makeTicket(overrides: Partial<Doc<"tickets">> = {}): Doc<"tickets"> {
tenantId: "tenant-1",
reference: 42_100,
subject: "Computador não liga",
summary: null,
summary: undefined,
status: "RESOLVED",
priority: "MEDIUM",
channel: "EMAIL",
queueId: null,
queueSnapshot: null,
queueId: undefined,
requesterId: "user_requester" as Id<"users">,
requesterSnapshot: { name: "Cliente", email: "cliente@example.com" },
assigneeId: null,
assigneeSnapshot: null,
companyId: null,
companySnapshot: null,
machineId: null,
machineSnapshot: null,
slaPolicyId: null,
dueAt: null,
firstResponseAt: null,
assigneeId: undefined,
assigneeSnapshot: undefined,
companyId: undefined,
companySnapshot: undefined,
machineId: undefined,
machineSnapshot: undefined,
slaPolicyId: undefined,
dueAt: undefined,
firstResponseAt: undefined,
resolvedAt: FIXED_NOW - 1000,
createdAt: FIXED_NOW - 20_000,
updatedAt: FIXED_NOW - 100,
tags: [],
customFields: [],
activeSessionId: null,
activeSessionId: undefined,
totalWorkedMs: 0,
internalWorkedMs: 0,
externalWorkedMs: 0,
@ -103,8 +102,13 @@ describe("convex.tickets.submitCsat", () => {
mockedRequireUser.mockResolvedValue({
user: {
_id: "user_requester" as Id<"users">,
_creationTime: FIXED_NOW - 30_000,
tenantId: "tenant-1",
name: "Cliente",
email: "cliente@example.com",
companyId: null,
role: "COLLABORATOR",
companyId: undefined,
teams: [],
},
role: "COLLABORATOR",
})
@ -145,8 +149,13 @@ describe("convex.tickets.submitCsat", () => {
mockedRequireUser.mockResolvedValue({
user: {
_id: "user_requester" as Id<"users">,
_creationTime: FIXED_NOW - 30_000,
tenantId: "tenant-1",
name: "Cliente",
email: "cliente@example.com",
companyId: null,
role: "COLLABORATOR",
companyId: undefined,
teams: [],
},
role: "COLLABORATOR",
})
@ -174,8 +183,13 @@ describe("convex.tickets.submitCsat", () => {
mockedRequireUser.mockResolvedValue({
user: {
_id: "user_requester" as Id<"users">,
_creationTime: FIXED_NOW - 30_000,
tenantId: "tenant-1",
name: "Cliente",
email: "cliente@example.com",
companyId: null,
role: "COLLABORATOR",
companyId: undefined,
teams: [],
},
role: "COLLABORATOR",
})
@ -199,8 +213,13 @@ describe("convex.tickets.submitCsat", () => {
mockedRequireUser.mockResolvedValue({
user: {
_id: "user_admin" as Id<"users">,
_creationTime: FIXED_NOW - 40_000,
tenantId: "tenant-1",
name: "Administrador",
email: "admin@example.com",
companyId: null,
role: "ADMIN",
companyId: undefined,
teams: [],
},
role: "ADMIN",
})