diff --git a/crates/server/tests/component.rs b/crates/server/tests/component.rs new file mode 100644 index 0000000..0c488ed --- /dev/null +++ b/crates/server/tests/component.rs @@ -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}"); +}