feat: add JSON-backed ConnectionStore
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user