nigig-org/crates/apps/nigig-mpesa/tests/ui.rs
andodeki ac8f8aa002
Some checks failed
repo hygiene / hygiene (push) Has been cancelled
PDF engine / engine (push) Has been cancelled
PDF engine / makepad-integration (push) Has been cancelled
PDF engine / fuzz (push) Has been cancelled
nigig-build (CAD) / supply-chain (push) Has been cancelled
nigig-build (CAD) / cad-module (push) Has been cancelled
nigig-build (CAD) / full-crate-check (push) Has been cancelled
nigig-build (CAD) / cad-engine-coverage (push) Has been cancelled
nigig-build (CAD) / doc-workspace-coverage (push) Has been cancelled
nigig-build (CAD) / cad-widget-coverage (push) Has been cancelled
traffic / gates (push) Has been cancelled
traffic / nigig-traffic (push) Has been cancelled
traffic / supply-chain (push) Has been cancelled
doc-engine / engine (push) Has been cancelled
doc-engine / coverage (push) Has been cancelled
doc-engine / consumer (push) Has been cancelled
email / gates (push) Has been cancelled
email / email-domain (push) Has been cancelled
email / nigig-email (push) Has been cancelled
email / supply-chain (push) Has been cancelled
nigig-map / test (push) Has been cancelled
sms / gates (push) Has been cancelled
sms / robius-sms (push) Has been cancelled
sms / android (push) Has been cancelled
sms / nigig-sms (push) Has been cancelled
sms / supply-chain (push) Has been cancelled
spreadsheet / engine-coverage (push) Has been cancelled
spreadsheet / ui-controller-coverage (push) Has been cancelled
p2p-intel / engine (push) Has been cancelled
p2p-intel / notifications (push) Has been cancelled
p2p-intel / coverage (push) Has been cancelled
p2p-intel / makepad-app (push) Has been cancelled
p2p-intel / exchange-tab (push) Has been cancelled
Payment domain, storage, platform and UI / isolated-payment-tests (push) Has been cancelled
Payment domain, storage, platform and UI / payment-ui-tests (push) Has been cancelled
chore: sync full working tree to gitdab
Whole-tree sync: cad-core/cad-ui split sources, nigig-build
construction_frame migration, pdf port progress, mpesa/pay/uikit/doc
updates, workspace members/profiles/lock, CI workflows and reviews.
See individual file history for details.
2026-09-12 07:15:24 +03:00

192 lines
7.3 KiB
Rust

use 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.as_deref().unwrap_or_default().contains("---")
|| addr.text.as_deref().unwrap_or_default().contains("Getting location")
|| addr.text.as_deref().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();
}