-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c1fe598
commit c9af585
Showing
5 changed files
with
213 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
//! Implementation of the `timezones` API endpoint. | ||
//! | ||
//! This endpoint is used to lookup the timezones supported by Marketstack. | ||
|
||
use derive_builder::Builder; | ||
|
||
use crate::api::paged::PaginationError; | ||
use crate::api::{endpoint_prelude::*, ApiError}; | ||
|
||
/// Query for `timezones`. | ||
#[derive(Debug, Clone, Builder)] | ||
#[builder(setter(strip_option))] | ||
pub struct Timezones { | ||
/// Pagination limit for API request. | ||
#[builder(setter(name = "_limit"), default)] | ||
limit: Option<PageLimit>, | ||
/// Pagination offset value for API request. | ||
#[builder(default)] | ||
offset: Option<u64>, | ||
} | ||
|
||
impl Timezones { | ||
/// Create a builder for this endpoint. | ||
pub fn builder() -> TimezonesBuilder { | ||
TimezonesBuilder::default() | ||
} | ||
} | ||
|
||
impl TimezonesBuilder { | ||
/// Limit the number of results returned. | ||
pub fn limit(&mut self, limit: u16) -> Result<&mut Self, ApiError<PaginationError>> { | ||
let new = self; | ||
new.limit = Some(Some(PageLimit::new(limit)?)); | ||
Ok(new) | ||
} | ||
} | ||
|
||
impl Endpoint for Timezones { | ||
fn method(&self) -> Method { | ||
Method::GET | ||
} | ||
|
||
fn endpoint(&self) -> Cow<'static, str> { | ||
"timezones".into() | ||
} | ||
|
||
fn parameters(&self) -> QueryParams { | ||
let mut params = QueryParams::default(); | ||
|
||
params | ||
.push_opt("limit", self.limit.clone()) | ||
.push_opt("offset", self.offset); | ||
|
||
params | ||
} | ||
} | ||
|
||
#[cfg(test)] | ||
mod tests { | ||
|
||
use crate::api::timezones::Timezones; | ||
use crate::api::{self, Query}; | ||
use crate::test::client::{ExpectedUrl, SingleTestClient}; | ||
|
||
#[test] | ||
fn timezones_defaults_are_sufficient() { | ||
Timezones::builder().build().unwrap(); | ||
} | ||
|
||
#[test] | ||
fn timezones_endpoint() { | ||
let endpoint = ExpectedUrl::builder() | ||
.endpoint("timezones") | ||
.build() | ||
.unwrap(); | ||
let client = SingleTestClient::new_raw(endpoint, ""); | ||
|
||
let endpoint = Timezones::builder().build().unwrap(); | ||
api::ignore(endpoint).query(&client).unwrap(); | ||
} | ||
|
||
#[test] | ||
fn timezones_limit() { | ||
let endpoint = ExpectedUrl::builder() | ||
.endpoint("timezones") | ||
.add_query_params(&[("limit", "50")]) | ||
.build() | ||
.unwrap(); | ||
let client = SingleTestClient::new_raw(endpoint, ""); | ||
|
||
let endpoint = Timezones::builder().limit(50).unwrap().build().unwrap(); | ||
api::ignore(endpoint).query(&client).unwrap(); | ||
} | ||
|
||
#[test] | ||
fn timezones_over_limit() { | ||
assert!(Timezones::builder().limit(9999).is_err()); | ||
} | ||
|
||
#[test] | ||
fn timezones_offset() { | ||
let endpoint = ExpectedUrl::builder() | ||
.endpoint("timezones") | ||
.add_query_params(&[("offset", "2")]) | ||
.build() | ||
.unwrap(); | ||
let client = SingleTestClient::new_raw(endpoint, ""); | ||
|
||
let endpoint = Timezones::builder().offset(2).build().unwrap(); | ||
api::ignore(endpoint).query(&client).unwrap(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
use marketstack::api::{timezones, AsyncQuery, Query}; | ||
use marketstack::{AsyncMarketstack, Marketstack, TimezonesData}; | ||
|
||
mod setup; | ||
|
||
#[test] | ||
#[ignore] | ||
fn test_timezones() { | ||
let api_key = setup::setup_key(); | ||
let client = Marketstack::new_insecure("api.marketstack.com", api_key).unwrap(); | ||
|
||
let endpoint = timezones::Timezones::builder() | ||
.limit(3) | ||
.unwrap() | ||
.build() | ||
.unwrap(); | ||
let timezones_result: TimezonesData = endpoint.query(&client).unwrap(); | ||
|
||
assert_eq!(timezones_result.pagination.limit, 3); | ||
assert_eq!(timezones_result.pagination.offset, 0); | ||
|
||
assert_eq!(timezones_result.data.len(), 3); | ||
} | ||
|
||
#[tokio::test] | ||
#[ignore] | ||
async fn test_async_timezones() { | ||
let api_key = setup::setup_key(); | ||
let client = AsyncMarketstack::new_insecure("api.marketstack.com", api_key) | ||
.await | ||
.unwrap(); | ||
|
||
let endpoint = timezones::Timezones::builder() | ||
.limit(3) | ||
.unwrap() | ||
.build() | ||
.unwrap(); | ||
let timezones_result: TimezonesData = endpoint.query_async(&client).await.unwrap(); | ||
|
||
assert_eq!(timezones_result.pagination.limit, 3); | ||
assert_eq!(timezones_result.pagination.offset, 0); | ||
|
||
assert_eq!(timezones_result.data.len(), 3); | ||
} |