docling-studio/document-parser/tests
Pier-Jean Malandrino 0c09274836 chore(#206): backfill 0.6.0 doc-centric data model
CLI script to migrate existing tenants to the data model introduced
by #202-205. Idempotent and resumable — re-running is a no-op.

tools/migrate_06.py
- Step 1: backfill_lifecycle — infers documents.lifecycle_state from
  analysis_jobs.status + chunks_json presence
    Failed analyses, no completed       -> Failed
    Completed + chunks_json             -> Chunked
    Completed, no chunks_json           -> Parsed
    Otherwise                           -> Uploaded
- Step 2: materialize_chunks — promotes the latest chunks_json blob
  for each doc into rows in the new chunks table. Stable id derivation
  via uuid5(NAMESPACE_OID, '<doc>|<seq>|<text>') so re-running lands
  on the same ids
- Step 3: backfill_links — for any doc that has chunks materialized,
  creates a (doc, default-store) link in Ingested state with a freshly
  computed chunkset_hash. Treats 'chunks exist' as proxy for 'doc was
  ingested into the legacy single index' — sufficient for the typical
  pre-0.6.0 deployment, with OpenSearch reindex documented separately
- Step 4: reaggregate — applies #203's aggregate_lifecycle rule so
  doc-chunked transitions to Ingested

Persistence
- migration_progress table for resumability + per-step idempotency

CLI
    python -m tools.migrate_06              # full migration
    python -m tools.migrate_06 --dry-run    # plan only, no writes
    python -m tools.migrate_06 --only-step <name>   # rerun a phase

Tests
- 9 tests: inference rule per (completed, failed, chunks_json) tuple,
  end-to-end migration on a hand-built three-doc snapshot, idempotency
  (second run = no writes), --dry-run writes nothing, deterministic
  chunk ids across reruns

Refs #206
2026-05-05 09:38:39 +02:00
..
neo4j fix(graph): collapse Docling InlineGroup and Picture children (#197) 2026-04-29 14:00:00 +02:00
__init__.py Add a stronger testing strategy 2026-03-18 14:46:37 +01:00
test_analysis_service.py feat(chunking): soft-delete chunk with confirmation dialog 2026-04-10 20:28:24 +02:00
test_api_endpoints.py refactor(audit): remediate 0.5.0 audit findings — clean architecture, security, DRY, SOLID, perf 2026-04-29 14:00:00 +02:00
test_architecture.py feat: add hexagonal architecture tests with pytestarch (#177) 2026-04-29 14:00:00 +02:00
test_bbox.py Move bbox.py from domain/ to infra/ and unify coordinate logic 2026-04-03 13:17:26 +02:00
test_chunk_editing.py feat(#205): promote chunks to first-class entities + audit trail 2026-05-05 09:38:39 +02:00
test_chunk_repos.py feat(#205): promote chunks to first-class entities + audit trail 2026-05-05 09:38:39 +02:00
test_chunking.py feat(#202): introduce Document lifecycle state machine 2026-05-05 09:38:39 +02:00
test_docling_agent_reasoning.py refactor(audit): remediate 0.5.0 audit findings — clean architecture, security, DRY, SOLID, perf 2026-04-29 14:00:00 +02:00
test_docling_graph.py fix(graph): collapse Docling InlineGroup and Picture children (#197) 2026-04-29 14:00:00 +02:00
test_document_service.py fix(arch): inject repositories and extract domain logic 2026-04-10 11:44:33 +02:00
test_embedding_client.py feat: add embedding microservice and EmbeddingService port 2026-04-10 20:53:24 +02:00
test_graph_api.py feat(reasoning): reasoning-trace viewer v1 with SQLite-backed graph 2026-04-29 14:00:00 +02:00
test_hashing.py feat(#204): deterministic chunkset hash for auto-stale detection 2026-05-05 09:38:39 +02:00
test_ingestion_api.py feat(#180): feature-flag ingestion pipeline and add brainless one-liner Quick Start 2026-04-13 11:18:56 +02:00
test_ingestion_service.py refactor(audit): remediate 0.5.0 audit findings — clean architecture, security, DRY, SOLID, perf 2026-04-29 14:00:00 +02:00
test_lifecycle.py feat(#202): introduce Document lifecycle state machine 2026-05-05 09:38:39 +02:00
test_lifecycle_aggregation.py feat(#203): per (document, store) ingestion state 2026-05-05 09:38:39 +02:00
test_migrate_06.py chore(#206): backfill 0.6.0 doc-centric data model 2026-05-05 09:38:39 +02:00
test_models.py refactor(audit): remediate 0.5.0 audit findings — clean architecture, security, DRY, SOLID, perf 2026-04-29 14:00:00 +02:00
test_ollama_provider.py refactor(audit): remediate 0.5.0 audit findings — clean architecture, security, DRY, SOLID, perf 2026-04-29 14:00:00 +02:00
test_opensearch_store.py feat(infra): add OpenSearch adapter implementing VectorStore port 2026-04-10 20:48:50 +02:00
test_pipeline_options.py refactor(audit): remediate 0.5.0 audit findings — clean architecture, security, DRY, SOLID, perf 2026-04-29 14:00:00 +02:00
test_rate_limiter.py Add in-memory rate limiting middleware 2026-04-03 13:56:05 +02:00
test_reasoning_api.py refactor(audit): remediate 0.5.0 audit findings — clean architecture, security, DRY, SOLID, perf 2026-04-29 14:00:00 +02:00
test_repos.py feat(#202): introduce Document lifecycle state machine 2026-05-05 09:38:39 +02:00
test_robustness.py fix(clean-code): English mode strings, SRP extraction, rename getter 2026-04-10 13:45:13 +02:00
test_schemas.py Format backend codebase with ruff 2026-04-02 12:33:07 +02:00
test_serve_converter.py refactor(audit): remediate 0.5.0 audit findings — clean architecture, security, DRY, SOLID, perf 2026-04-29 14:00:00 +02:00
test_settings.py feat(settings): paste-image size/type limits for #195 (#196) 2026-04-29 14:00:00 +02:00
test_store_repo.py feat(#203): per (document, store) ingestion state 2026-05-05 09:38:39 +02:00
test_vector_schema.py feat(domain): add VectorStore port and SearchResult value object 2026-04-10 20:40:17 +02:00
test_vector_store_port.py feat(domain): add VectorStore port and SearchResult value object 2026-04-10 20:40:17 +02:00