viewpoint_test/expect/mod.rs
1//! Assertion API for browser automation tests.
2//!
3//! The `expect` function creates assertion builders for locators and pages,
4//! enabling fluent async assertions.
5//!
6//! # Example
7//!
8//! ```
9//! # #[cfg(feature = "integration")]
10//! # tokio_test::block_on(async {
11//! # use viewpoint_core::Browser;
12//! use viewpoint_test::{expect, expect_page};
13//! # let browser = Browser::launch().headless(true).launch().await.unwrap();
14//! # let context = browser.new_context().await.unwrap();
15//! # let page = context.new_page().await.unwrap();
16//! # page.goto("https://example.com").goto().await.unwrap();
17//!
18//! // Assert element is visible
19//! let locator = page.locator("h1");
20//! expect(&locator).to_be_visible().await.unwrap();
21//!
22//! // Assert text content
23//! expect(&locator).to_have_text("Example Domain").await.unwrap();
24//!
25//! // Assert page URL
26//! expect_page(&page).to_have_url("https://example.com/").await.unwrap();
27//! # });
28//! ```
29
30mod count;
31mod locator;
32mod locator_helpers;
33mod page;
34mod soft;
35mod soft_locator;
36mod soft_page;
37mod state;
38mod text;
39
40#[cfg(test)]
41mod tests;
42
43pub use locator::LocatorAssertions;
44pub use page::PageAssertions;
45pub use soft::{SoftAssertionError, SoftAssertions};
46pub use soft_locator::SoftLocatorAssertions;
47pub use soft_page::SoftPageAssertions;
48
49use viewpoint_core::{Locator, Page};
50
51/// Create assertions for a locator.
52///
53/// # Example
54///
55/// ```
56/// # #[cfg(feature = "integration")]
57/// # tokio_test::block_on(async {
58/// # use viewpoint_core::Browser;
59/// use viewpoint_test::expect;
60/// # let browser = Browser::launch().headless(true).launch().await.unwrap();
61/// # let context = browser.new_context().await.unwrap();
62/// # let page = context.new_page().await.unwrap();
63/// # page.goto("https://example.com").goto().await.unwrap();
64///
65/// let locator = page.locator("h1");
66/// expect(&locator).to_be_visible().await.unwrap();
67/// expect(&locator).to_have_text("Example Domain").await.unwrap();
68/// # });
69/// ```
70pub fn expect<'a>(locator: &'a Locator<'a>) -> LocatorAssertions<'a> {
71 LocatorAssertions::new(locator)
72}
73
74/// Create assertions for a page.
75///
76/// # Example
77///
78/// ```
79/// # #[cfg(feature = "integration")]
80/// # tokio_test::block_on(async {
81/// # use viewpoint_core::Browser;
82/// use viewpoint_test::expect_page;
83/// # let browser = Browser::launch().headless(true).launch().await.unwrap();
84/// # let context = browser.new_context().await.unwrap();
85/// # let page = context.new_page().await.unwrap();
86/// # page.goto("https://example.com").goto().await.unwrap();
87///
88/// expect_page(&page).to_have_url("https://example.com/").await.unwrap();
89/// expect_page(&page).to_have_title("Example Domain").await.unwrap();
90/// # });
91/// ```
92pub fn expect_page(page: &Page) -> PageAssertions<'_> {
93 PageAssertions::new(page)
94}
95
96/// Trait for creating assertions from different types.
97///
98/// This enables a unified `expect()` function that works with both
99/// locators and pages.
100pub trait Expectable<'a> {
101 /// The assertion builder type for this value.
102 type Assertions;
103
104 /// Create an assertion builder for this value.
105 fn assertions(&'a self) -> Self::Assertions;
106}
107
108impl<'a> Expectable<'a> for Locator<'a> {
109 type Assertions = LocatorAssertions<'a>;
110
111 fn assertions(&'a self) -> Self::Assertions {
112 LocatorAssertions::new(self)
113 }
114}
115
116impl<'a> Expectable<'a> for Page {
117 type Assertions = PageAssertions<'a>;
118
119 fn assertions(&'a self) -> Self::Assertions {
120 PageAssertions::new(self)
121 }
122}