use derive_builder::Builder;
use crate::api::common::{AccessLevel, NameOrId, SortOrder, VisibilityLevel};
use crate::api::endpoint_prelude::*;
use crate::api::ParamValue;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GroupProjectsOrderBy {
Id,
Name,
Path,
CreatedAt,
UpdatedAt,
LastActivityAt,
}
impl Default for GroupProjectsOrderBy {
fn default() -> Self {
GroupProjectsOrderBy::CreatedAt
}
}
impl GroupProjectsOrderBy {
fn as_str(self) -> &'static str {
match self {
GroupProjectsOrderBy::Id => "id",
GroupProjectsOrderBy::Name => "name",
GroupProjectsOrderBy::Path => "path",
GroupProjectsOrderBy::CreatedAt => "created_at",
GroupProjectsOrderBy::UpdatedAt => "updated_at",
GroupProjectsOrderBy::LastActivityAt => "last_activity_at",
}
}
}
impl ParamValue<'static> for GroupProjectsOrderBy {
fn as_value(self) -> Cow<'static, str> {
self.as_str().into()
}
}
#[derive(Debug, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct GroupProjects<'a> {
#[builder(setter(into))]
group: NameOrId<'a>,
#[builder(default)]
archived: Option<bool>,
#[builder(default)]
visibility: Option<VisibilityLevel>,
#[builder(default)]
order_by: Option<GroupProjectsOrderBy>,
#[builder(default)]
sort: Option<SortOrder>,
#[builder(setter(into), default)]
search: Option<Cow<'a, str>>,
#[builder(default)]
simple: Option<bool>,
#[builder(default)]
owned: Option<bool>,
#[builder(default)]
starred: Option<bool>,
#[builder(default)]
with_issues_enabled: Option<bool>,
#[builder(default)]
with_merge_requests_enabled: Option<bool>,
#[builder(default)]
with_shared: Option<bool>,
#[builder(default)]
include_subgroups: Option<bool>,
#[builder(default)]
min_access_level: Option<AccessLevel>,
#[builder(default)]
with_custom_attributes: Option<bool>,
#[builder(default)]
with_security_reports: Option<bool>,
}
impl<'a> GroupProjects<'a> {
pub fn builder() -> GroupProjectsBuilder<'a> {
GroupProjectsBuilder::default()
}
}
impl<'a> Endpoint for GroupProjects<'a> {
fn method(&self) -> Method {
Method::GET
}
fn endpoint(&self) -> Cow<'static, str> {
format!("groups/{}/projects", self.group).into()
}
fn parameters(&self) -> QueryParams {
let mut params = QueryParams::default();
params
.push_opt("archived", self.archived)
.push_opt("visibility", self.visibility)
.push_opt("order_by", self.order_by)
.push_opt("sort", self.sort)
.push_opt("search", self.search.as_ref())
.push_opt("simple", self.simple)
.push_opt("owned", self.owned)
.push_opt("starred", self.starred)
.push_opt("with_issues_enabled", self.with_issues_enabled)
.push_opt(
"with_merge_requests_enabled",
self.with_merge_requests_enabled,
)
.push_opt("with_shared", self.with_shared)
.push_opt("include_subgroups", self.include_subgroups)
.push_opt(
"min_access_level",
self.min_access_level.map(AccessLevel::as_u64),
)
.push_opt("with_custom_attributes", self.with_custom_attributes)
.push_opt("with_security_reports", self.with_security_reports);
params
}
}
impl<'a> Pageable for GroupProjects<'a> {}
#[cfg(test)]
mod tests {
use crate::api::common::{AccessLevel, SortOrder, VisibilityLevel};
use crate::api::groups::projects::{GroupProjects, GroupProjectsOrderBy};
use crate::api::{self, Query};
use crate::test::client::{ExpectedUrl, SingleTestClient};
#[test]
fn order_by_default() {
assert_eq!(
GroupProjectsOrderBy::default(),
GroupProjectsOrderBy::CreatedAt
);
}
#[test]
fn order_by_as_str() {
let items = &[
(GroupProjectsOrderBy::Id, "id"),
(GroupProjectsOrderBy::Name, "name"),
(GroupProjectsOrderBy::Path, "path"),
(GroupProjectsOrderBy::CreatedAt, "created_at"),
(GroupProjectsOrderBy::UpdatedAt, "updated_at"),
(GroupProjectsOrderBy::LastActivityAt, "last_activity_at"),
];
for (i, s) in items {
assert_eq!(i.as_str(), *s);
}
}
#[test]
fn group_is_needed() {
let err = GroupProjects::builder().build().unwrap_err();
assert_eq!(err, "`group` must be initialized");
}
#[test]
fn group_is_sufficient() {
GroupProjects::builder().group(1).build().unwrap();
}
#[test]
fn endpoint() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_archived() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("archived", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.archived(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_visibility() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("visibility", "private")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.visibility(VisibilityLevel::Private)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_order_by() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("order_by", "id")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.order_by(GroupProjectsOrderBy::Id)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_sort() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("sort", "asc")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.sort(SortOrder::Ascending)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_search() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("search", "name")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.search("name")
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_simple() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("simple", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.simple(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_owned() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("owned", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.owned(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_starred() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("starred", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.starred(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_with_issues_enabled() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("with_issues_enabled", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.with_issues_enabled(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_with_merge_requests_enabled() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("with_merge_requests_enabled", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.with_merge_requests_enabled(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_with_shared() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("with_shared", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.with_shared(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_include_subgroups() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("include_subgroups", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.include_subgroups(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_min_access_level() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("min_access_level", "30")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.min_access_level(AccessLevel::Developer)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_with_custom_attributes() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("with_custom_attributes", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.with_custom_attributes(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_with_security_reports() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects")
.add_query_params(&[("with_security_reports", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = GroupProjects::builder()
.group("group/subgroup")
.with_security_reports(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
}