Files
whoareyou/src/probe/konsument_info.rs
2019-02-06 09:24:42 +01:00

115 lines
2.9 KiB
Rust

use scraper::{Html, Selector};
use crate::context::Context;
use crate::probe::{Entry, Probe};
fn from_html(document: &str) -> Result<Entry, ()> {
let html = Html::parse_document(document);
let mut messages = Vec::new();
let history = Vec::new();
let comments = Vec::new();
let selector = Selector::parse(".panel-heading > h1:nth-child(3)").unwrap();
if let Some(element) = html.select(&selector).next() {
let message = element.inner_html();
let message = htmlescape::decode_html(&message).unwrap();
messages.push(message);
}
if messages.is_empty() {
Err(())
} else {
Ok(Entry {
messages,
history,
comments,
})
}
}
pub struct KonsumentInfo;
impl Probe for KonsumentInfo {
fn uri(&self, number: &str) -> String {
format!("http://konsumentinfo.se/telefonnummer/sverige/{}", number)
}
fn search(&mut self, ctx: &mut Context, number: &str) -> Result<Entry, ()> {
let body = if let Some(cache) = ctx.cache_get("konsument_info", &number) {
String::from_utf8(cache.data).unwrap()
} else {
let body = reqwest::get(&self.uri(number)).unwrap().text().unwrap();
ctx.cache_set("konsument_info", &number, body.as_bytes())
.expect("wut?! why not?!");
body
};
from_html(&body)
}
}
#[cfg(test)]
mod tests {
use insta::assert_yaml_snapshot_matches;
use super::*;
#[test]
fn test_0104754350() {
let document = include_str!("../../fixtures/konsumentinfo/0104754350.html");
assert_yaml_snapshot_matches!(from_html(&document), @"Err: ~");
}
#[test]
fn test_0313908905() {
let document = include_str!("../../fixtures/konsumentinfo/0313908905.html");
assert_yaml_snapshot_matches!(from_html(&document), @"Err: ~");
}
#[test]
fn test_0702269893() {
let document = include_str!("../../fixtures/konsumentinfo/0702269893.html");
assert_yaml_snapshot_matches!(from_html(&document), @r###"Ok:
messages:
- Hydroscand AB
history: []
comments: []"###);
}
#[test]
fn test_0726443387() {
let document = include_str!("../../fixtures/konsumentinfo/0726443387.html");
assert_yaml_snapshot_matches!(from_html(&document), @"Err: ~");
}
#[test]
fn test_0751793426() {
let document = include_str!("../../fixtures/konsumentinfo/0751793426.html");
assert_yaml_snapshot_matches!(from_html(&document), @"Err: ~");
}
#[test]
fn test_0751793483() {
let document = include_str!("../../fixtures/konsumentinfo/0751793483.html");
assert_yaml_snapshot_matches!(from_html(&document), @"Err: ~");
}
#[test]
fn test_0751793499() {
let document = include_str!("../../fixtures/konsumentinfo/0751793499.html");
assert_yaml_snapshot_matches!(from_html(&document), @"Err: ~");
}
}