Отсев баз через source.exclude_databases

list_databases() прячит базы по массиву строк: подстрока без регистра
или маска со * ? [. Фильтр — единственное место рождения списка, поэтому
одинаков для меню, пульта и list; явное имя в CLI не трогает.
This commit is contained in:
2026-08-20 06:02:55 +03:00
parent 9404d1dd08
commit 975934373b
5 changed files with 65 additions and 1 deletions
+29
View File
@@ -1034,3 +1034,32 @@ def test_arrows_walk_dialog_fields(cfg, monkeypatch):
await pilot.press("escape")
await pilot.pause()
asyncio.run(scenario())
def test_exclude_databases_hides_rows(monkeypatch):
"""exclude_databases — массив строк: подстрока без регистра, со звёздочкой — маска."""
assert core.excluded("zpas_test", ["test"])
assert core.excluded("ZPAS_TEST", ["test"]) # регистр не важен
assert core.excluded("zpas_old_2", ["*_old_?"]) # маска
assert not core.excluded("zpas", ["test", "*_old"])
assert not core.excluded("zpas", []) # пустой список ничего не прячет
assert not core.excluded("zpas", ["", " "]) # и пустые строки тоже
node = {"host": "stand", "user": "postgres", "password": "x",
"maintenance_database": "postgres",
"exclude_databases": ["_old", "keycloak", "*_tmp"]}
monkeypatch.setattr(core, "capture", lambda cmd, env, what:
"zpas\t1284 MB\nzpas_old\t312 MB\nkeycloak\t12 MB\n"
"media\t8 MB\nbuild_tmp\t1 MB\n")
rows = core.list_databases({"psql": "psql"}, node, "стенд")
assert [name for name, _ in rows] == ["zpas", "media"]
def test_exclude_databases_does_not_touch_explicit_name(cfg, monkeypatch):
"""Скрытая из списка база остаётся доступной, если имя названо прямо в CLI."""
cfg["source"]["exclude_databases"] = ["zpas"]
called = []
monkeypatch.setattr(core, "dump", lambda cfg_, tools, dbname, out, dry:
called.append(dbname) or out)
core.do_dump(cfg, {"pg_dump": "pg_dump"}, ["zpas"], dry_run=True)
assert called == ["zpas"]