Bot & Automation

jorgasisten

/root/hermes-projects/jorgasisten

tests/test_bot_keyboards.py text
from jorgasisten.bot.keyboards import (
    CALLBACK_CONFIRM_EDIT,
    CALLBACK_HOME_MENU_ADD,
    CALLBACK_HOME_MENU_CHAT,
    CALLBACK_HOME_MENU_SPREADSHEETS,
    CALLBACK_HOME_MENU_UPDATE,
    CALLBACK_SETTINGS_MENU_ACTIVE,
    CALLBACK_SETTINGS_MENU_CLEAR,
    CALLBACK_SETTINGS_MENU_STATUS,
    CALLBACK_SHEET_ACTION_PREFIX,
    CALLBACK_SHEET_MENU_CREATE,
    CALLBACK_SHEET_MENU_DELETE,
    CALLBACK_SHEET_MENU_LIST,
    CALLBACK_SPREADSHEET_DEFAULT_PREFIX,
    CALLBACK_SPREADSHEET_DELETE_PREFIX,
    CALLBACK_SPREADSHEET_MENU_ACTIVE,
    CALLBACK_SPREADSHEET_MENU_DEFAULT,
    CALLBACK_SPREADSHEET_MENU_DELETE,
    CALLBACK_SPREADSHEET_MENU_LIST,
    CALLBACK_SPREADSHEET_MENU_SELECT,
    CALLBACK_SPREADSHEET_SELECT_PREFIX,
    create_review_keyboard,
    home_menu_inline_keyboard,
    home_menu_inline_keyboard_for_role,
    main_menu_keyboard_for_role,
    settings_inline_keyboard,
    settings_inline_keyboard_for_role,
    sheet_action_keyboard,
    sheet_tools_inline_keyboard,
    spreadsheet_delete_keyboard,
    spreadsheet_select_keyboard,
    spreadsheet_tools_inline_keyboard,
)
from jorgasisten.services.spreadsheet_registry import SpreadsheetEntry


def test_spreadsheet_select_keyboard_marks_active_entry() -> None:
    entries = [
        SpreadsheetEntry(
            key="default",
            name="Jorgasisten Testing",
            spreadsheet_id="1DefaultGhijKlmNOPqrstUVwxyz_1234567890",
            created_at="2026-07-04 00:00:00 UTC",
        ),
        SpreadsheetEntry(
            key="chatbotjohangarage",
            name="Chatbot Johan Garage",
            spreadsheet_id="1ReportGhijKlmNOPqrstUVwxyz_1234567890",
            created_at="2026-07-04 00:00:00 UTC",
        ),
    ]

    keyboard = spreadsheet_select_keyboard(entries, active_key="chatbotjohangarage")

    assert keyboard.inline_keyboard[0][0].callback_data == f"{CALLBACK_SPREADSHEET_SELECT_PREFIX}default"
    assert keyboard.inline_keyboard[1][0].callback_data == f"{CALLBACK_SPREADSHEET_SELECT_PREFIX}chatbotjohangarage"
    assert keyboard.inline_keyboard[1][0].text.startswith("[Aktif]")


def test_spreadsheet_default_keyboard_marks_default_entry() -> None:
    entries = [
        SpreadsheetEntry(
            key="default",
            name="Jorgasisten Testing",
            spreadsheet_id="1DefaultGhijKlmNOPqrstUVwxyz_1234567890",
            created_at="2026-07-04 00:00:00 UTC",
        ),
        SpreadsheetEntry(
            key="chatbotjohangarage",
            name="Chatbot Johan Garage",
            spreadsheet_id="1ReportGhijKlmNOPqrstUVwxyz_1234567890",
            created_at="2026-07-04 00:00:00 UTC",
        ),
    ]

    keyboard = spreadsheet_select_keyboard(entries, default_key="default", mode="default")

    assert keyboard.inline_keyboard[0][0].callback_data == f"{CALLBACK_SPREADSHEET_DEFAULT_PREFIX}default"
    assert keyboard.inline_keyboard[0][0].text.startswith("[Default]")


def test_sheet_action_keyboard_uses_action_and_index_callback() -> None:
    keyboard = sheet_action_keyboard(["Booking", "Produk"], action="add")

    assert keyboard.inline_keyboard[0][0].callback_data == f"{CALLBACK_SHEET_ACTION_PREFIX}add:0"
    assert keyboard.inline_keyboard[1][0].callback_data == f"{CALLBACK_SHEET_ACTION_PREFIX}add:1"
    assert keyboard.inline_keyboard[0][0].text == "Booking"


