Story 54: add cross-platform binary distribution support
- Add Makefile with build-macos and build-linux targets
- build-macos: cargo build --release (native macOS binary)
- build-linux: cross build --release --target x86_64-unknown-linux-musl
(produces a fully static binary via Docker/cross; zero dynamic deps)
- Document cross-platform build process in README.md including
how to verify macOS dynamic deps (otool -L) and Linux static
linking (file + ldd)
- reqwest 0.13 already uses rustls by default (no OpenSSL); verified
in Cargo.lock – no Cargo.toml changes needed
- Add unit tests to http/assets.rs covering:
- SPA fallback routing for non-asset paths
- 404 for missing assets/ paths
- Panic-free behaviour on empty path
- rust-embed EmbeddedAssets iter compiles and runs correctly
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -65,3 +65,49 @@ pub fn embedded_file(Path(path): Path<String>) -> Response {
|
||||
pub fn embedded_index() -> Response {
|
||||
serve_embedded("index.html")
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use poem::http::StatusCode;
|
||||
|
||||
#[test]
|
||||
fn non_asset_path_spa_fallback_or_not_found() {
|
||||
// Non-asset paths fall back to index.html for SPA client-side routing.
|
||||
// In release builds (with embedded dist/) this returns 200.
|
||||
// In debug builds without a built frontend dist/ it returns 404.
|
||||
let response = serve_embedded("__nonexistent_spa_route__.html");
|
||||
assert!(
|
||||
response.status() == StatusCode::OK || response.status() == StatusCode::NOT_FOUND,
|
||||
"unexpected status: {}",
|
||||
response.status()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn missing_asset_path_prefix_returns_not_found() {
|
||||
// assets/ prefix: no SPA fallback – returns 404 if the file does not exist
|
||||
let response = serve_embedded("assets/__nonexistent__.js");
|
||||
assert_eq!(response.status(), StatusCode::NOT_FOUND);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn serve_embedded_does_not_panic_on_empty_path() {
|
||||
// Empty path normalises to index.html; OK in release, 404 in debug without dist/
|
||||
let response = serve_embedded("");
|
||||
assert!(
|
||||
response.status() == StatusCode::OK || response.status() == StatusCode::NOT_FOUND,
|
||||
"unexpected status: {}",
|
||||
response.status()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn embedded_assets_struct_is_iterable() {
|
||||
// Verifies that rust-embed compiled the EmbeddedAssets struct correctly.
|
||||
// In debug builds without a built frontend dist/ directory the iterator is empty; that is
|
||||
// expected. In release builds it will contain all bundled frontend files.
|
||||
let _files: Vec<_> = EmbeddedAssets::iter().collect();
|
||||
// No assertion needed – the test passes as long as it compiles and does not panic.
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user