1"""Unit tests for run discovery (no elodin-db / real run needed).
3Run: cd webviewer && .venv/bin/python -m pytest backend/test_runs.py -q
8from .
import config, export_cache, runs
13 """Point the backend at an empty fake ELODIN_DIR with the cache stubbed out."""
14 monkeypatch.setattr(config,
"ELODIN_DIR", tmp_path)
15 monkeypatch.setattr(export_cache,
"is_cached",
lambda run_id:
False)
22 (elodin_dir /
"daq_20260811_120000").mkdir()
23 (elodin_dir /
"daq_sim_20260827_204900").mkdir()
25 found = {r[
"id"]: r
for r
in runs.list_runs()}
26 assert set(found) == {
"daq_20260811_120000",
"daq_sim_20260827_204900"}
27 assert found[
"daq_20260811_120000"][
"simulated"]
is False
28 assert found[
"daq_sim_20260827_204900"][
"simulated"]
is True
30 assert found[
"daq_sim_20260827_204900"][
"started"] ==
"2026-08-27T20:49:00"
42 "xdaq_20260811_120000",
43 "daq_20260811_120000_old",
45 (elodin_dir / name).mkdir()
47 (elodin_dir /
"daq_20260811_120000").write_text(
"not a directory")
49 assert runs.list_runs() == []
54 "daq_20260811_120000",
55 "daq_sim_20260827_204900",
56 "daq_20260901_000000",
58 (elodin_dir / name).mkdir()
60 assert [r[
"id"]
for r
in runs.list_runs()] == [
61 "daq_20260901_000000",
62 "daq_sim_20260827_204900",
63 "daq_20260811_120000",
69 for bad
in (
"../etc",
"daq_20260811_120000/..",
"daq_sim_20260827_204900/x",
""):
70 assert config.RUN_RE.match(bad)
is None
elodin_dir(tmp_path, monkeypatch)
test_lists_real_and_simulated_runs(elodin_dir)
test_ignores_ad_hoc_and_hand_named_dirs(elodin_dir)
test_run_id_pattern_rejects_path_traversal()
test_sorted_newest_first(elodin_dir)