Add CWA_ENABLED to run Bindery without CWA
With CWA_ENABLED=false, Bindery ignores the CWA settings, makes no request to CWA, and shows nothing about CWA in the log and the web interface. A set INGEST_DIR still gets each changed book as a plain epub. Without it, the log names each CWA function that a missing setting turns off.
This commit is contained in:
@@ -9,11 +9,12 @@ from unittest.mock import Mock
|
||||
import pytest
|
||||
from test_api import H
|
||||
from test_api import client as client
|
||||
from test_deliver import STORY_URL, add_story, rebuild, site
|
||||
from test_deliver import STORY_URL, add_story, rebuild, site, update
|
||||
from test_deliver import jobs as jobs
|
||||
|
||||
from bindery import config, orchestrator
|
||||
from bindery.cwa import Book
|
||||
from bindery.ingest import IngestError
|
||||
from bindery.jobs import DownloadMode, Job
|
||||
from bindery.store import Store
|
||||
|
||||
@@ -39,7 +40,8 @@ def library(isolated, monkeypatch):
|
||||
monkeypatch.setattr(orchestrator, "_find_book", Mock(return_value=None))
|
||||
|
||||
|
||||
def test_app_starts_without_any_cwa_configuration(tmp_path):
|
||||
@pytest.mark.parametrize("enabled", [False, True])
|
||||
def test_app_starts_without_any_cwa_configuration(tmp_path, enabled):
|
||||
env = {
|
||||
**os.environ,
|
||||
"CONFIG_DIR": str(tmp_path / "standalone"),
|
||||
@@ -47,6 +49,7 @@ def test_app_starts_without_any_cwa_configuration(tmp_path):
|
||||
"AUTH_METHOD": "none",
|
||||
"BINDERY_START_THREADS": "false",
|
||||
"URL_BASE": "",
|
||||
"CWA_ENABLED": str(enabled),
|
||||
}
|
||||
for name in ("INGEST_DIR", "CWA_URL", "CWA_DB_PATH", "CALIBRE_DB_PATH"):
|
||||
env.pop(name, None)
|
||||
@@ -69,8 +72,69 @@ def test_app_starts_without_any_cwa_configuration(tmp_path):
|
||||
timeout=30,
|
||||
)
|
||||
assert result.returncode == 0, result.stderr
|
||||
assert "WARNING" not in result.stderr
|
||||
assert "ERROR" not in result.stderr
|
||||
# Bindery names what is missing, until the user says that there is no CWA.
|
||||
for text in ("WARNING", "INGEST_DIR is not set", "CWA_URL and CALIBRE_DB_PATH are not set", "CWA_ENABLED=false"):
|
||||
assert (text in result.stderr) is enabled
|
||||
if not enabled:
|
||||
assert "CWA" not in result.stderr and "INGEST" not in result.stderr
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def cwa_off(monkeypatch):
|
||||
monkeypatch.setattr(config, "CWA_ENABLED", False)
|
||||
|
||||
|
||||
def test_without_cwa_and_an_ingest_folder_a_job_only_builds_a_changed_book(monkeypatch, cwa_off):
|
||||
monkeypatch.setattr(config, "INGEST_DIR", None)
|
||||
site(monkeypatch, [(1, "One", "First chapter")])
|
||||
job = Job(mode=DownloadMode.NEW, url=STORY_URL)
|
||||
assert orchestrator._run_site_job(job).endswith("Built the book")
|
||||
story_id = job.story_id
|
||||
story = orchestrator.store.get_story(story_id)
|
||||
assert (story["status"], story["message"], story["ingested_at"]) == ("ok", "Built the book", None)
|
||||
assert orchestrator.store.get_setting(story_id, "upload_held") is None
|
||||
assert len(list(config.TMP_DIR.glob(f"story-{story_id}-*.epub"))) == 1
|
||||
assert update(story_id).startswith("No changes")
|
||||
assert orchestrator._run_rebuild(Job(mode=DownloadMode.REBUILD, story_id=story_id)) == "No changes"
|
||||
assert rebuild(story_id) == "Built the book"
|
||||
site(monkeypatch, [(1, "One", "First chapter"), (2, "Two", "Second chapter")])
|
||||
assert update(story_id).endswith("Built the book")
|
||||
orchestrator.cwa.assert_not_called()
|
||||
|
||||
|
||||
@pytest.mark.parametrize("saved_id", [None, 7])
|
||||
def test_without_cwa_the_ingest_folder_gets_each_changed_book_as_a_plain_epub(cwa_off, saved_id):
|
||||
# A pause, a hold and a saved book ID are from a time with CWA. They do not apply.
|
||||
orchestrator.save_settings(pause_uploads=True, hold_new_links=True)
|
||||
story_id = add_story(calibre_id=saved_id, calibre_uuid="saved-uuid" if saved_id else None)
|
||||
orchestrator._link_changed(story_id)
|
||||
orchestrator.store.set_setting(story_id, "upload_held", True)
|
||||
assert rebuild(story_id) == "Sent to ingest folder"
|
||||
assert [p.suffix for p in config.INGEST_DIR.iterdir()] == [".epub"]
|
||||
assert orchestrator.store.get_story(story_id)["ingested_at"] is None
|
||||
assert orchestrator.store.get_setting(story_id, "upload_held") is None
|
||||
assert orchestrator._run_rebuild(Job(mode=DownloadMode.REBUILD, story_id=story_id)) == "No changes"
|
||||
assert len(list(config.INGEST_DIR.iterdir())) == 1
|
||||
orchestrator.cwa.assert_not_called()
|
||||
|
||||
|
||||
def test_without_cwa_a_missing_ingest_folder_is_still_an_error(monkeypatch, tmp_path, cwa_off):
|
||||
monkeypatch.setattr(config, "INGEST_DIR", tmp_path / "missing")
|
||||
story_id = add_story()
|
||||
with pytest.raises(IngestError, match="does not exist"):
|
||||
rebuild(story_id)
|
||||
# The book counts as sent only when it is in the folder.
|
||||
assert orchestrator.store.get_setting(story_id, "sent_key") is None
|
||||
|
||||
|
||||
def test_cwa_off_shows_in_the_config_and_refuses_cwa_logins(client, monkeypatch, cwa_off):
|
||||
assert client.get("/api/config").json["cwa_enabled"] is False
|
||||
monkeypatch.setattr(config, "AUTH_METHOD", "cwa")
|
||||
monkeypatch.setattr(config, "CWA_DB_PATH", "/cwa/app.db")
|
||||
response = client.get("/api/stories")
|
||||
assert response.status_code == 503
|
||||
assert response.json["error"].startswith("AUTH_METHOD=cwa needs CWA, but CWA_ENABLED is false.")
|
||||
|
||||
|
||||
def test_link_setting_defaults_on_and_persists(client, monkeypatch, tmp_path, library):
|
||||
|
||||
Reference in New Issue
Block a user