@@ -13073,11 +13073,31 @@ fn live_cyclic_diverse_page_read_noop_preserves_notion() {
1307313073 "missing {expected:?}\n{markdown}"
1307413074 );
1307513075 }
13076- assert_local_image_markdown(&markdown, "Cyclic image");
13077- assert_local_media_link_markdown(&markdown, "Cyclic video");
13078- assert_local_media_link_markdown(&markdown, "Cyclic file");
13079- assert_local_media_link_markdown(&markdown, "Cyclic PDF");
13080- assert_local_media_link_markdown(&markdown, "Cyclic audio");
13076+ assert_external_image_markdown(
13077+ &markdown,
13078+ "Cyclic image",
13079+ "https://www.w3.org/Icons/w3c_home.png",
13080+ );
13081+ assert_external_media_link_markdown(
13082+ &markdown,
13083+ "Cyclic video",
13084+ "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
13085+ );
13086+ assert_external_media_link_markdown(
13087+ &markdown,
13088+ "Cyclic file",
13089+ "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
13090+ );
13091+ assert_external_media_link_markdown(
13092+ &markdown,
13093+ "Cyclic PDF",
13094+ "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
13095+ );
13096+ assert_external_media_link_markdown(
13097+ &markdown,
13098+ "Cyclic audio",
13099+ "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3",
13100+ );
1308113101 assert!(
1308213102 !markdown.contains("type=link_to_page"),
1308313103 "link_to_page should render as a Markdown link, not a directive:\n{markdown}"
@@ -13493,11 +13513,31 @@ fn live_cyclic_supported_block_edits_push_and_verify_notion() {
1349313513 "missing {expected:?}\n{verified}"
1349413514 );
1349513515 }
13496- assert_local_image_markdown(&verified, "Editable image changed");
13497- assert_local_media_link_markdown(&verified, "Editable video changed");
13498- assert_local_media_link_markdown(&verified, "Editable file changed");
13499- assert_local_media_link_markdown(&verified, "Editable PDF changed");
13500- assert_local_media_link_markdown(&verified, "Editable audio changed");
13516+ assert_external_image_markdown(
13517+ &verified,
13518+ "Editable image changed",
13519+ "https://www.w3.org/Icons/w3c_home.png",
13520+ );
13521+ assert_external_media_link_markdown(
13522+ &verified,
13523+ "Editable video changed",
13524+ "https://www.youtube.com/watch?v=oHg5SJYRHA0",
13525+ );
13526+ assert_external_media_link_markdown(
13527+ &verified,
13528+ "Editable file changed",
13529+ "https://www.orimi.com/pdf-test.pdf",
13530+ );
13531+ assert_external_media_link_markdown(
13532+ &verified,
13533+ "Editable PDF changed",
13534+ "https://www.orimi.com/pdf-test.pdf",
13535+ );
13536+ assert_external_media_link_markdown(
13537+ &verified,
13538+ "Editable audio changed",
13539+ "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3",
13540+ );
1350113541}
1350213542
1350313543#[test]
@@ -13837,23 +13877,27 @@ fn live_local_image_media_edit_uploads_and_reconciles_bytes() {
1383713877 let scratch = cleanup.create_page(
1383813878 &env.parent_page_id,
1383913879 &format!("Locality live local image {}", unique_suffix()),
13840- vec![media_child(
13841- "image",
13842- "https://www.w3.org/Icons/w3c_home.png",
13843- "Original local image",
13844- )],
13880+ vec![paragraph_child("Base body before local image upload.")],
1384513881 );
1384613882 let connector = NotionConnector::new(live_notion_config());
1384713883 let (fixture, mut store, page_path, original) = pull_live_page(&connector, &scratch.id);
13884+ let original = seed_local_image_upload(
13885+ &fixture,
13886+ &mut store,
13887+ &connector,
13888+ &page_path,
13889+ &original,
13890+ "Original local image",
13891+ );
1384813892 assert_local_image_markdown(&original, "Original local image");
1384913893
1385013894 let image_path = local_image_path(&fixture.root, &page_path, &original, "Original local image");
1385113895 assert!(
1385213896 image_path.is_file(),
1385313897 "missing local image at {image_path:?}"
1385413898 );
13855- let uploaded_bytes = tiny_png_bytes();
13856- fs::write(&image_path, uploaded_bytes).expect("overwrite local image bytes");
13899+ let uploaded_bytes = [ tiny_png_bytes(), b"locality-updated"].concat ();
13900+ fs::write(&image_path, & uploaded_bytes).expect("overwrite local image bytes");
1385713901
1385813902 let original_image_line = markdown_image_line(&original, "Original local image");
1385913903 let image_href = markdown_link_href(original_image_line);
@@ -13918,14 +13962,20 @@ fn live_local_image_media_edit_with_escaped_caption_uploads_and_reconciles() {
1391813962 let scratch = cleanup.create_page(
1391913963 &env.parent_page_id,
1392013964 &format!("Locality live escaped local image {}", unique_suffix()),
13921- vec![media_child(
13922- "image",
13923- "https://www.w3.org/Icons/w3c_home.png",
13924- "Original escaped image",
13965+ vec![paragraph_child(
13966+ "Base body before escaped-caption image upload.",
1392513967 )],
1392613968 );
1392713969 let connector = NotionConnector::new(live_notion_config());
1392813970 let (fixture, mut store, page_path, original) = pull_live_page(&connector, &scratch.id);
13971+ let original = seed_local_image_upload(
13972+ &fixture,
13973+ &mut store,
13974+ &connector,
13975+ &page_path,
13976+ &original,
13977+ "Original escaped image",
13978+ );
1392913979 assert_local_image_markdown(&original, "Original escaped image");
1393013980
1393113981 let image_path = local_image_path(
@@ -13938,8 +13988,8 @@ fn live_local_image_media_edit_with_escaped_caption_uploads_and_reconciles() {
1393813988 image_path.is_file(),
1393913989 "missing local image at {image_path:?}"
1394013990 );
13941- let uploaded_bytes = tiny_png_bytes();
13942- fs::write(&image_path, uploaded_bytes).expect("overwrite local image bytes");
13991+ let uploaded_bytes = [ tiny_png_bytes(), b"locality-escaped-updated"].concat ();
13992+ fs::write(&image_path, & uploaded_bytes).expect("overwrite local image bytes");
1394313993
1394413994 let original_image_line = markdown_image_line(&original, "Original escaped image");
1394513995 let image_href = markdown_link_href(original_image_line);
@@ -15795,6 +15845,44 @@ fn pull_live_page(
1579515845 (fixture, store, page_path, markdown)
1579615846}
1579715847
15848+ fn seed_local_image_upload(
15849+ fixture: &E2eFixture,
15850+ store: &mut InMemoryStateStore,
15851+ connector: &NotionConnector,
15852+ page_path: &Path,
15853+ markdown: &str,
15854+ caption: &str,
15855+ ) -> String {
15856+ let media_dir = fixture
15857+ .root
15858+ .join(".loc")
15859+ .join("media")
15860+ .join(format!("live-local-image-{}", unique_suffix()));
15861+ fs::create_dir_all(&media_dir).expect("create local image media dir");
15862+ let image_path = media_dir.join("initial.png");
15863+ fs::write(&image_path, tiny_png_bytes()).expect("write initial local image");
15864+ fs::write(
15865+ page_path,
15866+ format!("{markdown}\n\n", image_path.display()),
15867+ )
15868+ .expect("append initial local image");
15869+
15870+ let push = run_push_with_daemon(
15871+ store,
15872+ connector,
15873+ page_path,
15874+ PushOptions {
15875+ assume_yes: true,
15876+ confirm_dangerous: false,
15877+ },
15878+ )
15879+ .expect("push initial local image");
15880+ assert!(push.ok, "{push:#?}");
15881+ assert_eq!(push.action, "reconciled", "{push:#?}");
15882+
15883+ fs::read_to_string(page_path).expect("read reconciled image page")
15884+ }
15885+
1579815886fn live_block_snapshot(connector: &NotionConnector, page_id: &str) -> Value {
1579915887 let native = connector
1580015888 .fetch(FetchRequest {
@@ -17837,6 +17925,24 @@ fn assert_local_media_link_markdown(markdown: &str, caption: &str) {
1783717925 assert_local_media_href(line, caption);
1783817926}
1783917927
17928+ fn assert_external_image_markdown(markdown: &str, caption: &str, expected_url: &str) {
17929+ let line = markdown_image_line(markdown, caption);
17930+ assert_external_media_href(line, caption, expected_url);
17931+ }
17932+
17933+ fn assert_external_media_link_markdown(markdown: &str, caption: &str, expected_url: &str) {
17934+ let line = markdown_link_line(markdown, caption);
17935+ assert_external_media_href(line, caption, expected_url);
17936+ }
17937+
17938+ fn assert_external_media_href(line: &str, caption: &str, expected_url: &str) {
17939+ assert_eq!(
17940+ markdown_link_href(line),
17941+ expected_url,
17942+ "unexpected external media href for {caption:?}: {line:?}"
17943+ );
17944+ }
17945+
1784017946fn assert_local_media_href(line: &str, caption: &str) {
1784117947 let href = markdown_link_href(line);
1784217948 assert!(
0 commit comments