diff --git a/moli-core/tests/history_child_joint.rs b/moli-core/tests/history_child_joint.rs new file mode 100644 index 0000000000..b92f820b85 --- /dev/null +++ b/moli-core/tests/history_child_joint.rs @@ -0,0 +1,113 @@ +use anyhow::Result; +use moli_core::runtime::{Browser, BrowserConfig}; +use moli_test_support::FixtureServer; +use tokio::time::Duration; +use url::Url; + +fn markup_url(server: &FixtureServer, markup: &str) -> String { + let mut url = Url::parse(&server.url("/compat/child-dynamic-markup-document")).unwrap(); + url.query_pairs_mut().append_pair("markup", markup); + url.into() +} + +#[tokio::test(flavor = "multi_thread")] +async fn top_level_back_skips_replaced_initial_child_entries() -> Result<()> { + let server = FixtureServer::spawn().await?; + for (replace, blank_predecessor) in [(false, false), (true, false), (true, true)] { + let browser = Browser::new(BrowserConfig::default())?; + let destination = server.url("/static?replacement"); + let source = if replace { + markup_url( + &server, + &format!( + "", + serde_json::to_string(&destination)? + ), + ) + } else { + destination.clone() + }; + let previous = if blank_predecessor { + "about:blank".to_owned() + } else { + server.url("/static?sentinel-start") + }; + let markup = format!( + r#"
"#, + serde_json::to_string(&previous)?, + serde_json::to_string(&destination)?, + serde_json::to_string(&source)?.replace("", "<\\/script>") + ); + let result = tokio::time::timeout(Duration::from_secs(10), async { + let mut page = browser.fetch(&markup_url(&server, &markup)).await?; + page.evaluate_runtime_expression_with_await_async( + "finished.then(value => JSON.stringify(value))", + true, + ) + .await + }) + .await??; + let result: serde_json::Value = serde_json::from_str( + result["value"] + .as_str() + .expect("joint history traversal result"), + )?; + assert_eq!( + result, + serde_json::json!({ + "unchangedLength": true, + "sentinelURL": previous, + "otherURL": destination, + "sentinelIndex": u32::from(blank_predecessor), + "otherIndex": 0 + }), + "replace={replace}, blank_predecessor={blank_predecessor}" + ); + } + server.shutdown().await; + Ok(()) +}