Bot & Automation
jorgasisten
/root/hermes-projects/jorgasisten
tests/test_spreadsheet_registry.py
text
from pathlib import Path
from types import SimpleNamespace
from jorgasisten.services.spreadsheet_registry import (
SpreadsheetRegistry,
extract_spreadsheet_id,
format_spreadsheet_validation_error,
parse_add_spreadsheet_message,
)
def settings_for_registry(path: Path, default_id: str = "") -> SimpleNamespace:
return SimpleNamespace(
spreadsheet_registry_path=str(path),
default_spreadsheet_key="default",
google_sheets_spreadsheet_id=default_id,
)
def test_extract_spreadsheet_id_from_google_sheets_link() -> None:
link = "https://docs.google.com/spreadsheets/d/1AbCDefGhijKlmNOPqrstUVwxyz_1234567890/edit#gid=0"
assert extract_spreadsheet_id(link) == "1AbCDefGhijKlmNOPqrstUVwxyz_1234567890"
def test_parse_add_spreadsheet_message() -> None:
message = "tambah spreadsheet Stok Gudang id 1AbCDefGhijKlmNOPqrstUVwxyz_1234567890"
name, spreadsheet_id = parse_add_spreadsheet_message(message)
assert name == "Stok Gudang"
assert spreadsheet_id == "1AbCDefGhijKlmNOPqrstUVwxyz_1234567890"
def test_parse_add_spreadsheet_message_strips_google_sheets_url() -> None:
message = (
"tambah spreadsheet Progres Devisi IT Johan Garage "
"https://docs.google.com/spreadsheets/d/1AbCDefGhijKlmNOPqrstUVwxyz_1234567890/edit?gid=123#gid=123"
)
name, spreadsheet_id = parse_add_spreadsheet_message(message)
assert name == "Progres Devisi IT Johan Garage"
assert spreadsheet_id == "1AbCDefGhijKlmNOPqrstUVwxyz_1234567890"
def test_registry_adds_and_selects_active_spreadsheet(tmp_path: Path) -> None:
registry = SpreadsheetRegistry(settings_for_registry(tmp_path / "spreadsheets.json"))
entry = registry.add_entry("Stok Gudang", "1AbCDefGhijKlmNOPqrstUVwxyz_1234567890")
selected = registry.set_active_entry(12345, "stok gudang")
assert entry.key == "stokgudang"
assert selected.spreadsheet_id == entry.spreadsheet_id
assert registry.get_active_entry(12345) == entry
def test_registry_bootstraps_from_env_when_registry_is_empty(tmp_path: Path) -> None:
registry = SpreadsheetRegistry(
settings_for_registry(
tmp_path / "spreadsheets.json",
default_id="1DefaultGhijKlmNOPqrstUVwxyz_1234567890",
)
)
entries = registry.list_entries()
assert [entry.key for entry in entries] == ["default"]
assert registry.get_active_entry("new-chat") == entries[0]
def test_registry_uses_single_json_source_after_bootstrap(tmp_path: Path) -> None:
registry = SpreadsheetRegistry(
settings_for_registry(
tmp_path / "spreadsheets.json",
default_id="1DefaultGhijKlmNOPqrstUVwxyz_1234567890",
)
)
registry.list_entries()
registry.add_entry("Laporan Bulanan", "1ReportGhijKlmNOPqrstUVwxyz_1234567890")
entries = registry.list_entries()
assert [entry.key for entry in entries] == ["default", "laporanbulanan"]
def test_registry_deletes_entry_and_repoints_default_and_active(tmp_path: Path) -> None:
registry = SpreadsheetRegistry(
settings_for_registry(
tmp_path / "spreadsheets.json",
default_id="1DefaultGhijKlmNOPqrstUVwxyz_1234567890",
)
)
registry.list_entries()
second = registry.add_entry("Laporan Bulanan", "1ReportGhijKlmNOPqrstUVwxyz_1234567890")
registry.set_active_entry(12345, "default")
deleted = registry.delete_entry("default")
assert deleted.key == "default"
entries = registry.list_entries()
assert [entry.key for entry in entries] == [second.key]
assert registry.get_default_entry() == second
assert registry.get_active_entry(12345) == second
def test_format_spreadsheet_validation_error_for_office_file() -> None:
message = format_spreadsheet_validation_error(
Exception("This operation is not supported for this document. The document must not be an Office file.")
)
assert "excel/office" in message.lower()
assert "save as google sheets" in message.lower()