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(); }