Prove that an exported archive matches a network server
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 55/100
调研方向
Start with tests/testapp/tests/integration/test_disk_export.py and compare its setup with PushPullClientTestCase and LiveServer in tests/testapp/tests/integration/test_syncsession.py. Run python -O -m pytest tests/testapp/tests/integration/test_disk_export.py -v, then verify parity, archive contents, chunking results, failure cleanup, and the PostgreSQL integration suite with tox -e postgres -- tests/testapp/tests/integration.
由索引模型根据 Issue 内容生成。
描述
Overview
Integration tests prove that a full export produces a complete archive with the same data as a network server that receives the same push. This issue is part of milestone M7 (verification).
Background & Motivation
The parity rule is the central promise of the design. An archive holds the same morango state as a server that receives the same push, plus a manifest. Future import (Phase 2) and incremental update (Phase 4) depend on this promise.
These tests also cover the full export flow through the public API, chunked transfers, and cleanup after a failure.
Design: spec. Plan: implementation plan, Task 25.
Description & Expected Outcomes
A parity test pushes the same facility data twice with the same filter. One push goes to the second-server test harness, and one push goes to a disk connection. The test compares the Store, RecordMaxCounter and DatabaseMaxCounter rows of the two receivers. The test ignores rows that use the instance ID of each receiver.
An end-to-end test runs a full export through the public API and reopens the archive. The archive must match every row of the "Archive contents at completion" table in spec §3.4.
A chunking test uses a small chunk size, so that the transfer takes more than one cycle. A failure test forces an error during the transfer. After the host closes the sync session and the connection, no archive file, partial file, lock file or archive alias remains.
Deliverables & Contracts
The feature delivers these capabilities:
- A parity test against the second-server harness.
- An end-to-end export test through
create_disk_connectionand the push client. - A chunking test and a failure-injection test.
Acceptance Criteria
- The parity test finds equal
Store,RecordMaxCounterandDatabaseMaxCounterrows indefault2and in the reopened archive. - The end-to-end test finds every row of the spec §3.4 contents table in the archive.
- With
chunk_size=2and 5 records, the push transfer runs 3 times, with resultsPENDING,PENDING,COMPLETED. - If
DiskSyncConnection.push_record_chunkraisesOSError,run()raisesMorangoError. - After the failure and a call to
close_sync_session()andclose(), nopath,.partialor.lockfile exists. - After the failure, no key that starts with
ARCHIVE_ALIAS_PREFIXis inconnections.databases. - All tests pass on SQLite and in the
postgrestox environment.
Technical Pointers & Architecture
- Target Components / Context:
tests/testapp/tests/integration/test_disk_export.py. - Related Patterns:
PushPullClientTestCaseandLiveServerintests/testapp/tests/integration/test_syncsession.pygive the seed data and the second server. - Data Model & Schema Considerations: None.
- Resilience & Failure Modes: The failure test covers the discard path of the archive.
Notes & Tradeoffs
- Dependencies: Blocked by: #375 (deprecated network operation names and override order), #384 (disk Peer protocol). Blocks: #387.
- Kolibri companion changes: See spec §3.9. Kolibri routers must allow morango migrations on aliases that start with
morango_archive_. Kolibri settings overrides must list thePeer*operations. - Testing Requirements: Run
python -O -m pytest tests/testapp/tests/integration/test_disk_export.py -vandtox -e postgres -- tests/testapp/tests/integration. With a PostgreSQL host, the archive stays SQLite. - Tradeoffs & Alternatives Considered: The tests read the server data from the
default2alias of the test settings.
Metadata
- Complexity: Medium
- Target Branch: release-v0.9.x
AI Usage
Drafted with Claude (Claude Code) from the approved design spec and implementation plan. The author reviewed the requirements, and the code references were checked against the release-v0.9.x codebase.
- 主要语言
- Python
- 星标
- 15
- 派生
- 23
- 平均合并
- 1 天 11 小时
- 30 天内合并 PR
- 4
环境准备
- 提供 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
learningequality/morango 的其他 Issue
-
DEV: dev-ops DEV: distributions DOCS: developer
难度 1/5 1-3 小时 新手友好度 78/100
learningequality/morango#387 ·
-
DEV: backend DEV: dev-ops TAG: unit tests
难度 2/5 1-3 小时 新手友好度 70/100
learningequality/morango#385 ·
-
DEV: backend P0 - critical TAG: tech update / debt TAG: unit tests
难度 2/5 1-3 小时 新手友好度 72/100
learningequality/morango#364 ·
-
DEV: backend TAG: new feature
难度 5/5 一周以上 新手友好度 10/100
learningequality/morango#388 ·
-
DEV: backend P0 - critical TAG: new feature
难度 4/5 3-5 天 新手友好度 38/100
learningequality/morango#384 ·
查看 learningequality/morango 的全部 Issue
相似的 Issue
-
changelog investigate
难度 2/5 1-3 小时 新手友好度 62/100
ramnes/notion-sdk-py#409 ·
-
good first issue help wanted
难度 2/5 1-3 小时 新手友好度 72/100
lindicaphxag-tech/kaggle#28 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 62/100
BSData/horus-heresy-3rd-edition#3211 ·
维护者通常 1 天内回复
-
bug needs-triage
难度 2/5 1-3 小时 新手友好度 70/100
维护者通常 1 天内回复
-
bug tests
难度 2/5 1-3 小时 新手友好度 76/100
维护者通常 1 天内回复