use derive_builder::Builder;
use crate::api::common::NameOrId;
use crate::api::endpoint_prelude::*;
#[derive(Debug, Builder, Clone)]
#[builder(setter(strip_option))]
pub struct EditProjectPushRule<'a> {
#[builder(setter(into))]
project: NameOrId<'a>,
#[builder(setter(into), default)]
commit_message_regex: Option<Cow<'a, str>>,
#[builder(setter(into), default)]
commit_message_negative_regex: Option<Cow<'a, str>>,
#[builder(setter(into), default)]
branch_name_regex: Option<Cow<'a, str>>,
#[builder(default)]
deny_delete_tag: Option<bool>,
#[builder(default)]
member_check: Option<bool>,
#[builder(default)]
prevent_secrets: Option<bool>,
#[builder(setter(into), default)]
author_email_regex: Option<Cow<'a, str>>,
#[builder(setter(into), default)]
file_name_regex: Option<Cow<'a, str>>,
#[builder(default)]
max_file_size: Option<u64>,
#[builder(default)]
commit_committer_check: Option<bool>,
#[builder(default)]
reject_unsigned_commits: Option<bool>,
}
impl<'a> EditProjectPushRule<'a> {
pub fn builder() -> EditProjectPushRuleBuilder<'a> {
EditProjectPushRuleBuilder::default()
}
}
impl<'a> Endpoint for EditProjectPushRule<'a> {
fn method(&self) -> Method {
Method::PUT
}
fn endpoint(&self) -> Cow<'static, str> {
format!("projects/{}/push_rule", self.project).into()
}
fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
let mut params = FormParams::default();
params
.push_opt("commit_message_regex", self.commit_message_regex.as_ref())
.push_opt(
"commit_message_negative_regex",
self.commit_message_negative_regex.as_ref(),
)
.push_opt("branch_name_regex", self.branch_name_regex.as_ref())
.push_opt("deny_delete_tag", self.deny_delete_tag)
.push_opt("member_check", self.member_check)
.push_opt("prevent_secrets", self.prevent_secrets)
.push_opt("author_email_regex", self.author_email_regex.as_ref())
.push_opt("file_name_regex", self.file_name_regex.as_ref())
.push_opt("max_file_size", self.max_file_size)
.push_opt("commit_committer_check", self.commit_committer_check)
.push_opt("reject_unsigned_commits", self.reject_unsigned_commits);
params.into_body()
}
}
#[cfg(test)]
mod tests {
use http::Method;
use crate::api::projects::push_rule::{EditProjectPushRule, EditProjectPushRuleBuilderError};
use crate::api::{self, Query};
use crate::test::client::{ExpectedUrl, SingleTestClient};
#[test]
fn project_is_necessary() {
let err = EditProjectPushRule::builder().build().unwrap_err();
crate::test::assert_missing_field!(err, EditProjectPushRuleBuilderError, "project");
}
#[test]
fn project_is_sufficient() {
EditProjectPushRule::builder()
.project("project")
.build()
.unwrap();
}
#[test]
fn endpoint() {
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.endpoint("projects/simple%2Fproject/push_rule")
.content_type("application/x-www-form-urlencoded")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project("simple/project")
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_author_email_regex() {
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.content_type("application/x-www-form-urlencoded")
.endpoint("projects/10/push_rule")
.body_str("author_email_regex=%40test.domain")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project("10")
.author_email_regex("@test.domain")
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_branch_name_regex() {
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.content_type("application/x-www-form-urlencoded")
.endpoint("projects/10/push_rule")
.body_str("branch_name_regex=main%28line%29%7Cmaster")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project("10")
.branch_name_regex("main(line)|master")
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_commit_committer_check() {
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.content_type("application/x-www-form-urlencoded")
.endpoint("projects/10/push_rule")
.body_str("commit_committer_check=true")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project("10")
.commit_committer_check(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_commit_message_negative_regex() {
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.content_type("application/x-www-form-urlencoded")
.endpoint("projects/10/push_rule")
.body_str("commit_message_negative_regex=%5Ba-z%5D%2B%5C%28%5Cw%2B%5C%29%3A.*")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project("10")
.commit_message_negative_regex("[a-z]+\\(\\w+\\):.*")
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_commit_message_regex() {
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.content_type("application/x-www-form-urlencoded")
.endpoint("projects/10/push_rule")
.body_str("commit_message_regex=%5E%28%5BA-Z%5D%2B%5C-%5B0-9%5D%2B%29+%3A+%28.*%29")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project("10")
.commit_message_regex("^([A-Z]+\\-[0-9]+) : (.*)")
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_deny_delete_tag() {
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.content_type("application/x-www-form-urlencoded")
.endpoint("projects/10/push_rule")
.body_str("deny_delete_tag=true")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project("10")
.deny_delete_tag(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_file_name_regex() {
let file_name_regex = "^([A-Z]+\\-[0-9]+) : (.*)";
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.content_type("application/x-www-form-urlencoded")
.endpoint("projects/10/push_rule")
.body_str("file_name_regex=%5E%28%5BA-Z%5D%2B%5C-%5B0-9%5D%2B%29+%3A+%28.*%29")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project("10")
.file_name_regex(file_name_regex)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_max_file_size() {
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.content_type("application/x-www-form-urlencoded")
.endpoint("projects/10/push_rule")
.body_str("max_file_size=15")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project("10")
.max_file_size(15)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_member_check() {
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.content_type("application/x-www-form-urlencoded")
.endpoint("projects/10/push_rule")
.body_str("member_check=true")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project("10")
.member_check(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_prevent_secrets() {
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.content_type("application/x-www-form-urlencoded")
.endpoint("projects/10/push_rule")
.body_str("prevent_secrets=true")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project("10")
.prevent_secrets(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_reject_unsigned_commits() {
let endpoint = ExpectedUrl::builder()
.method(Method::PUT)
.content_type("application/x-www-form-urlencoded")
.endpoint("projects/10/push_rule")
.body_str("reject_unsigned_commits=true")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = EditProjectPushRule::builder()
.project(10)
.reject_unsigned_commits(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
}