test: prove WIT boundary with real component integration test
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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}");
|
||||
}
|
||||
Reference in New Issue
Block a user