Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@ reqwest = { version = "0.12", default-features = false, features = [
[features]
default = ["reqwest/default"]
rustls-tls = ["reqwest/rustls-tls"]

[dev-dependencies]
mockito = "1.7"
160 changes: 151 additions & 9 deletions src/geoadmin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -448,19 +448,109 @@ pub struct ReverseLocationAttributes {
#[cfg(test)]
mod test {
use super::*;
use mockito::{Matcher, ServerGuard};
use serde_json::json;

fn make_geoadmin(server: &ServerGuard) -> GeoAdmin {
GeoAdmin::new().with_endpoint(&format!("{}/", server.url()))
}

fn forward_body(x: f64, y: f64, lon: f64, lat: f64, label: &str) -> String {
json!({
"features": [{
"properties": {
"origin": "address",
"geom_quadindex": "021300220302203002031",
"weight": 1512u32,
"zoomlevel": 10u32,
"lon": lon,
"detail": "seftigenstrasse 264 3084 wabern",
"rank": 7u32,
"lat": lat,
"num": 264usize,
"x": x,
"y": y,
"label": label,
}
}]
})
.to_string()
}

fn reverse_body(strname_deinr: &str, dplz4: u32, dplzname: &str) -> String {
json!({
"results": [{
"featureId": "1272199_0",
"layerBodId": "ch.bfs.gebaeude_wohnungs_register",
"layerName": "Register of Buildings and Dwellings",
"properties": {
"egid": null,
"ggdenr": 351u32,
"ggdename": "Köniz",
"gdekt": "BE",
"edid": null,
"egaid": 0u32,
"deinr": null,
"dplz4": dplz4,
"dplzname": dplzname,
"egrid": null,
"esid": 0u32,
"strname": [],
"strsp": [],
"strname_deinr": strname_deinr,
"label": strname_deinr,
}
}]
})
.to_string()
}

fn mock_path(server: &mut ServerGuard, path: &str, body: String) -> mockito::Mock {
server
.mock("GET", Matcher::Regex(format!("^{}.*", path)))
.with_status(200)
.with_header("content-type", "application/json")
.with_body(body)
.create()
}

#[test]
fn new_with_sr_forward_test() {
let geoadmin = GeoAdmin::new().with_sr("2056");
let mut server = mockito::Server::new();
let _m = mock_path(
&mut server,
"/SearchServer",
forward_body(
1_197_427.0,
2_600_968.75,
7.451352119445801,
46.92793655395508,
"Seftigenstrasse 264 <b>3084 Wabern</b>",
),
);

let geoadmin = make_geoadmin(&server).with_sr("2056");
let address = "Seftigenstrasse 264, 3084 Wabern";
let res = geoadmin.forward(address);
assert_eq!(res.unwrap(), vec![Point::new(2_600_968.75, 1_197_427.0)]);
}

#[test]
fn new_with_endpoint_forward_test() {
let geoadmin =
GeoAdmin::new().with_endpoint("https://api3.geo.admin.ch/rest/services/api/");
let mut server = mockito::Server::new();
let _m = mock_path(
&mut server,
"/SearchServer",
forward_body(
7.451352119445801,
46.92793655395508,
7.451352119445801,
46.92793655395508,
"Seftigenstrasse 264 <b>3084 Wabern</b>",
),
);

let geoadmin = GeoAdmin::new().with_endpoint(&format!("{}/", server.url()));
let address = "Seftigenstrasse 264, 3084 Wabern";
let res = geoadmin.forward(address);
assert_eq!(
Expand All @@ -471,7 +561,20 @@ mod test {

#[test]
fn with_sr_forward_full_test() {
let geoadmin = GeoAdmin::new().with_sr("2056");
let mut server = mockito::Server::new();
let _m = mock_path(
&mut server,
"/SearchServer",
forward_body(
1_197_427.0,
2_600_968.75,
7.451352119445801,
46.92793655395508,
"Seftigenstrasse 264 <b>3084 Wabern</b>",
),
);

let geoadmin = make_geoadmin(&server).with_sr("2056");
let bbox = InputBounds::new((2_600_967.75, 1_197_426.0), (2_600_969.75, 1_197_428.0));
let params = GeoAdminParams::new("Seftigenstrasse Bern")
.with_origins("address")
Expand All @@ -487,7 +590,20 @@ mod test {

#[test]
fn forward_full_test() {
let geoadmin = GeoAdmin::new();
let mut server = mockito::Server::new();
let _m = mock_path(
&mut server,
"/SearchServer",
forward_body(
7.451352119445801,
46.92793655395508,
7.451352119445801,
46.92793655395508,
"Seftigenstrasse 264 <b>3084 Wabern</b>",
),
);

let geoadmin = make_geoadmin(&server);
let bbox = InputBounds::new((7.4513398, 46.92792859), (7.4513662, 46.9279467));
let params = GeoAdminParams::new("Seftigenstrasse Bern")
.with_origins("address")
Expand All @@ -503,7 +619,20 @@ mod test {

#[test]
fn forward_test() {
let geoadmin = GeoAdmin::new();
let mut server = mockito::Server::new();
let _m = mock_path(
&mut server,
"/SearchServer",
forward_body(
7.451352119445801,
46.92793655395508,
7.451352119445801,
46.92793655395508,
"Seftigenstrasse 264 <b>3084 Wabern</b>",
),
);

let geoadmin = make_geoadmin(&server);
let address = "Seftigenstrasse 264, 3084 Wabern";
let res = geoadmin.forward(address);
assert_eq!(
Expand All @@ -514,7 +643,14 @@ mod test {

#[test]
fn with_sr_reverse_test() {
let geoadmin = GeoAdmin::new().with_sr("2056");
let mut server = mockito::Server::new();
let _m = mock_path(
&mut server,
"/MapServer/identify",
reverse_body("Seftigenstrasse 264", 3084, "Wabern"),
);

let geoadmin = make_geoadmin(&server).with_sr("2056");
let p = Point::new(2_600_968.75, 1_197_427.0);
let res = geoadmin.reverse(&p);
assert_eq!(
Expand All @@ -524,9 +660,15 @@ mod test {
}

#[test]
#[ignore = "https://github.com/georust/geocoding/pull/45#issuecomment-1592395700"]
fn reverse_test() {
let geoadmin = GeoAdmin::new();
let mut server = mockito::Server::new();
let _m = mock_path(
&mut server,
"/MapServer/identify",
reverse_body("Seftigenstrasse 264", 3084, "Wabern"),
);

let geoadmin = make_geoadmin(&server);
let p = Point::new(7.451352119445801, 46.92793655395508);
let res = geoadmin.reverse(&p);
assert_eq!(
Expand Down
12 changes: 12 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,15 @@ pub enum GeocodingError {
///
/// ```
/// use geocoding::{Opencage, Point, Reverse};
/// # let mut server = mockito::Server::new();
/// # let _m = server.mock("GET", mockito::Matcher::Any)
/// # .with_header("content-type", "application/json")
/// # .with_body(r#"{"documentation":"","licenses":[],"results":[{"components":{"road":"Carrer de Calatrava"},"confidence":10,"formatted":"Carrer de Calatrava, 64, 08017 Barcelona, Spain","geometry":{"lat":41.4014067,"lng":2.1287224}}],"status":{"message":"OK","code":200},"stay_informed":{},"thanks":"","timestamp":{"created_http":"","created_unix":0},"total_results":1}"#)
/// # .create();
///
/// let p = Point::new(2.12870, 41.40139);
/// let oc = Opencage::new("dcdbf0d783374909b3debee728c7cc10".to_string());
/// # let oc = Opencage::new_with_endpoint("dcdbf0d783374909b3debee728c7cc10".to_string(), format!("{}/geocode/v1/json", server.url()));
/// let res = oc.reverse(&p).unwrap();
/// assert_eq!(
/// res,
Expand All @@ -102,8 +108,14 @@ where
///
/// ```
/// use geocoding::{Coord, Forward, Opencage, Point};
/// # let mut server = mockito::Server::new();
/// # let _m = server.mock("GET", mockito::Matcher::Any)
/// # .with_header("content-type", "application/json")
/// # .with_body(r#"{"documentation":"","licenses":[],"results":[{"components":{"road":""},"confidence":10,"formatted":"Schwabing, Munich, Germany","geometry":{"lat":48.1700887,"lng":11.5884858}}],"status":{"message":"OK","code":200},"stay_informed":{},"thanks":"","timestamp":{"created_http":"","created_unix":0},"total_results":1}"#)
/// # .create();
///
/// let oc = Opencage::new("dcdbf0d783374909b3debee728c7cc10".to_string());
/// # let oc = Opencage::new_with_endpoint("dcdbf0d783374909b3debee728c7cc10".to_string(), format!("{}/geocode/v1/json", server.url()));
/// let address = "Schwabing, München";
/// let res: Vec<Point<f64>> = oc.forward(address).unwrap();
/// assert_eq!(
Expand Down
Loading
Loading