use crate::api::common::{NameOrId, SortOrder};
use crate::api::packages::{PackageStatus, PackageType};
use crate::api::{endpoint_prelude::*, ParamValue};
use derive_builder::Builder;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PackageOrderBy {
CreatedAt,
Name,
Version,
Type,
}
impl PackageOrderBy {
pub(crate) fn as_str(self) -> &'static str {
match self {
PackageOrderBy::CreatedAt => "created_at",
PackageOrderBy::Name => "name",
PackageOrderBy::Version => "version",
PackageOrderBy::Type => "type",
}
}
}
impl ParamValue<'static> for PackageOrderBy {
fn as_value(&self) -> Cow<'static, str> {
self.as_str().into()
}
}
#[derive(Debug, Builder, Clone)]
#[builder(setter(strip_option))]
pub struct Packages<'a> {
#[builder(setter(into))]
project: NameOrId<'a>,
#[builder(default)]
order_by: Option<PackageOrderBy>,
#[builder(default)]
sort: Option<SortOrder>,
#[builder(default)]
package_type: Option<PackageType>,
#[builder(setter(into), default)]
package_name: Option<Cow<'a, str>>,
#[builder(default)]
include_versionless: Option<bool>,
#[builder(default)]
status: Option<PackageStatus>,
}
impl<'a> Packages<'a> {
pub fn builder() -> PackagesBuilder<'a> {
PackagesBuilder::default()
}
}
impl<'a> Endpoint for Packages<'a> {
fn method(&self) -> Method {
Method::GET
}
fn endpoint(&self) -> Cow<'static, str> {
format!("projects/{}/packages", self.project).into()
}
fn parameters(&self) -> QueryParams {
let mut params = QueryParams::default();
params
.push_opt("order_by", self.order_by)
.push_opt("sort", self.sort)
.push_opt("package_type", self.package_type)
.push_opt("package_name", self.package_name.as_ref())
.push_opt("include_versionless", self.include_versionless)
.push_opt("status", self.status);
params
}
}
impl<'a> Pageable for Packages<'a> {}
#[cfg(test)]
mod tests {
use super::{PackageOrderBy, PackageStatus, PackageType};
use crate::{
api::{
self,
common::SortOrder,
projects::packages::packages::{Packages, PackagesBuilderError},
Query,
},
test::client::{ExpectedUrl, SingleTestClient},
};
#[test]
fn order_by_as_str() {
let items = &[
(PackageOrderBy::CreatedAt, "created_at"),
(PackageOrderBy::Name, "name"),
(PackageOrderBy::Type, "type"),
(PackageOrderBy::Version, "version"),
];
for (i, s) in items {
assert_eq!(i.as_str(), *s);
}
}
#[test]
fn project_is_needed() {
let err = Packages::builder().build().unwrap_err();
crate::test::assert_missing_field!(err, PackagesBuilderError, "project");
}
#[test]
fn project_is_sufficient() {
Packages::builder().project(1).build().unwrap();
}
#[test]
fn endpoint() {
let endpoint = ExpectedUrl::builder()
.endpoint("projects/1337/packages")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = Packages::builder().project(1337).build().unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_order_by() {
let endpoint = ExpectedUrl::builder()
.endpoint("projects/1337/packages")
.add_query_params(&[("order_by", "name")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = Packages::builder()
.project(1337)
.order_by(PackageOrderBy::Name)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_sort() {
let endpoint = ExpectedUrl::builder()
.endpoint("projects/1337/packages")
.add_query_params(&[("sort", "desc")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = Packages::builder()
.project(1337)
.sort(SortOrder::Descending)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_package_type() {
let endpoint = ExpectedUrl::builder()
.endpoint("projects/1337/packages")
.add_query_params(&[("package_type", "conan")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = Packages::builder()
.project(1337)
.package_type(PackageType::Conan)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_package_name() {
let endpoint = ExpectedUrl::builder()
.endpoint("projects/1337/packages")
.add_query_params(&[("package_name", "test")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = Packages::builder()
.project(1337)
.package_name("test")
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_include_versionless() {
let endpoint = ExpectedUrl::builder()
.endpoint("projects/1337/packages")
.add_query_params(&[("include_versionless", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = Packages::builder()
.project(1337)
.include_versionless(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_status() {
let endpoint = ExpectedUrl::builder()
.endpoint("projects/1337/packages")
.add_query_params(&[("status", "processing")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = Packages::builder()
.project(1337)
.status(PackageStatus::Processing)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
}