72 lines
2.0 KiB
TypeScript
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
|
|
})
|
|
})
|
|
})
|