Skip to main content

browser_commander/core/
constants.rs

1//! Common constants used across the browser automation library.
2//!
3//! This module contains timing constants and Chrome arguments used for
4//! browser operations.
5
6use std::time::Duration;
7
8/// Common Chrome arguments used across both browser engines.
9///
10/// These arguments are used to configure Chrome/Chromium in a way that
11/// optimizes for automation and reduces user interruptions.
12pub const CHROME_ARGS: &[&str] = &[
13    "--disable-session-crashed-bubble",
14    "--hide-crash-restore-bubble",
15    "--disable-infobars",
16    "--no-first-run",
17    "--no-default-browser-check",
18    "--disable-crash-restore",
19];
20
21/// Timing constants for browser operations.
22///
23/// These durations are used throughout the library to control
24/// wait times, timeouts, and animation durations.
25#[derive(Debug, Clone, Copy)]
26pub struct Timing {
27    /// Wait time for scroll animations to complete.
28    pub scroll_animation_wait: Duration,
29    /// Default wait after scrolling to element.
30    pub default_wait_after_scroll: Duration,
31    /// Timeout for quick visibility checks.
32    pub visibility_check_timeout: Duration,
33    /// Default timeout for most operations.
34    pub default_timeout: Duration,
35    /// Default timeout for navigation operations.
36    pub navigation_timeout: Duration,
37    /// Default timeout for action verification.
38    pub verification_timeout: Duration,
39    /// Interval between verification retries.
40    pub verification_retry_interval: Duration,
41}
42
43impl Default for Timing {
44    fn default() -> Self {
45        Self {
46            scroll_animation_wait: Duration::from_millis(300),
47            default_wait_after_scroll: Duration::from_millis(1000),
48            visibility_check_timeout: Duration::from_millis(100),
49            default_timeout: Duration::from_millis(5000),
50            navigation_timeout: Duration::from_millis(30000),
51            verification_timeout: Duration::from_millis(3000),
52            verification_retry_interval: Duration::from_millis(100),
53        }
54    }
55}
56
57/// Default timing configuration.
58pub static TIMING: std::sync::LazyLock<Timing> = std::sync::LazyLock::new(Timing::default);
59
60#[cfg(test)]
61mod tests {
62    use super::*;
63
64    #[test]
65    fn chrome_args_is_not_empty() {
66        assert!(!CHROME_ARGS.is_empty());
67    }
68
69    #[test]
70    fn chrome_args_contains_expected_arguments() {
71        assert!(CHROME_ARGS.contains(&"--disable-infobars"));
72        assert!(CHROME_ARGS.contains(&"--no-first-run"));
73        assert!(CHROME_ARGS.contains(&"--no-default-browser-check"));
74    }
75
76    #[test]
77    fn chrome_args_contains_crash_related_flags() {
78        assert!(CHROME_ARGS.contains(&"--disable-session-crashed-bubble"));
79        assert!(CHROME_ARGS.contains(&"--hide-crash-restore-bubble"));
80        assert!(CHROME_ARGS.contains(&"--disable-crash-restore"));
81    }
82
83    #[test]
84    fn chrome_args_has_at_least_5_arguments() {
85        assert!(CHROME_ARGS.len() >= 5);
86    }
87
88    #[test]
89    fn timing_default_values_are_reasonable() {
90        let timing = Timing::default();
91
92        // All timeouts should be positive
93        assert!(timing.scroll_animation_wait > Duration::ZERO);
94        assert!(timing.default_wait_after_scroll > Duration::ZERO);
95        assert!(timing.visibility_check_timeout > Duration::ZERO);
96        assert!(timing.default_timeout > Duration::ZERO);
97        assert!(timing.navigation_timeout > Duration::ZERO);
98        assert!(timing.verification_timeout > Duration::ZERO);
99        assert!(timing.verification_retry_interval > Duration::ZERO);
100
101        // Navigation timeout should be longer than default timeout
102        assert!(timing.navigation_timeout > timing.default_timeout);
103    }
104
105    #[test]
106    fn timing_scroll_animation_wait_is_300ms() {
107        let timing = Timing::default();
108        assert_eq!(timing.scroll_animation_wait, Duration::from_millis(300));
109    }
110
111    #[test]
112    fn timing_default_wait_after_scroll_is_1000ms() {
113        let timing = Timing::default();
114        assert_eq!(
115            timing.default_wait_after_scroll,
116            Duration::from_millis(1000)
117        );
118    }
119
120    #[test]
121    fn timing_visibility_check_timeout_is_100ms() {
122        let timing = Timing::default();
123        assert_eq!(timing.visibility_check_timeout, Duration::from_millis(100));
124    }
125
126    #[test]
127    fn timing_default_timeout_is_5000ms() {
128        let timing = Timing::default();
129        assert_eq!(timing.default_timeout, Duration::from_millis(5000));
130    }
131
132    #[test]
133    fn timing_navigation_timeout_is_30000ms() {
134        let timing = Timing::default();
135        assert_eq!(timing.navigation_timeout, Duration::from_millis(30000));
136    }
137}