feat: 初始化慧遇书院官网一期

This commit is contained in:
2026-08-12 18:01:17 +08:00
commit 5d31ee5743
101 changed files with 17259 additions and 0 deletions

14
tests/filing.test.ts Normal file
View File

@@ -0,0 +1,14 @@
import { describe, expect, it } from 'vitest'
import { getPoliceFilingUrl, MPS_FILING_URL } from '../app/utils/filing'
describe('公安备案链接', () => {
it('从备案文本中提取编号并生成查询链接', () => {
expect(getPoliceFilingUrl('沪公网安备 31010402001197号')).toBe(
'https://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31010402001197',
)
})
it('没有编号时指向公安备案平台首页', () => {
expect(getPoliceFilingUrl('待配置')).toBe(MPS_FILING_URL)
})
})

40
tests/site-schema.test.ts Normal file
View File

@@ -0,0 +1,40 @@
import { describe, expect, it } from 'vitest'
import { defaultSiteDocument, siteDocumentSchema } from '../server/utils/site-schema'
describe('siteDocumentSchema', () => {
it('accepts the seeded phase-one website document', () => {
expect(siteDocumentSchema.parse(defaultSiteDocument)).toEqual(defaultSiteDocument)
expect(defaultSiteDocument.brand.name).toBe('慧遇书院')
})
it('rejects unsafe oversized content', () => {
const invalid = structuredClone(defaultSiteDocument)
invalid.hero.titleLine1 = '超'.repeat(21)
expect(() => siteDocumentSchema.parse(invalid)).toThrow()
})
it('contains routable published content', () => {
const parsed = siteDocumentSchema.parse(defaultSiteDocument)
expect(parsed.products.every(item => /^[a-z0-9-]+$/.test(item.slug))).toBe(true)
expect(parsed.articles.some(item => item.type === 'statement')).toBe(true)
expect(parsed.team.length).toBeGreaterThan(0)
})
it('rejects duplicate route slugs', () => {
const invalid = structuredClone(defaultSiteDocument)
invalid.products[1].slug = invalid.products[0].slug
expect(siteDocumentSchema.safeParse(invalid).success).toBe(false)
})
it('rejects unsafe external protocols', () => {
const invalid = structuredClone(defaultSiteDocument)
invalid.channels[0].url = 'javascript:alert(1)'
expect(siteDocumentSchema.safeParse(invalid).success).toBe(false)
})
it('allows channels to stay unlinked before official URLs are confirmed', () => {
const draft = structuredClone(defaultSiteDocument)
draft.channels.forEach(channel => { channel.url = '' })
expect(siteDocumentSchema.safeParse(draft).success).toBe(true)
})
})