nigig-org/crates/apps/nigig-mpesa/tests/ui.rs

192 lines
7.3 KiB
Rust

use makepad_widgets::makepad_test::{makepad_test, Selector, TestApp};
#[makepad_test]
fn mpesa_app_loads(app: TestApp) {
app.locator(Selector::widget_type("Window")).wait_visible();
}
#[makepad_test]
fn mpesa_camera_widget_exists_in_tree(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
}
#[makepad_test]
fn mpesa_camera_close_button_exists(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_close")).wait_visible();
}
#[makepad_test]
fn mpesa_camera_capture_button_exists(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_capture")).wait_visible();
}
#[makepad_test]
fn mpesa_camera_thumbnail_exists(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("last_photo_thumbnail")).wait_visible();
}
#[makepad_test]
fn mpesa_camera_mode_buttons_exist(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_mode_photo")).wait_visible();
app.locator(Selector::id("btn_mode_video")).wait_visible();
}
#[makepad_test]
fn mpesa_camera_location_toggle_exists(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_geocam")).wait_visible();
}
#[makepad_test]
fn mpesa_camera_aspect_ratio_button_exists(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_aspect")).wait_visible();
app.locator(Selector::id("btn_aspect")).assert_text("Full");
}
#[makepad_test]
fn mpesa_camera_close_works(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_close")).click();
app.locator(Selector::id("camera_widget")).wait_hidden();
}
#[makepad_test]
fn mpesa_camera_switch_mode_to_video(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_mode_video")).click();
app.locator(Selector::id("hint_label")).wait_text("Tap to record");
}
#[makepad_test]
fn mpesa_camera_switch_mode_to_report(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_mode_report")).click();
app.locator(Selector::id("hint_label")).wait_text("Capture photos for report");
}
#[makepad_test]
fn mpesa_camera_switch_mode_to_scan(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_mode_scan")).click();
app.locator(Selector::id("hint_label")).wait_text("Position document in frame");
}
#[makepad_test]
fn mpesa_camera_switch_back_to_photo(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_mode_video")).click();
app.locator(Selector::id("btn_mode_photo")).click();
app.locator(Selector::id("hint_label")).wait_text("Tap to capture");
}
#[makepad_test]
fn mpesa_camera_location_toggle_shows_overlay(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_geocam")).click();
app.locator(Selector::id("address_value")).wait_visible();
// Location can be "Getting location..." or actual data
let addr = app.locator(Selector::id("address_value")).snapshot();
assert!(addr.text.unwrap_or_default().contains("---")
|| addr.text.unwrap_or_default().contains("Getting location")
|| addr.text.unwrap_or_default().contains(","));
}
#[makepad_test]
fn mpesa_camera_toggle_location_off(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_geocam")).click();
app.locator(Selector::id("address_value")).wait_visible();
// Toggle off
app.locator(Selector::id("btn_geocam")).click();
app.locator(Selector::id("address_value")).wait_hidden();
}
#[makepad_test]
fn mpesa_camera_aspect_ratio_selector_opens(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_aspect")).click();
app.locator(Selector::widget_type("CameraAspectButton")).wait_visible();
}
#[makepad_test]
fn mpesa_camera_select_aspect_ratio_4x3(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_aspect")).click();
app.locator(Selector::id("btn_ratio_4x3")).click();
app.locator(Selector::id("btn_aspect")).assert_text("4:3");
}
#[makepad_test]
fn mpesa_camera_select_aspect_ratio_16x9(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_aspect")).click();
app.locator(Selector::id("btn_ratio_16x9")).click();
app.locator(Selector::id("btn_aspect")).assert_text("16:9");
}
#[makepad_test]
fn mpesa_camera_select_aspect_ratio_1x1(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_aspect")).click();
app.locator(Selector::id("btn_ratio_1x1")).click();
app.locator(Selector::id("btn_aspect")).assert_text("1:1");
}
#[makepad_test]
fn mpesa_camera_select_aspect_ratio_full(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_aspect")).click();
app.locator(Selector::id("btn_ratio_full")).click();
app.locator(Selector::id("btn_aspect")).assert_text("Full");
}
#[makepad_test]
fn mpesa_camera_thumbnail_clickable(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("last_photo_thumbnail")).wait_visible();
// Clicking thumbnail with no captured photo should be harmless
app.locator(Selector::id("last_photo_thumbnail")).click();
// Camera should still be visible
app.locator(Selector::id("camera_widget")).wait_visible();
}
#[makepad_test]
fn mpesa_camera_debug_overlay_shows_status(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("debug_text")).wait_visible();
let debug = app.locator(Selector::id("debug_text")).snapshot();
assert!(debug.text.unwrap_or_default().contains("Camera"));
}
#[makepad_test]
fn mpesa_camera_mode_label_shows_correct_title(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("mode_label")).wait_visible();
let label = app.locator(Selector::id("mode_label")).snapshot();
assert_eq!(label.text.unwrap_or_default(), "Camera Photo");
}
#[makepad_test]
fn mpesa_camera_switch_to_receipt_via_code(app: TestApp) {
// This test verifies the camera opens with receipt mode
// The default mode is Receipt when opened from transaction flow
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("mode_label")).wait_visible();
let label = app.locator(Selector::id("mode_label")).snapshot();
// With transaction code, mode_label shows "Receipt Camera"
assert!(label.text.unwrap_or_default().contains("Camera"));
}
#[makepad_test]
fn mpesa_camera_flash_toggle_works(app: TestApp) {
app.locator(Selector::id("camera_widget")).wait_visible();
app.locator(Selector::id("btn_flash")).click();
// Flash toggle doesn't have visible state, but should not crash
app.locator(Selector::id("btn_flash")).click();
app.locator(Selector::id("camera_widget")).wait_visible();
}