fix(protected-phrases): isolate phrase generation per book
treefmt / nix fmt (pull_request) Failing after 5s
pytest / pytest (pull_request) Successful in 28s
test ebook search / test-ebook-search (pull_request) Failing after 35s
build_systems / build-bob (pull_request) Successful in 49s
build_systems / build-brain (pull_request) Successful in 49s
build_systems / build-rhapsody-in-green (pull_request) Successful in 1m3s
build_systems / build-jeeves (pull_request) Successful in 2m24s
treefmt / nix fmt (pull_request) Failing after 5s
pytest / pytest (pull_request) Successful in 28s
test ebook search / test-ebook-search (pull_request) Failing after 35s
build_systems / build-bob (pull_request) Successful in 49s
build_systems / build-brain (pull_request) Successful in 49s
build_systems / build-rhapsody-in-green (pull_request) Successful in 1m3s
build_systems / build-jeeves (pull_request) Successful in 2m24s
Run full-book candidate generation inside worker-owned sessions so each book commits independently during backfills. Abort recalculation when a book has no indexed chapters to preserve existing phrase data, and update admin/UI tests for the new generation flow.
This commit is contained in:
@@ -567,33 +567,8 @@ def test_admin_page_shows_protected_phrase_stats(mocker: MockerFixture) -> None:
|
||||
assert value in response.text
|
||||
|
||||
|
||||
def test_ui_add_missing_phrases_generates_only_missing_books(mocker: MockerFixture) -> None:
|
||||
captured: dict[str, object] = {}
|
||||
|
||||
def fake_generate(_session, _config, *, only_missing=False):
|
||||
captured["only_missing"] = only_missing
|
||||
return PhraseCandidateGenerationResult(books_seen=3, books_built=2, candidate_phrases=42)
|
||||
|
||||
mocker.patch(
|
||||
"python.ebook_search.api.routes.admin.generate_candidate_phrases_for_books",
|
||||
side_effect=fake_generate,
|
||||
)
|
||||
patch_app_runtime(mocker)
|
||||
app = create_app()
|
||||
|
||||
with TestClient(app) as client:
|
||||
response = client.post("/admin/phrases/generate-missing")
|
||||
|
||||
assert response.status_code == 200
|
||||
assert captured["only_missing"] is True
|
||||
assert "42 candidates stored" in response.text
|
||||
|
||||
|
||||
def test_ui_regenerate_all_phrases_generates_every_book(mocker: MockerFixture) -> None:
|
||||
captured: dict[str, object] = {}
|
||||
|
||||
def fake_generate(_session, _config, *, only_missing=False):
|
||||
captured["only_missing"] = only_missing
|
||||
def fake_generate(_session, _config):
|
||||
return PhraseCandidateGenerationResult(books_seen=5, books_built=5, candidate_phrases=99)
|
||||
|
||||
mocker.patch(
|
||||
@@ -607,7 +582,6 @@ def test_ui_regenerate_all_phrases_generates_every_book(mocker: MockerFixture) -
|
||||
response = client.post("/admin/phrases/generate-all")
|
||||
|
||||
assert response.status_code == 200
|
||||
assert captured["only_missing"] is False
|
||||
assert "5 of 5 books" in response.text
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user