Skip to content

Commit 55a5d89

Browse files
committed
Fix public CI regressions
1 parent 179cf31 commit 55a5d89

4 files changed

Lines changed: 139 additions & 52 deletions

File tree

.github/workflows/oauth-service-deploy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,5 @@ jobs:
5757
workingDirectory: apps/oauth-service
5858
packageManager: npm
5959
# Match the lockfile so CI deploy behavior stays reproducible.
60-
wranglerVersion: "4.103.0"
60+
wranglerVersion: "4.113.0"
6161
command: deploy

crates/loc-cli/tests/e2e_push_workflow.rs

Lines changed: 129 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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![{caption}]({})\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+
1579815886
fn 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+
1784017946
fn assert_local_media_href(line: &str, caption: &str) {
1784117947
let href = markdown_link_href(line);
1784217948
assert!(

crates/locality-notion/tests/live_integrity.rs

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::collections::BTreeMap;
2-
use std::fs;
32
use std::path::{Path, PathBuf};
43
use std::sync::Arc;
54
use std::time::{SystemTime, UNIX_EPOCH};
@@ -34,7 +33,7 @@ const LIVE_AUDIO_URL: &str =
3433

3534
#[test]
3635
#[ignore = "requires Notion credentials (NOTION_TOKEN or ~/.loc credentials) and LOCALITY_NOTION_LIVE_PARENT_PAGE"]
37-
fn live_page_read_edit_write_verify_integrity_with_media_download() {
36+
fn live_page_read_edit_write_verify_integrity_with_external_media_references() {
3837
let env = LiveEnv::from_env();
3938
let api = Arc::new(LiveNotion::new(env.token.clone()));
4039
let mut cleanup = LiveCleanup::new(api.clone());
@@ -61,11 +60,8 @@ fn live_page_read_edit_write_verify_integrity_with_media_download() {
6160
.download_rendered_media(&rendered, &env.local_dir)
6261
.expect("download rendered media");
6362
assert_eq!(media_report.failed, 0, "{media_report:#?}");
64-
assert_eq!(
65-
media_report.downloaded,
66-
rendered.media_assets.len(),
67-
"{media_report:#?}"
68-
);
63+
assert_eq!(media_report.downloaded, 0, "{media_report:#?}");
64+
assert!(rendered.media_assets.is_empty());
6965

7066
assert!(rendered.document.body.contains("# Heading one"));
7167
assert!(rendered.document.body.contains("## Heading two"));
@@ -79,31 +75,31 @@ fn live_page_read_edit_write_verify_integrity_with_media_download() {
7975
rendered
8076
.document
8177
.body
82-
.contains("![W3C test image](../.loc/media/live-integrity/block-coverage/image-")
78+
.contains(&format!("![W3C test image]({LIVE_IMAGE_URL})"))
8379
);
8480
assert!(
8581
rendered
8682
.document
8783
.body
88-
.contains("[External video](../.loc/media/live-integrity/block-coverage/video-")
84+
.contains(&format!("[External video]({LIVE_VIDEO_URL})"))
8985
);
9086
assert!(
9187
rendered
9288
.document
9389
.body
94-
.contains("[External file](../.loc/media/live-integrity/block-coverage/file-")
90+
.contains(&format!("[External file]({LIVE_PDF_URL})"))
9591
);
9692
assert!(
9793
rendered
9894
.document
9995
.body
100-
.contains("[External PDF](../.loc/media/live-integrity/block-coverage/pdf-")
96+
.contains(&format!("[External PDF]({LIVE_PDF_URL})"))
10197
);
10298
assert!(
10399
rendered
104100
.document
105101
.body
106-
.contains("[External audio](../.loc/media/live-integrity/block-coverage/audio-")
102+
.contains(&format!("[External audio]({LIVE_AUDIO_URL})"))
107103
);
108104
assert!(
109105
rendered
@@ -132,22 +128,6 @@ fn live_page_read_edit_write_verify_integrity_with_media_download() {
132128
.body
133129
.contains("[Locality nested child page](https://www.notion.so/")
134130
);
135-
for kind in ["image", "video", "file", "pdf", "audio"] {
136-
let asset = rendered
137-
.media_assets
138-
.iter()
139-
.find(|asset| asset.kind == kind)
140-
.unwrap_or_else(|| panic!("missing rendered {kind} media asset"));
141-
let local_path = env.local_dir.join(&asset.local_path);
142-
let metadata = fs::metadata(&local_path).unwrap_or_else(|error| {
143-
panic!("missing downloaded {kind} media at {local_path:?}: {error}")
144-
});
145-
assert!(
146-
metadata.len() > 0,
147-
"downloaded {kind} media should be non-empty at {local_path:?}"
148-
);
149-
}
150-
151131
let bundle: NotionPageBundle = serde_json::from_slice(&native.raw).expect("native bundle");
152132
let paragraph_id = first_block_id(&bundle, "paragraph");
153133
let last_block_id = bundle

crates/localityd/tests/remote_truth.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ impl OpaqueReplicaSessionService for RecordingReplicaService {
220220
},
221221
replicas: Vec::new(),
222222
export_offer: None,
223+
export_attempt_limits: None,
223224
error: None,
224225
updated_at: "2026-07-19T12:00:00Z".to_string(),
225226
})

0 commit comments

Comments
 (0)