Adds two managed system overlays (l4d2center-maps, cedapug-maps) that fetch curated map archives from upstream sources and reconcile addons symlinks for non-Steam maps. A daily systemd timer enqueues a coalesced refresh_global_overlays worker job; downloads, extraction, and rebuilds run in the existing job worker and surface in the job log UI. Schema: GlobalOverlaySource / GlobalOverlayItem / GlobalOverlayItemFile plus nullable Job.user_id so system jobs render as "system" in the UI. The new builder reconciles symlinks against the per-source vpk cache and leaves foreign symlinks untouched. Initialize-time guard refuses to mount a partial overlay if any expected vpk is missing from cache. Refresh service uses shutil.move to handle EXDEV when /tmp and the cache live on different filesystems. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
19 lines
766 B
Python
19 lines
766 B
Python
from l4d2web.app import create_app
|
|
from l4d2web.db import init_db, session_scope
|
|
from l4d2web.models import Job
|
|
|
|
|
|
def test_refresh_global_overlays_cli_enqueues_system_job(tmp_path, monkeypatch):
|
|
db_url = f"sqlite:///{tmp_path/'cli.db'}"
|
|
monkeypatch.setenv("DATABASE_URL", db_url)
|
|
monkeypatch.setenv("LEFT4ME_ROOT", str(tmp_path))
|
|
app = create_app({"TESTING": True, "DATABASE_URL": db_url, "SECRET_KEY": "test"})
|
|
init_db()
|
|
|
|
result = app.test_cli_runner().invoke(args=["refresh-global-overlays"])
|
|
|
|
assert result.exit_code == 0
|
|
assert "queued refresh_global_overlays job" in result.output
|
|
with session_scope() as db:
|
|
job = db.query(Job).filter_by(operation="refresh_global_overlays").one()
|
|
assert job.user_id is None
|