mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-11-10 22:47:02 +01:00
Split along the same seams the source took: test_review_render.py covers what now lives in review._render, test_review_undo.py covers review._undo. The two fixture builders they share moved into the existing conftest.py rather than a _helpers.py -- the name-tests-test hook requires everything else under tests/ to be named test_*.py, and syncyomi_guard/tests/conftest.py is the precedent for plain shared builders living there. Sharing beats copying: jscpd fails the commit above 2% duplication and this repo already carries four partN test files. 277 passed, the same count as before, so nothing was dropped. Two intermediate runs caught real NameErrors from imports the extracted module needed. test_review.py 297 -> 112, test_review_render.py 102, test_review_undo.py 79. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011w2Pj4Ek3ZNMQVYcFHgXDY
80 lines
2.8 KiB
Python
80 lines
2.8 KiB
Python
"""Tests for taking a verdict back.
|
|
|
|
Split from ``test_review.py`` to keep every file under the 250-line cap; these
|
|
cover the group that now lives in ``review._undo``.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from python_pkg.wsg_grabber import review
|
|
from python_pkg.wsg_grabber.models import Verdict
|
|
from python_pkg.wsg_grabber.tests.conftest import item as _item
|
|
from python_pkg.wsg_grabber.tests.conftest import reviewed as _reviewed
|
|
|
|
|
|
def test_undo_availability_comes_from_the_index_not_memory() -> None:
|
|
"""The count is seeded from the index, so undo survives a restart."""
|
|
resumed = review.initial_state(5, [_item("a")], undoable=3)
|
|
assert review.can_undo(resumed)
|
|
assert "u undoes (3)" in review.status_line(resumed)
|
|
assert not review.can_undo(review.initial_state(5, [_item("a")]))
|
|
|
|
|
|
def test_a_recorded_verdict_can_be_undone() -> None:
|
|
first = _item("a")
|
|
state = review.initial_state(2, [first, _item("b")])
|
|
state = review.on_verdict(state, Verdict.SKIP)
|
|
assert review.can_undo(state)
|
|
|
|
state = review.on_undo(state, _reviewed(first))
|
|
assert state.current is not None
|
|
assert state.current.md5 == "a-md5"
|
|
assert state.passed == 0
|
|
assert [item.md5 for item in state.pending] == ["b-md5"]
|
|
assert not review.can_undo(state)
|
|
|
|
|
|
def test_undo_restores_the_keep_counter() -> None:
|
|
first = _item("a")
|
|
state = review.initial_state(1, [first])
|
|
state = review.on_verdict(state, Verdict.KEEP)
|
|
assert state.kept == 1
|
|
assert review.on_undo(state, _reviewed(first, Verdict.KEEP)).kept == 0
|
|
|
|
|
|
def test_undo_works_when_the_queue_has_run_dry() -> None:
|
|
first = _item("a")
|
|
state = review.initial_state(1, [first])
|
|
state = review.on_verdict(state, Verdict.SKIP)
|
|
assert state.current is None
|
|
state = review.on_undo(state, _reviewed(first))
|
|
assert state.current is not None
|
|
assert state.current.md5 == "a-md5"
|
|
|
|
|
|
def test_forget_last_drops_one_undo_without_restoring() -> None:
|
|
first = _item("a")
|
|
state = review.initial_state(1, [first])
|
|
state = review.on_verdict(state, Verdict.SKIP)
|
|
dropped = review.forget_last(state)
|
|
assert not review.can_undo(dropped)
|
|
assert dropped.passed == 1
|
|
assert review.forget_last(dropped).undoable == 0
|
|
|
|
|
|
def test_the_status_line_advertises_undo_once_it_is_possible() -> None:
|
|
first = _item("a")
|
|
state = review.initial_state(1, [first])
|
|
assert "u undoes" not in review.status_line(state)
|
|
state = review.on_verdict(state, Verdict.SKIP)
|
|
assert "u undoes (1)" in review.status_line(state)
|
|
|
|
|
|
def test_render_enables_undo_only_when_something_can_be_undone() -> None:
|
|
first = _item("a")
|
|
state = review.initial_state(1, [first])
|
|
assert not review.render(state).undo_enabled
|
|
state = review.on_verdict(state, Verdict.KEEP)
|
|
assert review.render(state).undo_enabled
|
|
assert not review.render(review.on_quit(state)).undo_enabled
|