import json from furtka.scanner import scan VALID_MANIFEST = { "name": "fileshare", "display_name": "Network Files", "version": "0.1.0", "description": "SMB share", "volumes": ["files"], "ports": [445], "icon": "icon.svg", } def _make_app(root, name, manifest=None): app = root / name app.mkdir(parents=True) if manifest is not None: (app / "manifest.json").write_text(json.dumps(manifest)) return app def test_scan_missing_root(tmp_path): assert scan(tmp_path / "does-not-exist") == [] def test_scan_empty_root(tmp_path): assert scan(tmp_path) == [] def test_scan_valid_app(tmp_path): _make_app(tmp_path, "fileshare", VALID_MANIFEST) results = scan(tmp_path) assert len(results) == 1 assert results[0].ok assert results[0].manifest.name == "fileshare" def test_scan_skips_files(tmp_path): _make_app(tmp_path, "fileshare", VALID_MANIFEST) (tmp_path / "stray.txt").write_text("ignore me") results = scan(tmp_path) assert len(results) == 1 def test_scan_missing_manifest(tmp_path): _make_app(tmp_path, "broken") results = scan(tmp_path) assert len(results) == 1 assert not results[0].ok assert "manifest.json missing" in results[0].error def test_scan_invalid_manifest(tmp_path): bad = dict(VALID_MANIFEST) del bad["volumes"] _make_app(tmp_path, "fileshare", bad) results = scan(tmp_path) assert len(results) == 1 assert not results[0].ok assert "volumes" in results[0].error def test_scan_sorted_by_name(tmp_path): _make_app(tmp_path, "z-app", dict(VALID_MANIFEST, name="z-app")) _make_app(tmp_path, "a-app", dict(VALID_MANIFEST, name="a-app")) results = scan(tmp_path) assert [r.path.name for r in results] == ["a-app", "z-app"]