Bot & Automation

jorgasisten

/root/hermes-projects/jorgasisten

tests/test_bot_sheet_templates.py text
from jorgasisten.bot.main import (
    ACTION_ADD,
    ACTION_DELETE,
    ACTION_QUERY,
    ACTION_SUMMARY,
    ACTION_UPDATE,
    PendingTemplateContext,
    build_pending_template_decision,
    build_sheet_action_template,
)


def test_add_template_uses_real_headers() -> None:
    message = build_sheet_action_template(
        "Produk",
        ["Nama Produk", "Harga", "Stok"],
        [{"Nama Produk": "Oli MPX", "Harga": "50000", "Stok": "12"}],
        ["Nama Website / Proyek : Johan Garage | Periode : 2026"],
        {"Status": ["Belum", "Selesai"]},
        ACTION_ADD,
    )

    assert "tambah data ke sheet Produk" in message
    assert "- Nama Produk:" in message
    assert "- Harga:" in message
    assert "- Stok:" in message
    assert "Oli MPX" in message
    assert "contoh isi data yang sudah ada" in message
    assert "Johan Garage" not in message
    assert "Status: Belum, Selesai" in message
    assert "isi nilai setelah titik dua aja" in message


def test_update_template_has_target_and_new_data_sections() -> None:
    message = build_sheet_action_template(
        "Booking",
        ["Nama", "WA", "Motor", "Status"],
        [],
        [],
        {},
        ACTION_UPDATE,
    )

    assert "update data di sheet Booking" in message
    assert "target:" in message
    assert "data baru:" in message
    assert "- Nama:" in message
    assert "- Status:" in message


def test_query_delete_and_summary_templates_cover_expected_sections() -> None:
    query_message = build_sheet_action_template("Produk", ["SKU", "Nama Produk"], [], [], {}, ACTION_QUERY)
    delete_message = build_sheet_action_template("Produk", ["SKU", "Nama Produk"], [], [], {}, ACTION_DELETE)
    summary_message = build_sheet_action_template("Produk", ["SKU", "Nama Produk"], [], [], {}, ACTION_SUMMARY)

    assert "cari data di sheet Produk" in query_message
    assert "hapus data di sheet Produk" in delete_message
    assert "ringkas sheet Produk" in summary_message


def test_template_warns_when_sheet_has_no_headers() -> None:
    message = build_sheet_action_template("Kosong", [], [], [], {}, ACTION_ADD)

    assert "belum punya header kolom" in message


def test_pending_add_template_decision_reads_structured_fields() -> None:
    decision = build_pending_template_decision(
        "tambah data ke sheet Produk\n- Nama Produk: Oli MPX\n- Harga: 50000\n- Stok: 12",
        PendingTemplateContext(
            action=ACTION_ADD,
            spreadsheet_id="sheet-123",
            sheet_name="Produk",
            headers=["Nama Produk", "Harga", "Stok"],
        ),
    )

    assert decision is not None
    assert decision.operation == "create"
    assert decision.sheet_name == "Produk"
    assert decision.data == {"Nama Produk": "Oli MPX", "Harga": "50000", "Stok": "12"}