test: prove WIT boundary with real component integration test

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-05 15:25:36 +02:00
parent eeec821af2
commit 7747ffbc20
+93
View File
@@ -0,0 +1,93 @@
use std::path::Path;
use whoareyou_server::model::{FetchedResponse, ParseOutcome};
use whoareyou_server::service::ProviderHandle;
use whoareyou_server::wasm;
const COMPONENT_PATH: &str = concat!(
env!("CARGO_MANIFEST_DIR"),
"/../../target/wasm32-wasip2/release/whoareyou_provider_hitta.wasm"
);
fn load_provider() -> wasm::WasmProvider {
let path = Path::new(COMPONENT_PATH);
assert!(
path.exists(),
"hitta component not built — run `cargo build --release --target wasm32-wasip2 -p whoareyou-provider-hitta` first"
);
let engine = wasm::engine().unwrap();
let linker = wasm::linker(&engine).unwrap();
wasm::spawn_epoch_thread(&engine);
wasm::WasmProvider::load(&engine, &linker, path).unwrap()
}
#[test]
fn metadata_identifies_hitta() {
let provider = load_provider();
assert_eq!(provider.name(), "hitta.se");
assert!(!provider.version().is_empty());
}
#[test]
fn requests_contain_the_number() {
let provider = load_provider();
let urls = provider.requests("0104754350").unwrap();
assert_eq!(urls, vec!["https://www.hitta.se/vem-ringde/0104754350"]);
}
#[test]
fn parse_roundtrips_a_fixture_through_wasm() {
let provider = load_provider();
let body = include_str!("../../../fixtures/hitta/fresh-0104754350.html").to_string();
let outcome = provider.parse("0104754350", &[FetchedResponse { status: 200, body }]);
let ParseOutcome::Ok(entry) = outcome else {
panic!("expected Ok entry, got {outcome:?}");
};
assert_eq!(
entry.history,
vec!["Elva andra har rapporterat detta nummer"]
);
// every comment on this number has empty text -> filtered out in the parser
assert!(entry.comments.is_empty());
}
#[test]
fn parse_maps_no_data_for_legacy_page() {
// 2019-format page: parser reports Failed (no flight data) -> ParseOutcome::Failed
let provider = load_provider();
let body = include_str!("../../../fixtures/hitta/0104754350.html").to_string();
let outcome = provider.parse("0104754350", &[FetchedResponse { status: 200, body }]);
assert!(
matches!(outcome, ParseOutcome::Failed(_)),
"got {outcome:?}"
);
}
#[test]
fn parse_rejects_non_200_status() {
let provider = load_provider();
let outcome = provider.parse(
"0104754350",
&[FetchedResponse {
status: 429,
body: "rate limited".to_string(),
}],
);
let ParseOutcome::Failed(message) = outcome else {
panic!("expected Failed, got {outcome:?}");
};
assert!(message.contains("429"), "message was: {message}");
}