Conversation
|
This pull request has been marked as stale due to 30 days of inactivity. It will be closed in 1 week if no further activity occurs. If you think that's incorrect or this pull request requires a review, please simply write any comment. If closed, you can revive the PR at any time and @mention a reviewer or discuss it on the dev@iceberg.apache.org list. Thank you for your contributions. |
|
@Fokko this focused snapshot assertion fix is green and nearing stale closure. could you take a look? |
|
Thanks @anxkhn for working on this, and sorry for my slow reply, I was touching grass. I'm not a big fan of mocking since it can diverge from the actual code. Let's rewrite the test and avoid mocking altogether. WDYT? |
test_expire_unprotected_snapshot and test_expire_snapshots_by_ids mocked the catalog and hardcoded the commit_table response metadata to snapshots=[KEEP_SNAPSHOT]. After commit, Table._do_commit sets self.metadata = response.metadata, so the post-conditions only re-checked that canned value: "EXPIRE_SNAPSHOT not in [KEEP_SNAPSHOT]" is int-not-in-list (always true for distinct ids) and len(snapshots) == 1 just reads the mock. Both tests still passed with ExpireSnapshots.by_id/by_ids neutered to no-ops, so they did not exercise the expiration logic. Assert the RemoveSnapshotsUpdate.snapshot_ids actually passed to commit_table instead, matching the existing pattern in test_expire_snapshots_by_timestamp_skips_protected. Compare as a set because the update's ids come from a set. With this change both tests fail when the wrong ids (or none) are expired. Signed-off-by: Anas Khan <83116240+anxkhn@users.noreply.github.com>
9391011 to
a711956
Compare
There was a problem hiding this comment.
🟢 Approval recommended
Test-only changes correctly validate expiration behavior.
Pull request overview
Strengthens snapshot expiration tests by verifying the actual IDs submitted for removal instead of mocked metadata.
Changes:
- Replaces ineffective metadata assertions.
- Verifies single- and multi-snapshot expiration IDs.
File summaries
| File | Description |
|---|---|
tests/table/test_expire_snapshots.py |
Asserts captured expiration update IDs. |
Review details
- Files reviewed: 1/1 changed files
- Comments generated: 0
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Rationale for this change
test_expire_unprotected_snapshotandtest_expire_snapshots_by_idsintests/table/test_expire_snapshots.pydo not actually exercise the expirationlogic. Both tests mock the catalog and hardcode the
commit_tableresponsemetadata to
snapshots=[KEEP_SNAPSHOT]. After the commit,Table._do_commitsets
self.metadata = response.metadata, sotable_v2.metadata.snapshotsbecomes that canned value regardless of which ids
ExpireSnapshotsactuallyselected. The post-conditions then only re-read the mock:
assert EXPIRE_SNAPSHOT not in remaining_snapshotscompares an int against alist of a different int, which is always true.
assert len(table_v2.metadata.snapshots) == 1just reads the hardcodedsingle-element list.
As a result, both tests still pass even when
ExpireSnapshots.by_id/by_idsare neutered to no-ops (nothing is expired), so a regression that selected the
wrong snapshot ids, or none, would not be caught.
This mirrors the assertion style already used correctly in the same file by
test_expire_snapshots_by_timestamp_skips_protected, which inspects theRemoveSnapshotsUpdatesent tocommit_tableinstead of the mocked response.Are these changes tested?
Yes; this change is entirely to tests. It replaces the assertions in the two
tests above with an inspection of the
RemoveSnapshotsUpdate.snapshot_idsactually passed to
commit_table(viacall_args), comparing as a set becausethe update's ids are built from a
set.python -m pytest tests/table/test_expire_snapshots.py-> 9 passed.ExpireSnapshots.by_id/by_idstemporarily stubbed to no-ops, both tests now fail (the capturedsnapshot_idsset is empty), whereas before this change they still passed.Are there any user-facing changes?
No. Test-only change; no library code is modified.
Notes for maintainers (optional comment, not part of the template)
real expiration result. The other tests in the file are unchanged.
call_argsinspection is duplicated across three tests now(including the pre-existing
..._skips_protected). I kept it inline to matchthe established in-file pattern rather than introduce a helper in this PR; happy
to factor it out if preferred.