All checks were successful
Build ISO / build-iso (push) Successful in 20m49s
CI / lint (push) Successful in 1m13s
CI / test (push) Successful in 48s
CI / validate-json (push) Successful in 44s
CI / markdown-links (push) Successful in 16s
Release / release (push) Successful in 13m31s
Three small fixes surfaced by the 26.8 QA pass on fresh VM .161: - Landing-page app tiles now open external `open_url` links in a new tab, matching /apps Open-button behaviour. Without this a Kuma click on the home screen replaced Furtka itself. - `scripts/publish-release.sh` treats the ISO upload as best-effort; a Forgejo-proxy 504 no longer kills the whole release after tarball + sha + release.json are already uploaded. - `furtka app list --json` now mirrors /api/apps — includes `description_long`, `open_url`, and `settings` that the previous slim projection dropped.
73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
import json
|
|
|
|
from furtka.cli import main
|
|
|
|
|
|
def _set_env(monkeypatch, tmp_path):
|
|
monkeypatch.setenv("FURTKA_APPS_DIR", str(tmp_path))
|
|
|
|
|
|
def test_app_list_empty(tmp_path, monkeypatch, capsys):
|
|
_set_env(monkeypatch, tmp_path)
|
|
rc = main(["app", "list"])
|
|
assert rc == 0
|
|
assert "no apps installed" in capsys.readouterr().out
|
|
|
|
|
|
def test_app_list_json_empty(tmp_path, monkeypatch, capsys):
|
|
_set_env(monkeypatch, tmp_path)
|
|
rc = main(["app", "list", "--json"])
|
|
assert rc == 0
|
|
assert json.loads(capsys.readouterr().out) == []
|
|
|
|
|
|
def test_app_list_json_with_one_app(tmp_path, monkeypatch, capsys):
|
|
_set_env(monkeypatch, tmp_path)
|
|
app = tmp_path / "fileshare"
|
|
app.mkdir()
|
|
(app / "manifest.json").write_text(
|
|
json.dumps(
|
|
{
|
|
"name": "fileshare",
|
|
"display_name": "Network Files",
|
|
"version": "0.1.0",
|
|
"description": "SMB",
|
|
"description_long": "Long description here.",
|
|
"volumes": ["files"],
|
|
"ports": [445],
|
|
"icon": "icon.svg",
|
|
"open_url": "smb://{host}/files",
|
|
"settings": [
|
|
{
|
|
"name": "SMB_USER",
|
|
"label": "User",
|
|
"description": "SMB user",
|
|
"type": "text",
|
|
"default": "furtka",
|
|
"required": True,
|
|
}
|
|
],
|
|
}
|
|
)
|
|
)
|
|
rc = main(["app", "list", "--json"])
|
|
assert rc == 0
|
|
data = json.loads(capsys.readouterr().out)
|
|
assert len(data) == 1
|
|
assert data[0]["ok"] is True
|
|
m = data[0]["manifest"]
|
|
assert m["name"] == "fileshare"
|
|
assert m["description_long"] == "Long description here."
|
|
assert m["open_url"] == "smb://{host}/files"
|
|
assert len(m["settings"]) == 1
|
|
assert m["settings"][0]["name"] == "SMB_USER"
|
|
assert m["settings"][0]["required"] is True
|
|
assert m["settings"][0]["default"] == "furtka"
|
|
|
|
|
|
def test_reconcile_dry_run_empty(tmp_path, monkeypatch, capsys):
|
|
_set_env(monkeypatch, tmp_path)
|
|
rc = main(["reconcile", "--dry-run"])
|
|
assert rc == 0
|
|
out = capsys.readouterr().out
|
|
assert "0 actions" in out
|