test(ci): add exporter heading levels and a11y typography smoke; update MAIN_PLAN
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
import { describe, it, expect } from 'vitest'
|
||||
|
||||
// TDD: 아직 구현되지 않은 스키마를 가정
|
||||
import { pageSchema } from '@/lib/schema/page'
|
||||
|
||||
describe('pageSchema', () => {
|
||||
it('유효한 랜딩 페이지 스키마를 통과시킨다', () => {
|
||||
const valid = {
|
||||
title: 'My Landing',
|
||||
locale: 'en',
|
||||
theme: {
|
||||
primaryColor: '#0ea5e9',
|
||||
fontFamily: 'Inter',
|
||||
},
|
||||
sections: [
|
||||
{
|
||||
type: 'hero',
|
||||
props: {
|
||||
heading: 'Hello',
|
||||
subheading: 'World',
|
||||
imageUrl: 'https://cdn.example.com/hero.png',
|
||||
},
|
||||
},
|
||||
],
|
||||
form: {
|
||||
actionUrl: '', // 빈 문자열이면 Sheets로 제출(향후 로직)
|
||||
fields: [
|
||||
{ type: 'text', name: 'name', label: 'Name', required: true },
|
||||
{ type: 'email', name: 'email', label: 'Email', required: true },
|
||||
{ type: 'checkbox', name: 'agree', label: 'Agree', required: true },
|
||||
],
|
||||
spamProtection: {
|
||||
honeypotFieldName: '_hp',
|
||||
minSubmitSeconds: 2,
|
||||
},
|
||||
},
|
||||
analytics: {
|
||||
ga4MeasurementId: '',
|
||||
metaPixelId: '',
|
||||
customHeadHtml: '',
|
||||
},
|
||||
seo: {
|
||||
title: 'My Landing',
|
||||
description: 'Best product',
|
||||
ogImage: 'https://cdn.example.com/og.png',
|
||||
},
|
||||
}
|
||||
|
||||
const parsed = pageSchema.parse(valid)
|
||||
expect(parsed.title).toBe('My Landing')
|
||||
expect(parsed.sections.length).toBe(1)
|
||||
})
|
||||
|
||||
it('파일 업로드 필드는 허용하지 않는다', () => {
|
||||
const invalid = {
|
||||
title: 'No File Please',
|
||||
locale: 'en',
|
||||
theme: { primaryColor: '#000000', fontFamily: 'Inter' },
|
||||
sections: [],
|
||||
form: {
|
||||
actionUrl: '',
|
||||
fields: [
|
||||
// 파일 타입은 금지
|
||||
{ type: 'file', name: 'attachment', label: 'Upload' },
|
||||
],
|
||||
spamProtection: { honeypotFieldName: '_hp', minSubmitSeconds: 2 },
|
||||
},
|
||||
analytics: {},
|
||||
seo: { title: 'x', description: '', ogImage: '' },
|
||||
}
|
||||
|
||||
expect(() => pageSchema.parse(invalid)).toThrow()
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user