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}"); }