Watch the embedded web/dist output (not just frontend inputs) so a rebuilt bundle is actually re-embedded; assert pnpm build produced web/dist/index.html; strengthen the embed test to require a vite-built hashed asset reference. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30 lines
1.1 KiB
Rust
30 lines
1.1 KiB
Rust
//! The compiled binary must embed the real SPA bundle, never the placeholder.
|
|
//! `build.rs` guarantees `web/dist` is populated before `include_dir!` runs.
|
|
|
|
use axum::body::to_bytes;
|
|
use maestro_web::static_bundle::serve_index;
|
|
|
|
#[tokio::test]
|
|
async fn embedded_index_is_real_spa_not_placeholder() {
|
|
let resp = serve_index();
|
|
let body = to_bytes(resp.into_body(), usize::MAX).await.unwrap();
|
|
let html = String::from_utf8(body.to_vec()).unwrap();
|
|
|
|
assert!(
|
|
html.contains(r#"id="app""#),
|
|
"served index is missing the SPA mount point; got:\n{html}"
|
|
);
|
|
assert!(
|
|
!html.contains("maestro-web is running"),
|
|
"served index is the placeholder, not the built bundle"
|
|
);
|
|
// Stronger signal than `id="app"` (which appears in both source and built
|
|
// HTML): the vite build rewrites the entry to a hashed `/assets/index-<hash>`
|
|
// bundle, whereas the un-built source references `/src/main.ts`. This catches
|
|
// both an empty/placeholder embed and the staleness case.
|
|
assert!(
|
|
html.contains("/assets/index-"),
|
|
"served index does not reference a vite-built hashed asset; got:\n{html}"
|
|
);
|
|
}
|