#![cfg(feature = "integration")]
use std::sync::Arc;
use std::sync::Once;
use std::sync::atomic::{AtomicU32, Ordering};
use std::time::Duration;
use viewpoint_core::Browser;
use viewpoint_js::js;
static TRACING_INIT: Once = Once::new();
fn init_tracing() {
TRACING_INIT.call_once(|| {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::from_default_env()
.add_directive(tracing::Level::INFO.into()),
)
.with_test_writer()
.try_init()
.ok();
});
}
#[tokio::test]
async fn test_context_route_propagation() {
init_tracing();
let browser = Browser::launch()
.headless(true)
.launch()
.await
.expect("Failed to launch browser");
let context = browser
.new_context()
.await
.expect("Failed to create context");
let call_count = Arc::new(AtomicU32::new(0));
let call_count_clone = call_count.clone();
context
.route("**/*.png", move |route| {
let count = call_count_clone.clone();
async move {
count.fetch_add(1, Ordering::SeqCst);
route.abort().await
}
})
.await
.expect("Failed to set context route");
let page1 = context.new_page().await.expect("Failed to create page 1");
page1
.set_content(
r#"
<html><body>
<img src="https://example.com/test.png" onerror="window.imgError = true">
</body></html>
"#,
)
.set()
.await
.expect("Failed to set content");
tokio::time::sleep(Duration::from_millis(300)).await;
assert!(
call_count.load(Ordering::SeqCst) >= 1,
"Context route should be applied to first page"
);
let page2 = context.new_page().await.expect("Failed to create page 2");
let count_before = call_count.load(Ordering::SeqCst);
page2
.set_content(
r#"
<html><body>
<img src="https://example.com/another.png" onerror="window.imgError = true">
</body></html>
"#,
)
.set()
.await
.expect("Failed to set content on page 2");
tokio::time::sleep(Duration::from_millis(300)).await;
assert!(
call_count.load(Ordering::SeqCst) > count_before,
"Context route should be applied to second page"
);
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_context_route_multiple_pages() {
init_tracing();
let browser = Browser::launch()
.headless(true)
.launch()
.await
.expect("Failed to launch browser");
let context = browser
.new_context()
.await
.expect("Failed to create context");
context
.route("**/api/**", |route| {
Box::pin(async move {
route
.fulfill()
.status(200)
.body("context intercepted")
.send()
.await?;
Ok(())
})
})
.await
.expect("Failed to set up context route");
let page1 = context.new_page().await.expect("Failed to create page1");
let page2 = context.new_page().await.expect("Failed to create page2");
page1
.goto("https://example.com")
.goto()
.await
.expect("Failed to navigate page1");
page2
.goto("https://example.com")
.goto()
.await
.expect("Failed to navigate page2");
let result1: String = page1
.evaluate(js! {
fetch("/api/test").then(r => r.text())
})
.await
.expect("Failed to fetch on page1");
assert_eq!(
result1, "context intercepted",
"Context route should work on page1"
);
let result2: String = page2
.evaluate(js! {
fetch("/api/test").then(r => r.text())
})
.await
.expect("Failed to fetch on page2");
assert_eq!(
result2, "context intercepted",
"Context route should work on page2"
);
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_wait_for_request() {
init_tracing();
let browser = Browser::launch()
.headless(true)
.launch()
.await
.expect("Failed to launch browser");
let context = browser
.new_context()
.await
.expect("Failed to create context");
let page = context.new_page().await.expect("Failed to create page");
page.goto("https://example.com")
.goto()
.await
.expect("Failed to navigate");
let _waiter = page.wait_for_request("**/api/**".to_string());
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_wait_for_response() {
init_tracing();
let browser = Browser::launch()
.headless(true)
.launch()
.await
.expect("Failed to launch browser");
let context = browser
.new_context()
.await
.expect("Failed to create context");
let page = context.new_page().await.expect("Failed to create page");
page.goto("https://example.com")
.goto()
.await
.expect("Failed to navigate");
let _waiter = page.wait_for_response("**/*".to_string());
browser.close().await.expect("Failed to close browser");
}