#![cfg(feature = "integration")]
mod common;
use std::time::Duration;
use common::init_tracing;
use viewpoint_core::Browser;
#[tokio::test]
async fn test_user_data_dir_persistence() {
init_tracing();
let temp_dir = tempfile::tempdir().expect("Failed to create temp dir");
let user_data_path = temp_dir.path().to_path_buf();
{
let browser = Browser::launch()
.headless(true)
.user_data_dir(&user_data_path)
.timeout(Duration::from_secs(30))
.launch()
.await
.expect("Failed to launch first browser");
let context = browser
.new_context()
.await
.expect("Failed to create context");
let _page = context.new_page().await.expect("Failed to create page");
browser
.close()
.await
.expect("Failed to close first browser");
}
let entries_after_first: Vec<_> = std::fs::read_dir(&user_data_path)
.expect("Failed to read user data dir")
.collect();
tracing::info!(
"User data directory has {} entries after first session",
entries_after_first.len()
);
assert!(
!entries_after_first.is_empty(),
"Browser should create profile data in user data directory"
);
{
let browser = Browser::launch()
.headless(true)
.user_data_dir(&user_data_path)
.timeout(Duration::from_secs(30))
.launch()
.await
.expect("Failed to launch second browser with same profile");
assert!(browser.is_owned());
browser
.close()
.await
.expect("Failed to close second browser");
}
let entries_after_second: Vec<_> = std::fs::read_dir(&user_data_path)
.expect("Failed to read user data dir")
.collect();
tracing::info!(
"User data directory has {} entries after second session",
entries_after_second.len()
);
assert!(
!entries_after_second.is_empty(),
"Profile data should persist after second session"
);
}
#[tokio::test]
async fn test_user_data_dir_launch() {
init_tracing();
let temp_dir = tempfile::tempdir().expect("Failed to create temp dir");
let browser = Browser::launch()
.headless(true)
.user_data_dir(temp_dir.path())
.timeout(Duration::from_secs(30))
.launch()
.await
.expect("Failed to launch browser with user data dir");
assert!(browser.is_owned());
let entries: Vec<_> = std::fs::read_dir(temp_dir.path())
.expect("Failed to read user data dir")
.collect();
tracing::info!(
"User data directory contains {} entries after browser launch",
entries.len()
);
assert!(
!entries.is_empty(),
"Browser should create files in user data directory"
);
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_temp_user_data_dir_default() {
init_tracing();
let browser = Browser::launch()
.headless(true)
.timeout(Duration::from_secs(30))
.launch()
.await
.expect("Failed to launch browser with default temp profile");
assert!(browser.is_owned());
let context = browser
.new_context()
.await
.expect("Failed to create context");
let _page = context.new_page().await.expect("Failed to create page");
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_concurrent_browser_launches_no_conflict() {
init_tracing();
let (browser1_result, browser2_result) = tokio::join!(
Browser::launch()
.headless(true)
.timeout(Duration::from_secs(30))
.launch(),
Browser::launch()
.headless(true)
.timeout(Duration::from_secs(30))
.launch()
);
let browser1 = browser1_result.expect("Failed to launch first browser");
let browser2 = browser2_result.expect("Failed to launch second browser");
assert!(browser1.is_owned());
assert!(browser2.is_owned());
let _context1 = browser1
.new_context()
.await
.expect("Failed to create context in browser 1");
let _context2 = browser2
.new_context()
.await
.expect("Failed to create context in browser 2");
browser1.close().await.expect("Failed to close browser 1");
browser2.close().await.expect("Failed to close browser 2");
}
#[tokio::test]
async fn test_temp_directory_cleanup_on_close() {
init_tracing();
let browser = Browser::launch()
.headless(true)
.timeout(Duration::from_secs(30))
.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");
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_temp_directory_cleanup_on_drop() {
init_tracing();
{
let browser = Browser::launch()
.headless(true)
.timeout(Duration::from_secs(30))
.launch()
.await
.expect("Failed to launch browser");
assert!(browser.is_owned());
}
}
#[tokio::test]
async fn test_template_profile_copy() {
init_tracing();
let template_dir = tempfile::tempdir().expect("Failed to create template dir");
let test_file_path = template_dir.path().join("test_file.txt");
std::fs::write(&test_file_path, "template content").expect("Failed to write test file");
let sub_dir = template_dir.path().join("subdir");
std::fs::create_dir(&sub_dir).expect("Failed to create subdir");
std::fs::write(sub_dir.join("nested.txt"), "nested content")
.expect("Failed to write nested file");
let browser = Browser::launch()
.headless(true)
.user_data_dir_template_from(template_dir.path())
.timeout(Duration::from_secs(30))
.launch()
.await
.expect("Failed to launch browser with template profile");
assert!(browser.is_owned());
assert!(
test_file_path.exists(),
"Template test file should still exist"
);
assert!(
sub_dir.join("nested.txt").exists(),
"Template nested file should still exist"
);
let context = browser
.new_context()
.await
.expect("Failed to create context");
let _page = context.new_page().await.expect("Failed to create page");
browser.close().await.expect("Failed to close browser");
}
#[tokio::test]
async fn test_template_profile_nonexistent_path() {
init_tracing();
let result = Browser::launch()
.headless(true)
.user_data_dir_template_from("/nonexistent/path/to/template")
.timeout(Duration::from_secs(5))
.launch()
.await;
assert!(
result.is_err(),
"Should fail with non-existent template path"
);
let err = result.unwrap_err();
let err_msg = format!("{err}");
assert!(
err_msg.contains("does not exist"),
"Error should mention path does not exist: {err_msg}"
);
}