Files
product-issue/tests/contracts.test.ts
T
2026-08-24 17:27:41 +08:00

72 lines
2.0 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
productKeySchema,
publicFeedbackPayloadSchema,
publicFeedbackResponseSchema
} from '../src/shared/contracts.js'
const validFeedback = {
schemaVersion: 1 as const,
productKey: 'goodbuddy',
category: 'bug' as const,
title: '平台功能页签不可见',
description: '打开设置中心的平台功能后,无法看到魔法笔记页签。',
contactEmail: 'user@example.com',
environment: {
appVersion: '0.11.0',
platform: 'windows' as const,
architecture: 'x64' as const,
locale: 'zh-CN'
},
installationId: '00000000-0000-4000-8000-000000000001',
clientRequestId: '00000000-0000-4000-8000-000000000002'
}
describe('feedback contracts', () => {
it('accepts a bounded versioned GoodBuddy submission', () => {
expect(publicFeedbackPayloadSchema.parse(validFeedback)).toEqual(
validFeedback
)
})
it('rejects unknown fields and oversized or malformed input', () => {
expect(
publicFeedbackPayloadSchema.safeParse({
...validFeedback,
secret: 'must not be accepted'
}).success
).toBe(false)
expect(
publicFeedbackPayloadSchema.safeParse({
...validFeedback,
description: 'too short'
}).success
).toBe(false)
expect(
publicFeedbackPayloadSchema.safeParse({
...validFeedback,
contactEmail: 'not-an-email'
}).success
).toBe(false)
})
it('uses stable lowercase product keys', () => {
expect(productKeySchema.parse('mesa-writer')).toBe('mesa-writer')
for (const invalid of ['GoodBuddy', '-goodbuddy', 'goodbuddy-', 'a', 'x_y']) {
expect(productKeySchema.safeParse(invalid).success).toBe(false)
}
})
it('accepts references after the sequence exceeds six digits', () => {
expect(
publicFeedbackResponseSchema.parse({
reference: 'GOODBUDDY-1000000',
duplicate: false
})
).toEqual({
reference: 'GOODBUDDY-1000000',
duplicate: false
})
})
})