Bot & Automation

jorgasisten

/root/hermes-projects/jorgasisten

tests/test_formatters_read_answers.py text
from jorgasisten.schemas import SheetRow
from jorgasisten.services.formatters import build_exact_read_answer


def test_build_exact_read_answer_returns_yes_for_existence_question() -> None:
    rows = [SheetRow(sheet_name="Booking", row_number=2, values={"Nama": "Budi", "Status": "Booking"})]

    answer = build_exact_read_answer("ada booking atas nama Budi?", "Booking", rows)

    assert answer == "ada, pren."


def test_build_exact_read_answer_returns_location_only() -> None:
    rows = [SheetRow(sheet_name="Stok Gudang", row_number=4, values={"Produk": "Produk A", "Lokasi": "Rak B2"})]

    answer = build_exact_read_answer("Produk A berada di mana?", "Stok Gudang", rows)

    assert answer == "lokasinya di Rak B2, pren."


def test_build_exact_read_answer_returns_area_as_location_only() -> None:
    rows = [
        SheetRow(
            sheet_name="Lokasi Barang",
            row_number=8,
            values={"Nama Barang": "RX7", "Area": "Gudang Belakang"},
        )
    ]

    answer = build_exact_read_answer("RX7 ada di area mana?", "Lokasi Barang", rows)

    assert answer == "lokasinya di Gudang Belakang, pren."


def test_build_exact_read_answer_returns_unique_areas_for_multi_location_rows() -> None:
    rows = [
        SheetRow(
            sheet_name="Lokasi Barang",
            row_number=8,
            values={"Kode Barang": "001", "Nama Barang": "RX7", "Area": "Gudang Belakang", "Lemari": "A"},
        ),
        SheetRow(
            sheet_name="Lokasi Barang",
            row_number=9,
            values={"Kode Barang": "001", "Nama Barang": "RX7", "Area": "Gudang Depan", "Lemari": "B"},
        ),
    ]

    answer = build_exact_read_answer("RX7 ada di area mana?", "Lokasi Barang", rows)

    assert answer == (
        "Berdasarkan data pada tabel Lokasi Barang, berikut detail lokasi untuk barang RX7 (Kode Barang: 001):\n"
        "Area: Gudang Belakang\n"
        "Lemari A\n"
        "Area: Gudang Depan\n"
        "Lemari B"
    )


def test_build_exact_read_answer_prefers_stok_akhir_for_sisa_question() -> None:
    rows = [
        SheetRow(
            sheet_name="Stok Barang Total",
            row_number=12,
            values={
                "Kode Barang": "RX7-001",
                "Nama Barang": "RX7",
                "Stok Awal": "700",
                "Stok Akhir": "536",
            },
        )
    ]

    answer = build_exact_read_answer("sisa stok berapa?", "Stok Barang Total", rows)

    assert answer == "stoknya 536, pren."


def test_build_exact_read_answer_returns_grouped_location_detail_with_total() -> None:
    rows = [
        SheetRow(
            sheet_name="Lokasi Barang",
            row_number=8,
            values={
                "Kode Barang": "005-RX701382-12",
                "Nama Barang": "RX7 RACING PISTON KIT 64MM PIN 13 CASTING",
                "Area": "Gudang Belakang - Ruang Casting",
                "Lemari": "A",
                "Kondisi": "Mentah",
                "Kuantiti": "100",
            },
        ),
        SheetRow(
            sheet_name="Lokasi Barang",
            row_number=9,
            values={
                "Kode Barang": "005-RX701382-12",
                "Nama Barang": "RX7 RACING PISTON KIT 64MM PIN 13 CASTING",
                "Area": "Gudang Belakang - Ruang Casting",
                "Lemari": "G",
                "Kondisi": "Mentah",
                "Kuantiti": "100",
            },
        ),
        SheetRow(
            sheet_name="Lokasi Barang",
            row_number=10,
            values={
                "Kode Barang": "005-RX701382-12",
                "Nama Barang": "RX7 RACING PISTON KIT 64MM PIN 13 CASTING",
                "Area": "Gudang Belakang - Ruang Forged",
                "Lemari": "B7",
                "Kondisi": "Mentah",
                "Kuantiti": "51",
            },
        ),
    ]

    answer = build_exact_read_answer(
        "lokasi barang RX7 RACING PISTON KIT 64MM PIN 13 CASTING",
        "Lokasi Barang",
        rows,
    )

    assert answer == (
        "Berdasarkan data pada tabel Lokasi Barang, berikut detail lokasi untuk barang "
        "RX7 RACING PISTON KIT 64MM PIN 13 CASTING (Kode Barang: 005-RX701382-12):\n"
        "Area: Gudang Belakang - Ruang Casting\n"
        "Lemari A: Kuantiti 100 (Kondisi: Mentah)\n"
        "Lemari G: Kuantiti 100 (Kondisi: Mentah)\n"
        "Area: Gudang Belakang - Ruang Forged\n"
        "Lemari B7: Kuantiti 51 (Kondisi: Mentah)\n"
        "Total keseluruhan stok yang tercatat adalah 251."
    )


def test_build_exact_read_answer_asks_for_clarification_when_multiple_rows_found() -> None:
    rows = [
        SheetRow(sheet_name="Stok", row_number=2, values={"Produk": "Oli MPX 0.8L"}),
        SheetRow(sheet_name="Stok", row_number=3, values={"Produk": "Oli MPX 1L"}),
    ]

    answer = build_exact_read_answer("oli mpx yang mana?", "Stok", rows)

    assert "- Oli MPX 0.8L" in answer
    assert "- Oli MPX 1L" in answer


def test_build_exact_read_answer_returns_not_found_message() -> None:
    answer = build_exact_read_answer("status invoice INV-009 apa?", "Invoice", [])

    assert answer == "data belum ketemu, pren."


def test_build_exact_read_answer_returns_yes_for_multiple_existence_matches() -> None:
    rows = [
        SheetRow(sheet_name="Booking", row_number=2, values={"Nama": "Budi", "Status": "Booking"}),
        SheetRow(sheet_name="Booking", row_number=3, values={"Nama": "Budi Santoso", "Status": "Booking"}),
    ]

    answer = build_exact_read_answer("ada booking atas nama Budi?", "Booking", rows)

    assert answer == "ada, pren."