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"