browser_tester 2.0.0

Public browser_tester harness
Documentation
use browser_tester::Harness;

#[test]
fn builder_creates_empty_session_without_html() -> browser_tester::Result<()> {
    let harness = Harness::builder().build()?;
    assert_eq!(harness.debug().url(), "https://app.local/");
    assert_eq!(harness.debug().source_html(), None);
    assert_eq!(harness.debug().dom_node_count(), 1);
    Ok(())
}

#[test]
fn builder_keeps_url_html_and_local_storage_configuration() -> browser_tester::Result<()> {
    let mut harness = Harness::builder()
        .url("https://example.test/app")
        .html("<main id='app'></main>")
        .local_storage([("token", "abc"), ("theme", "light")])
        .build()?;

    assert_eq!(harness.debug().url(), "https://example.test/app");
    assert_eq!(
        harness.debug().source_html(),
        Some("<main id='app'></main>")
    );
    assert_eq!(
        harness
            .debug()
            .local_storage()
            .get("token")
            .map(String::as_str),
        Some("abc")
    );
    assert_eq!(harness.debug().dom_node_count(), 2);

    harness.advance_time(25)?;
    assert_eq!(harness.now_ms(), 25);

    harness
        .mocks_mut()
        .fetch()
        .respond_text("https://app.local/api/message", 200, "ok");
    assert_eq!(harness.mocks_mut().fetch().responses().len(), 1);
    Ok(())
}

#[test]
fn from_html_uses_default_url_and_records_source_html() -> browser_tester::Result<()> {
    let harness = Harness::from_html("<main id='app'></main>")?;

    assert_eq!(harness.debug().url(), "https://app.local/");
    assert_eq!(
        harness.debug().source_html(),
        Some("<main id='app'></main>")
    );
    assert_eq!(harness.debug().dom_node_count(), 2);
    Ok(())
}

#[test]
fn advance_time_rejects_negative_deltas() {
    let mut harness = Harness::builder().build().expect("builder should succeed");

    let error = harness
        .advance_time(-1)
        .expect_err("negative time deltas should fail");

    assert_eq!(
        error.to_string(),
        "Timer error: advance_time requires a non-negative delta"
    );
    assert_eq!(harness.now_ms(), 0);
}

#[test]
fn storage_seed_registry_is_available_through_the_mock_view() {
    let mut harness = Harness::builder().build().expect("builder should succeed");

    {
        let mut mocks = harness.mocks_mut();
        mocks
            .downloads()
            .capture("report.csv", b"downloaded bytes".to_vec());
        let storage = mocks.storage();
        storage.seed_local("token", "abc");
        storage.seed_session("session-token", "xyz");

        assert_eq!(
            storage.local().get("token").map(String::as_str),
            Some("abc")
        );
        assert_eq!(
            storage.session().get("session-token").map(String::as_str),
            Some("xyz")
        );
    }

    harness.mocks_mut().reset_all();
    assert!(harness.mocks_mut().storage().local().is_empty());
    assert!(harness.mocks_mut().storage().session().is_empty());
    assert!(harness.mocks_mut().downloads().artifacts().is_empty());
}

#[test]
fn builder_print_failure_seed_does_not_leak_into_local_storage() -> browser_tester::Result<()>
{
    let mut harness = Harness::builder().print_failure("print blocked").build()?;

    assert!(harness.debug().local_storage().is_empty());
    assert_eq!(harness.mocks_mut().print().calls().len(), 0);
    Ok(())
}

#[test]
fn builder_scroll_failure_seed_does_not_leak_into_local_storage() -> browser_tester::Result<()>
{
    let mut harness = Harness::builder()
        .scroll_failure("scroll blocked")
        .build()?;

    assert!(harness.debug().local_storage().is_empty());
    assert_eq!(harness.mocks_mut().scroll().calls().len(), 0);
    Ok(())
}

#[test]
fn builder_close_failure_seed_does_not_leak_into_local_storage() -> browser_tester::Result<()>
{
    let mut harness = Harness::builder().close_failure("window closed").build()?;

    assert!(harness.debug().local_storage().is_empty());
    assert_eq!(harness.mocks_mut().close().calls().len(), 0);
    Ok(())
}

#[test]
fn builder_open_failure_seed_does_not_leak_into_local_storage() -> browser_tester::Result<()> {
    let mut harness = Harness::builder().open_failure("popup blocked").build()?;

    assert!(harness.debug().local_storage().is_empty());
    assert_eq!(harness.mocks_mut().open().calls().len(), 0);
    Ok(())
}