use derive_builder::Builder;
use reqwest::Method;
use std::borrow::Cow;
use crate::api::{Endpoint, Pageable, ReturnsJsonResponse};
use serde_repr::{Deserialize_repr, Serialize_repr};
#[derive(
Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize_repr, Deserialize_repr,
)]
#[repr(u8)]
pub enum Visibility {
Private = 0,
Roles = 1,
Public = 2,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct QueryListItem {
pub id: u64,
pub name: String,
pub is_public: bool,
pub project_id: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct Query {
pub id: u64,
pub name: String,
pub is_public: bool,
pub project_id: Option<u64>,
pub user_id: u64,
#[serde(default)]
pub description: Option<String>,
pub filters: serde_json::Value,
pub column_names: Vec<String>,
pub sort_criteria: serde_json::Value,
pub options: serde_json::Value,
#[serde(rename = "type")]
pub query_type: String,
}
#[derive(Debug, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct ListQueries {}
impl ReturnsJsonResponse for ListQueries {}
impl Pageable for ListQueries {
fn response_wrapper_key(&self) -> String {
"queries".to_string()
}
}
impl ListQueries {
#[must_use]
pub fn builder() -> ListQueriesBuilder {
ListQueriesBuilder::default()
}
}
impl Endpoint for ListQueries {
fn method(&self) -> Method {
Method::GET
}
fn endpoint(&self) -> Cow<'static, str> {
"queries.json".into()
}
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct QueriesWrapper<T> {
pub queries: Vec<T>,
}
#[cfg(test)]
mod test {
use super::*;
use pretty_assertions::assert_eq;
use std::error::Error;
use tracing_test::traced_test;
#[traced_test]
#[test]
fn test_list_queries_first_page() -> Result<(), Box<dyn Error>> {
dotenvy::dotenv()?;
let redmine = crate::api::Redmine::from_env(
reqwest::blocking::Client::builder()
.tls_backend_rustls()
.build()?,
)?;
let endpoint = ListQueries::builder().build()?;
redmine.json_response_body_page::<_, QueryListItem>(&endpoint, 0, 25)?;
Ok(())
}
#[traced_test]
#[test]
fn test_list_queries_all_pages() -> Result<(), Box<dyn Error>> {
dotenvy::dotenv()?;
let redmine = crate::api::Redmine::from_env(
reqwest::blocking::Client::builder()
.tls_backend_rustls()
.build()?,
)?;
let endpoint = ListQueries::builder().build()?;
redmine.json_response_body_all_pages::<_, QueryListItem>(&endpoint)?;
Ok(())
}
#[traced_test]
#[test]
fn test_completeness_query_type() -> Result<(), Box<dyn Error>> {
dotenvy::dotenv()?;
let redmine = crate::api::Redmine::from_env(
reqwest::blocking::Client::builder()
.tls_backend_rustls()
.build()?,
)?;
let endpoint = ListQueries::builder().build()?;
let values: Vec<serde_json::Value> = redmine.json_response_body_all_pages(&endpoint)?;
for value in values {
let o: QueryListItem = serde_json::from_value(value.clone())?;
let reserialized = serde_json::to_value(o)?;
assert_eq!(value, reserialized);
}
Ok(())
}
}