libtad-rs 0.2.0

Rust library for accessing Time and Date APIs
Documentation
use libtad_rs::models::time::DSTEntrySpecialType;
use libtad_rs::service::time::DSTListRequest;
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_dst_entries() {
    let client = ServiceClient::new(env!("ACCESS_KEY").into(), env!("SECRET_KEY").into());

    let request = DSTListRequest::new().set_year(2016);
    let response = client
        .get_daylight_savings_time(&request)
        .await
        .unwrap()
        .unwrap();

    assert!(response.dstlist.len() == 129);
}

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

    let request = DSTListRequest::new().set_country("no");

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

    assert!(response.dstlist.len() == 1);
    assert!(response.dstlist[0].region.country.name == "Norway");
    assert!(response.dstlist[0].region.country.id == "no");
}

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

    let request = DSTListRequest::new().set_country("no").set_year(2014);

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

    assert!(response.dstlist.len() == 1);
    assert!(response.dstlist[0].region.country.name == "Norway");
    assert!(response.dstlist[0].region.country.id == "no");
}

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

    let request = DSTListRequest::new().set_listplaces(true);

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

    assert!(response
        .dstlist
        .iter()
        .all(|x| x.region.locations.is_some()));
}

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

    let request = DSTListRequest::new().set_listplaces(false);

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

    assert!(response
        .dstlist
        .iter()
        .all(|x| x.region.locations.is_none()));
}

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

    let request = DSTListRequest::new().set_timechanges(true);

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

    assert!(response.dstlist.iter().all(|x| x.timechanges.is_some()));
}

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

    let request = DSTListRequest::new().set_timechanges(false);

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

    assert!(response.dstlist.iter().all(|x| x.timechanges.is_none()));
}

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

    let request = DSTListRequest::new().set_onlydst(true).set_year(2014);

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

    assert!(response.dstlist.len() == 132);
}

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

    let request = DSTListRequest::new().set_onlydst(false).set_year(2014);

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

    assert!(response.dstlist.len() == 348);
    assert!(
        response
            .dstlist
            .iter()
            .flat_map(|x| x.special.as_ref())
            .filter(|x| matches!(x.r#type, DSTEntrySpecialType::NoDST))
            .count()
            > 0
    )
}