Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 1m9s
Implements plans/migration/data-migration.md (the un-started long-pole) and the data-layer half of slice-01-blog §4. Host-ops migration module composing content-on-sx + persist public APIs; isolated from lib/host and lib/content. - lexical.sx: Ghost lexical (as SX dicts) -> content block list, deterministic ids - import.sx: genesis import into content:<id> op-log, idempotent, + postmeta stream - verify.sx: replay-and-diff vs row-derived oracle (proves round-trip lossless) Inline formatting flattens to plain text (Phase-5 runs swap-point isolated in lex-inline-text); live Postgres source (Q-M4) + improved-converter re-import (Q-M5) flagged in README. 55/55 conformance: lexical 23, import 21, verify 11. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
63 lines
2.7 KiB
Plaintext
63 lines
2.7 KiB
Plaintext
; lib/blogimport/tests/import.sx — genesis import + idempotency
|
|
(st-bootstrap-classes!)
|
|
(content-bootstrap-blocks!)
|
|
(content-bootstrap-doc!)
|
|
(content-bootstrap-callout!)
|
|
(content-bootstrap-media!)
|
|
|
|
(define
|
|
p1
|
|
{:id "post-1" :slug "hello" :title "Hello" :status "published"
|
|
:visibility "public" :tags (list "news") :authors (list "u1")
|
|
:lexical {:root {:children (list
|
|
{:type "heading" :tag "h1" :children (list {:type "text" :text "Hello"})}
|
|
{:type "paragraph" :children (list {:type "text" :text "world"})})}}})
|
|
|
|
(define
|
|
p2
|
|
{:id "post-2" :slug "two" :title "Two" :status "published"
|
|
:lexical {:children (list
|
|
{:type "paragraph" :children (list {:type "text" :text "second"})})}})
|
|
|
|
; ---- genesis-ops ordering ----
|
|
(define ops1 (blogimport/genesis-ops (blogimport/lex-blocks (get p1 :lexical))))
|
|
(bi-test "genesis op kinds" (map (fn (o) (get o :op)) ops1) (list "insert" "insert"))
|
|
(bi-test "genesis first after nil" (get (nth ops1 0) :after) nil)
|
|
(bi-test "genesis second after first id" (get (nth ops1 1) :after) "b0")
|
|
|
|
; ---- import one ----
|
|
(define B (persist/open))
|
|
(define r1 (blogimport/import-post! B p1 10))
|
|
(bi-test "import imported flag" (get r1 :imported) true)
|
|
(bi-test "import block count" (get r1 :blocks) 2)
|
|
(bi-test "stream version-count" (content/version-count B "post-1") 2)
|
|
(bi-test "head ids" (doc-ids (content/head B "post-1")) (list "b0" "b1"))
|
|
(bi-test "head body text"
|
|
(str (blk-send (doc-find (content/head B "post-1") "b1") "text")) "world")
|
|
(bi-test "head heading level"
|
|
(blk-send (doc-find (content/head B "post-1") "b0") "level") 1)
|
|
|
|
; ---- metadata round-trip ----
|
|
(bi-test "meta round-trip" (blogimport/load-meta B "post-1") (blogimport/post-meta p1))
|
|
(bi-test "meta title" (get (blogimport/load-meta B "post-1") :title) "Hello")
|
|
(bi-test "meta tags" (get (blogimport/load-meta B "post-1") :tags) (list "news"))
|
|
|
|
; ---- idempotent re-import (skip-if-exists, no duplication) ----
|
|
(define r1b (blogimport/import-post! B p1 99))
|
|
(bi-test "reimport skipped" (get r1b :imported) false)
|
|
(bi-test "reimport reason" (get r1b :reason) "exists")
|
|
(bi-test "version-count unchanged after reimport" (content/version-count B "post-1") 2)
|
|
(bi-test "head ids unchanged after reimport"
|
|
(doc-ids (content/head B "post-1")) (list "b0" "b1"))
|
|
|
|
; ---- import-all! coverage scoreboard ----
|
|
(define B2 (persist/open))
|
|
(define cov1 (blogimport/import-all! B2 (list p1 p2) 5))
|
|
(bi-test "import-all total" (get cov1 :total) 2)
|
|
(bi-test "import-all imported" (get cov1 :imported) 2)
|
|
(bi-test "import-all skipped" (get cov1 :skipped) 0)
|
|
; re-run is fully idempotent
|
|
(define cov2 (blogimport/import-all! B2 (list p1 p2) 6))
|
|
(bi-test "import-all rerun imported" (get cov2 :imported) 0)
|
|
(bi-test "import-all rerun skipped" (get cov2 :skipped) 2)
|