1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//! 

use js_sys::Array;
use wasm_bindgen::{prelude::Closure, JsValue};

/// Mocks the current window label
/// In non-tauri context it is required to call this function///before* using the `@tauri-apps/api/window` module.
///
/// This function only mocks the *presence* of a window,
/// window properties (e.g. width and height) can be mocked like regular IPC calls using the `mockIPC` function.
pub fn mock_window(current: &str) {
    inner::mockWindows(current, JsValue::UNDEFINED)
}

/// Mocks many window labels.
/// In non-tauri context it is required to call this function///before* using the `@tauri-apps/api/window` module.
///
/// This function only mocks the *presence* of windows,
/// window properties (e.g. width and height) can be mocked like regular IPC calls using the `mockIPC` function.
///
/// @param current Label of window this JavaScript context is running in.
/// @param additionalWindows Label of additional windows the app has.
pub fn mock_windows(current: &str, additional_windows: &[&str]) {
    inner::mockWindows(
        current,
        Array::from_iter(additional_windows.iter().map(|str| JsValue::from_str(str))).into(),
    )
}

/// Intercepts all IPC requests with the given mock handler.
///
/// This function can be used when testing tauri frontend applications or when running the frontend in a Node.js context during static site generation.
pub fn mock_ipc<H, R, E>(mut handler: H)
where
    H: FnMut(String, JsValue) -> Result<R, E> + 'static,
    R: Into<JsValue>,
    E: Into<JsValue>,
{
    let closure = Closure::<dyn FnMut(String, JsValue) -> Result<JsValue, JsValue>>::new(
        move |cmd, payload| (handler)(cmd, payload).map(Into::into).map_err(Into::into),
    );

    inner::mockIPC(&closure);

    closure.forget();
}

/// Clears mocked functions/data injected by the other functions in this module.
/// When using a test runner that doesn't provide a fresh window object for each test, calling this function will reset tauri specific properties.
pub fn clear_mocks() {
    inner::clearMocks()
}

mod inner {
    use wasm_bindgen::{
        prelude::{wasm_bindgen, Closure},
        JsValue,
    };

    #[wasm_bindgen(module = "/src/mocks.js")]
    extern "C" {
        #[wasm_bindgen(variadic)]
        pub fn mockWindows(current: &str, rest: JsValue);
        pub fn mockIPC(handler: &Closure<dyn FnMut(String, JsValue) -> Result<JsValue, JsValue>>);
        pub fn clearMocks();
    }
}