# coding=utf-8 import json from pathlib import Path from spark_executor.core import connection_store from spark_executor.models import Connection def _conn(name: str) -> Connection: return Connection(name=name, master="yarn") def test_save_then_get_roundtrip(tmp_path: Path, monkeypatch): monkeypatch.setattr(connection_store, "DEFAULT_DATA_DIR", str(tmp_path)) monkeypatch.setattr(connection_store, "store", connection_store.ConnectionStore()) connection_store.store.save(_conn("prod")) assert connection_store.store.get("prod") is not None assert connection_store.store.get("prod").master == "yarn" def test_save_persists_to_json_file(tmp_path: Path, monkeypatch): monkeypatch.setattr(connection_store, "DEFAULT_DATA_DIR", str(tmp_path)) monkeypatch.setattr(connection_store, "store", connection_store.ConnectionStore()) connection_store.store.save(_conn("prod")) path = tmp_path / "connections.json" assert path.is_file() payload = json.loads(path.read_text()) assert "prod" in payload assert payload["prod"]["master"] == "yarn" def test_get_missing_returns_none(tmp_path: Path, monkeypatch): monkeypatch.setattr(connection_store, "DEFAULT_DATA_DIR", str(tmp_path)) monkeypatch.setattr(connection_store, "store", connection_store.ConnectionStore()) assert connection_store.store.get("missing") is None def test_list_all_returns_empty_when_file_absent(tmp_path: Path, monkeypatch): monkeypatch.setattr(connection_store, "DEFAULT_DATA_DIR", str(tmp_path)) monkeypatch.setattr(connection_store, "store", connection_store.ConnectionStore()) assert connection_store.store.list_all() == [] def test_list_all_returns_saved_connections(tmp_path: Path, monkeypatch): monkeypatch.setattr(connection_store, "DEFAULT_DATA_DIR", str(tmp_path)) monkeypatch.setattr(connection_store, "store", connection_store.ConnectionStore()) connection_store.store.save(_conn("a")) connection_store.store.save(_conn("b")) names = {c.name for c in connection_store.store.list_all()} assert names == {"a", "b"} def test_save_upserts_existing(tmp_path: Path, monkeypatch): monkeypatch.setattr(connection_store, "DEFAULT_DATA_DIR", str(tmp_path)) monkeypatch.setattr(connection_store, "store", connection_store.ConnectionStore()) connection_store.store.save(_conn("prod")) updated = Connection(name="prod", master="spark://new:7077", deploy_mode="client") connection_store.store.save(updated) assert connection_store.store.get("prod").master == "spark://new:7077" assert connection_store.store.get("prod").deploy_mode == "client" def test_delete_returns_true_when_present(tmp_path: Path, monkeypatch): monkeypatch.setattr(connection_store, "DEFAULT_DATA_DIR", str(tmp_path)) monkeypatch.setattr(connection_store, "store", connection_store.ConnectionStore()) connection_store.store.save(_conn("prod")) assert connection_store.store.delete("prod") is True assert connection_store.store.get("prod") is None def test_delete_returns_false_when_absent(tmp_path: Path, monkeypatch): monkeypatch.setattr(connection_store, "DEFAULT_DATA_DIR", str(tmp_path)) monkeypatch.setattr(connection_store, "store", connection_store.ConnectionStore()) assert connection_store.store.delete("nope") is False