def test_spreadsheet_tools_inline_keyboard_exposes_chat_actions() -> None:
    keyboard = spreadsheet_tools_inline_keyboard()

    assert keyboard.inline_keyboard[0][0].callback_data == CALLBACK_SPREADSHEET_MENU_ACTIVE
    assert keyboard.inline_keyboard[0][1].callback_data == CALLBACK_SPREADSHEET_MENU_LIST
    assert keyboard.inline_keyboard[1][1].callback_data == CALLBACK_SPREADSHEET_MENU_SELECT
    assert keyboard.inline_keyboard[2][0].callback_data == CALLBACK_SPREADSHEET_MENU_DEFAULT
    assert keyboard.inline_keyboard[3][0].callback_data == CALLBACK_SPREADSHEET_MENU_DELETE


def test_spreadsheet_tools_inline_keyboard_hides_default_when_not_allowed() -> None:
    keyboard = spreadsheet_tools_inline_keyboard(can_set_default=False)

    callbacks = [button.callback_data for row in keyboard.inline_keyboard for button in row]
    assert CALLBACK_SPREADSHEET_MENU_DEFAULT not in callbacks


def test_home_menu_inline_keyboard_exposes_main_shortcuts() -> None:
    keyboard = home_menu_inline_keyboard()

    assert keyboard.inline_keyboard[0][0].callback_data == CALLBACK_HOME_MENU_ADD
    assert keyboard.inline_keyboard[0][1].callback_data == CALLBACK_HOME_MENU_UPDATE
    assert keyboard.inline_keyboard[2][0].callback_data == CALLBACK_HOME_MENU_SPREADSHEETS


def test_home_menu_for_viewer_hides_write_and_admin_shortcuts() -> None:
    keyboard = home_menu_inline_keyboard_for_role("viewer")

    callbacks = [button.callback_data for row in keyboard.inline_keyboard for button in row]
    assert CALLBACK_HOME_MENU_ADD not in callbacks
    assert CALLBACK_HOME_MENU_SPREADSHEETS not in callbacks
    assert CALLBACK_HOME_MENU_CHAT not in callbacks


def test_settings_inline_keyboard_exposes_setting_shortcuts() -> None:
    keyboard = settings_inline_keyboard()

    assert keyboard.inline_keyboard[0][0].callback_data == CALLBACK_SETTINGS_MENU_ACTIVE
    assert keyboard.inline_keyboard[0][1].callback_data == CALLBACK_SETTINGS_MENU_STATUS
    assert keyboard.inline_keyboard[2][0].callback_data == CALLBACK_SPREADSHEET_MENU_DELETE
    assert keyboard.inline_keyboard[2][1].callback_data == CALLBACK_SETTINGS_MENU_CLEAR


def test_settings_keyboard_for_operator_is_limited() -> None:
    keyboard = settings_inline_keyboard_for_role("operator")

    callbacks = [button.callback_data for row in keyboard.inline_keyboard for button in row]
    assert CALLBACK_SETTINGS_MENU_STATUS in callbacks
    assert CALLBACK_SPREADSHEET_MENU_DELETE not in callbacks


def test_main_menu_keyboard_for_operator_hides_admin_buttons() -> None:
    keyboard = main_menu_keyboard_for_role("operator")

    labels = [button.text for row in keyboard.keyboard for button in row]
    assert "🗑️ Hapus Data" not in labels
    assert "📚 Spreadsheet" not in labels


def test_create_review_keyboard_exposes_save_edit_cancel() -> None:
    keyboard = create_review_keyboard()

    callbacks = [button.callback_data for button in keyboard.inline_keyboard[0]]
    assert CALLBACK_CONFIRM_EDIT in callbacks


def test_sheet_tools_inline_keyboard_exposes_sheet_shortcuts() -> None:
    keyboard = sheet_tools_inline_keyboard()

    assert keyboard.inline_keyboard[0][0].callback_data == CALLBACK_SHEET_MENU_LIST
    assert keyboard.inline_keyboard[0][1].callback_data == CALLBACK_SHEET_MENU_CREATE
    assert keyboard.inline_keyboard[2][0].callback_data == CALLBACK_SHEET_MENU_DELETE


def test_spreadsheet_delete_keyboard_uses_delete_prefix() -> None:
    entries = [
        SpreadsheetEntry(
            key="default",
            name="Jorgasisten Testing",
            spreadsheet_id="1DefaultGhijKlmNOPqrstUVwxyz_1234567890",
            created_at="2026-07-04 00:00:00 UTC",
        )
    ]

    keyboard = spreadsheet_delete_keyboard(entries, active_key="default")

    assert keyboard.inline_keyboard[0][0].callback_data == f"{CALLBACK_SPREADSHEET_DELETE_PREFIX}default"