Skip to main content

victauri_test/
lib.rs

1#![deny(missing_docs)]
2//! Integration testing for Tauri apps via the Victauri MCP server.
3//!
4//! Provides [`TestApp`] for managed app lifecycle and [`VictauriClient`] with
5//! Playwright-style interactions (`click_by_text`, `fill_by_id`, `expect_text`)
6//! plus assertion helpers for accessibility, performance, and state verification.
7//!
8//! # Quick Start
9//!
10//! ```rust,ignore
11//! use victauri_test::TestApp;
12//!
13//! #[tokio::test]
14//! async fn greet_flow() {
15//!     let app = TestApp::spawn("cargo run -p my-app").await.unwrap();
16//!     let mut client = app.client().await.unwrap();
17//!
18//!     client.fill_by_id("name-input", "World").await.unwrap();
19//!     client.click_by_id("greet-btn").await.unwrap();
20//!     client.expect_text("Hello, World!").await.unwrap();
21//! }
22//! ```
23//!
24//! # Without `TestApp` (connect to existing server)
25//!
26//! ```rust,ignore
27//! use victauri_test::VictauriClient;
28//!
29//! #[tokio::test]
30//! async fn check_health() {
31//!     let mut client = VictauriClient::discover().await.unwrap();
32//!     let audit = client.audit_accessibility().await.unwrap();
33//!     assert_eq!(audit["summary"]["violations"], 0);
34//! }
35//! ```
36
37mod app;
38mod assertions;
39mod client;
40pub mod coverage;
41mod discovery;
42mod error;
43pub mod prelude;
44pub mod reporting;
45pub mod smoke;
46pub mod visual;
47
48pub use app::TestApp;
49pub use assertions::{
50    CheckResult, VerifyBuilder, VerifyReport, assert_ipc_called, assert_ipc_called_with,
51    assert_ipc_not_called,
52};
53pub use client::{
54    MemoryStats, PluginInfo, VictauriClient, WaitForBuilder, assert_ipc_healthy, assert_json_eq,
55    assert_json_truthy, assert_no_a11y_violations, assert_performance_budget, assert_state_matches,
56};
57pub use error::TestError;
58pub use smoke::{SmokeCheckResult, SmokeConfig, SmokeReport};
59
60/// Returns `true` if E2E tests should run (i.e., `VICTAURI_E2E` env var is set).
61///
62/// Use this to gate integration tests that require a running Tauri app:
63///
64/// ```rust,ignore
65/// #[tokio::test]
66/// async fn my_test() {
67///     if !victauri_test::is_e2e() { return; }
68///     // ...
69/// }
70/// ```
71#[must_use]
72pub fn is_e2e() -> bool {
73    std::env::var("VICTAURI_E2E").is_ok()
74}
75
76/// Connect to a Victauri server using standard env var configuration.
77///
78/// Reads `VICTAURI_PORT` (default 7373) and `VICTAURI_AUTH_TOKEN` (optional).
79/// This is a shorthand for `VictauriClient::discover()`.
80///
81/// # Errors
82///
83/// Returns [`TestError::Connection`] if the server is unreachable.
84pub async fn connect() -> Result<VictauriClient, TestError> {
85    VictauriClient::discover().await
86}
87
88/// Declare an E2E test that auto-skips when `VICTAURI_E2E` is not set
89/// and auto-connects to the running server.
90///
91/// # Example
92///
93/// ```rust,ignore
94/// use victauri_test::{e2e_test, VictauriClient};
95///
96/// e2e_test!(greet_flow, |client: &mut VictauriClient| async move {
97///     client.fill_by_id("name-input", "World").await.unwrap();
98///     client.click_by_id("greet-btn").await.unwrap();
99///     client.expect_text("Hello, World!").await.unwrap();
100/// });
101/// ```
102#[macro_export]
103macro_rules! e2e_test {
104    ($name:ident, |$client:ident : &mut VictauriClient| async move $body:block) => {
105        #[tokio::test]
106        async fn $name() {
107            if !$crate::is_e2e() {
108                return;
109            }
110            let mut $client = $crate::connect().await.unwrap();
111            $body
112        }
113    };
114    ($name:ident, |$client:ident| async move $body:block) => {
115        #[tokio::test]
116        async fn $name() {
117            if !$crate::is_e2e() {
118                return;
119            }
120            let mut $client = $crate::connect().await.unwrap();
121            $body
122        }
123    };
124}