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()