publish(task 17): validate-post-subcommand
validatePostFile(path) liest post-datei, parst frontmatter, ruft
validatePost aus core/validation. liefert { ok, slug?, error? }.
offline-befehl ohne netz-zugriff. 3 tests grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f31e586e85
commit
4d9af00a97
|
|
@ -0,0 +1,24 @@
|
|||
import { parseFrontmatter } from '../core/frontmatter.ts'
|
||||
import { validatePost } from '../core/validation.ts'
|
||||
|
||||
export interface ValidateResult {
|
||||
ok: boolean
|
||||
slug?: string
|
||||
error?: string
|
||||
}
|
||||
|
||||
export async function validatePostFile(path: string): Promise<ValidateResult> {
|
||||
let text: string
|
||||
try {
|
||||
text = await Deno.readTextFile(path)
|
||||
} catch (err) {
|
||||
return { ok: false, error: `cannot read ${path}: ${err instanceof Error ? err.message : err}` }
|
||||
}
|
||||
try {
|
||||
const { fm } = parseFrontmatter(text)
|
||||
validatePost(fm)
|
||||
return { ok: true, slug: fm.slug }
|
||||
} catch (err) {
|
||||
return { ok: false, error: err instanceof Error ? err.message : String(err) }
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
import { assertEquals } from '@std/assert'
|
||||
import { validatePostFile } from '../src/subcommands/validate-post.ts'
|
||||
|
||||
Deno.test('validatePostFile: ok bei fixture-post', async () => {
|
||||
const result = await validatePostFile('./tests/fixtures/sample-post.md')
|
||||
assertEquals(result.ok, true)
|
||||
assertEquals(result.slug, 'sample-slug')
|
||||
})
|
||||
|
||||
Deno.test('validatePostFile: fehler bei fehlender datei', async () => {
|
||||
const result = await validatePostFile('./does-not-exist.md')
|
||||
assertEquals(result.ok, false)
|
||||
assertEquals(result.error?.includes('read'), true)
|
||||
})
|
||||
|
||||
Deno.test('validatePostFile: fehler bei ungültigem slug', async () => {
|
||||
const tmp = await Deno.makeTempFile({ suffix: '.md' })
|
||||
try {
|
||||
await Deno.writeTextFile(
|
||||
tmp,
|
||||
'---\ntitle: "T"\nslug: "Bad Slug"\ndate: 2024-01-01\n---\n\nbody',
|
||||
)
|
||||
const result = await validatePostFile(tmp)
|
||||
assertEquals(result.ok, false)
|
||||
assertEquals(result.error?.includes('slug'), true)
|
||||
} finally {
|
||||
await Deno.remove(tmp)
|
||||
}
|
||||
})
|
||||
Loading…
Reference in New Issue