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