7747ffbc20
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
94 lines
2.6 KiB
Rust
94 lines
2.6 KiB
Rust
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}");
|
|
}
|