#![cfg(feature = "integration")]
mod common;
use std::time::Duration;
use viewpoint_core::{Browser, DocumentLoadState};
use viewpoint_js::js;
use common::init_tracing;
#[tokio::test]
async fn test_navigation_on_closed_page() {
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 mut page = context.new_page().await.expect("Failed to create page");
page.close().await.expect("Failed to close page");
assert!(page.is_closed());
let result = page.goto("https://example.com").goto().await;
assert!(result.is_err(), "Navigation on closed page should fail");
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_basic_navigation() {
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");
let response = page
.goto("https://example.com")
.goto()
.await
.expect("Failed to navigate");
assert!(
response.url() == "https://example.com" || response.url() == "https://example.com/",
"Expected URL to be example.com, got: {}",
response.url()
);
assert!(!response.frame_id().is_empty());
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_navigation_dom_content_loaded() {
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");
let response = page
.goto("https://example.com")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
assert!(
response.url() == "https://example.com" || response.url() == "https://example.com/",
"Expected URL to be example.com, got: {}",
response.url()
);
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_navigation_with_timeout() {
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");
let response = page
.goto("https://example.com")
.timeout(Duration::from_secs(60))
.goto()
.await
.expect("Failed to navigate");
assert!(
response.url() == "https://example.com" || response.url() == "https://example.com/",
"Expected URL to be example.com, got: {}",
response.url()
);
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_navigation_with_referer() {
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");
let response = page
.goto("https://httpbin.org/headers")
.referer("https://google.com")
.wait_until(DocumentLoadState::Load)
.goto()
.await
.expect("Failed to navigate");
assert!(response.url().contains("httpbin.org"));
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_navigation_back_forward() {
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")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate to first page");
let first_url = page.url().await.expect("Failed to get first URL");
assert!(first_url.contains("example.com"));
page.goto("https://httpbin.org/html")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate to second page");
let second_url = page.url().await.expect("Failed to get second URL");
assert!(second_url.contains("httpbin.org"));
let back_response = page.go_back().await.expect("Failed to go back");
assert!(back_response.is_some(), "Go back should have a response");
tokio::time::sleep(Duration::from_millis(500)).await;
let back_url = page.url().await.expect("Failed to get URL after back");
assert!(
back_url.contains("example.com"),
"Should be back to first page"
);
let forward_response = page.go_forward().await.expect("Failed to go forward");
assert!(
forward_response.is_some(),
"Go forward should have a response"
);
tokio::time::sleep(Duration::from_millis(500)).await;
let forward_url = page.url().await.expect("Failed to get URL after forward");
assert!(
forward_url.contains("httpbin.org"),
"Should be forward to second page"
);
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_page_reload() {
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")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let url_before = page.url().await.expect("Failed to get URL");
let _: serde_json::Value = page
.evaluate(js! { window.testMarker = "set" })
.await
.expect("Failed to set marker");
let marker_before: String = page
.evaluate(js! { window.testMarker || "" })
.await
.expect("Failed to get marker before reload");
assert_eq!(marker_before, "set", "Marker should be set");
let _response = page.reload().await.expect("Failed to reload");
tokio::time::sleep(Duration::from_millis(500)).await;
let url_after = page.url().await.expect("Failed to get URL after reload");
assert_eq!(url_before, url_after);
let marker_after: String = page
.evaluate(js! { window.testMarker || "" })
.await
.expect("Failed to get marker after reload");
assert_eq!(marker_after, "", "Marker should be cleared after reload");
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_go_back_no_history() {
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");
let result = page.go_back().await.expect("go_back should not error");
assert!(
result.is_none(),
"Go back with no history should return None"
);
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_go_forward_no_history() {
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")
.wait_until(DocumentLoadState::DomContentLoaded)
.goto()
.await
.expect("Failed to navigate");
let result = page
.go_forward()
.await
.expect("go_forward should not error");
assert!(
result.is_none(),
"Go forward with no forward history should return None"
);
browser.close().await.expect("Failed to close browser");
}