libtad-rs 0.2.0

Rust library for accessing Time and Date APIs
Documentation
use libtad_rs::models::tides::TidalPhase;
use libtad_rs::models::time::DateTime;
use libtad_rs::service::tides::TidesRequest;
use libtad_rs::ServiceClient;
use maybe_async::maybe_async;

#[maybe_async]
#[cfg_attr(feature = "async-client", tokio::test)]
#[cfg_attr(feature = "sync-client", test)]
async fn request_tidal_data() {
    let client = ServiceClient::new(env!("ACCESS_KEY").into(), env!("SECRET_KEY").into());

    let request = TidesRequest::new()
        .with_placeid("norway/stavanger")
        .set_startdt(DateTime::from("2021-09-08T00:00:00"))
        .set_enddt(DateTime::from("2021-09-08T23:59:59"));

    let response = client.get_tidal_data(&request).await.unwrap().unwrap();

    assert!(response.stations.len() == 1);
    assert!(response.stations[0].source.name == "Stavanger");
    assert!(response.stations[0].source.r#type == "Reference Station");
    assert!(response.stations[0].matchparam == "norway/stavanger");
    assert!(response.stations[0]
        .result
        .iter()
        .all(|x| x.time.datetime.month == 9 && x.time.datetime.day == 8));
    assert!(response.stations[0]
        .result
        .iter()
        .all(|x| matches!(x.phase, TidalPhase::High) || matches!(x.phase, TidalPhase::Low)));
}

#[maybe_async]
#[cfg_attr(feature = "async-client", tokio::test)]
#[cfg_attr(feature = "sync-client", test)]
async fn request_tidal_data_without_onlyhighlow() {
    let client = ServiceClient::new(env!("ACCESS_KEY").into(), env!("SECRET_KEY").into());

    let request = TidesRequest::new()
        .with_placeid("norway/stavanger")
        .set_startdt(DateTime::from("2021-09-08T00:00:00"))
        .set_enddt(DateTime::from("2021-09-08T23:59:59"))
        .set_onlyhighlow(false);

    let response = client.get_tidal_data(&request).await.unwrap().unwrap();

    assert!(!response.stations[0]
        .result
        .iter()
        .all(|x| matches!(x.phase, TidalPhase::High) || matches!(x.phase, TidalPhase::Low)));
}

#[maybe_async]
#[cfg_attr(feature = "async-client", tokio::test)]
#[cfg_attr(feature = "sync-client", test)]
async fn request_invalid_end_date() {
    let client = ServiceClient::new(env!("ACCESS_KEY").into(), env!("SECRET_KEY").into());

    let request = TidesRequest::new()
        .with_placeid("norway/stavanger")
        .set_startdt(DateTime::from("2021-09-08T00:00:00"))
        .set_enddt(DateTime::from("2021-09-07T23:59:59"));

    let response = client.get_tidal_data(&request).await.unwrap();

    assert!(response.is_err());
}

#[maybe_async]
#[cfg_attr(feature = "async-client", tokio::test)]
#[cfg_attr(feature = "sync-client", test)]
async fn request_subordinate_station() {
    let client = ServiceClient::new(env!("ACCESS_KEY").into(), env!("SECRET_KEY").into());

    let request = TidesRequest::new()
        .with_placeid("norway/sola")
        .set_subordinate(true);

    let response = client.get_tidal_data(&request).await.unwrap().unwrap();

    assert!(response.stations[0].source.r#type == "Subordinate Station");
}

#[maybe_async]
#[cfg_attr(feature = "async-client", tokio::test)]
#[cfg_attr(feature = "sync-client", test)]
async fn request_without_radius() {
    let client = ServiceClient::new(env!("ACCESS_KEY").into(), env!("SECRET_KEY").into());

    let request = TidesRequest::new().with_placeid("4");

    let response = client.get_tidal_data(&request).await.unwrap();

    assert!(response.is_err());
}

#[maybe_async]
#[cfg_attr(feature = "async-client", tokio::test)]
#[cfg_attr(feature = "sync-client", test)]
async fn request_with_radius() {
    let client = ServiceClient::new(env!("ACCESS_KEY").into(), env!("SECRET_KEY").into());

    let request = TidesRequest::new().with_placeid("4").set_radius(186);

    let response = client.get_tidal_data(&request).await.unwrap();

    assert!(response.is_ok());
}

#[maybe_async]
#[cfg_attr(feature = "async-client", tokio::test)]
#[cfg_attr(feature = "sync-client", test)]
async fn request_intervals() {
    let client = ServiceClient::new(env!("ACCESS_KEY").into(), env!("SECRET_KEY").into());

    let mut request = TidesRequest::new()
        .with_placeid("norway/stavanger")
        .set_onlyhighlow(false)
        .set_interval(60);

    let response_60 = client.get_tidal_data(&request).await.unwrap().unwrap();
    assert!(response_60.stations[0].result.len() == 24);

    request = request.set_interval(30);

    let response_30 = client.get_tidal_data(&request).await.unwrap().unwrap();
    assert!(response_30.stations[0].result.len() == 48);

    request = request.set_interval(15);

    let response_15 = client.get_tidal_data(&request).await.unwrap().unwrap();
    assert!(response_15.stations[0].result.len() == 96);

    request = request.set_interval(5);

    let response_5 = client.get_tidal_data(&request).await.unwrap().unwrap();
    assert!(response_5.stations[0].result.len() == 288);
}