use islands_build::patch::{patch_page_source, rewrite_basenames_in_js, PATCH_TOKEN};
const FAKE_PAGE_JS: &str = r#"
let wasm;
const importObject = {
"/static/islands-core/islands_core.js": import1,
"__wbindgen_placeholder__": import1,
};
const url = new URL('page_home_bg.wasm', import.meta.url);
import * as import1 from "/static/islands-core/islands_core.js";
"#;
fn rename_map() -> Vec<(String, String)> {
vec![
(
"islands_core.js".to_owned(),
"islands_core.a1b2c3d4.js".to_owned(),
),
(
"page_home_bg.wasm".to_owned(),
"page_home.cafef00d_bg.wasm".to_owned(),
),
]
}
#[test]
fn patch_token_appears_after_debug_patch() {
let patched = patch_page_source(FAKE_PAGE_JS);
assert!(
patched.contains(PATCH_TOKEN),
"debug-patched JS must contain the patch token. Got:\n{patched}"
);
assert!(
!patched.contains("\"/static/islands-core/islands_core.js\": import1,"),
"pre-patch needle must be replaced. Got:\n{patched}"
);
}
#[test]
fn patch_token_survives_release_hashing_rewrite() {
let after_patch = patch_page_source(FAKE_PAGE_JS);
let after_hash = rewrite_basenames_in_js(&after_patch, &rename_map());
assert!(
after_hash.contains(PATCH_TOKEN),
"release-hashed JS must still contain the patch token. Got:\n{after_hash}"
);
let expected_key_line = format!(r#""/static/islands-core/islands_core.js": {PATCH_TOKEN}"#);
assert!(
after_hash.contains(&expected_key_line),
"importObject key for islands_core.js must remain unhashed. Got:\n{after_hash}"
);
let expected_import_line =
r#"import * as import1 from "/static/islands-core/islands_core.a1b2c3d4.js""#;
assert!(
after_hash.contains(expected_import_line),
"bare import specifier must be rewritten to the hashed basename. Got:\n{after_hash}"
);
assert!(
after_hash.contains("page_home.cafef00d_bg.wasm"),
"new URL('page_home_bg.wasm', ...) must be rewritten. Got:\n{after_hash}"
);
}
#[test]
fn already_patched_source_is_idempotent() {
let patched_once = patch_page_source(FAKE_PAGE_JS);
let patched_twice = patch_page_source(&patched_once);
assert_eq!(
patched_once, patched_twice,
"patch_page_source must be idempotent"
);
}