gitlab/api/projects/deploy_keys/
create.rs1use derive_builder::Builder;
8
9use crate::api::common::NameOrId;
10use crate::api::endpoint_prelude::*;
11
12#[derive(Debug, Builder, Clone)]
14#[builder(setter(strip_option))]
15pub struct CreateDeployKey<'a> {
16 #[builder(setter(into))]
18 project: NameOrId<'a>,
19 #[builder(setter(into))]
21 title: Cow<'a, str>,
22 #[builder(setter(into))]
24 key: Cow<'a, str>,
25 #[builder(default)]
27 can_push: Option<bool>,
28}
29
30impl<'a> CreateDeployKey<'a> {
31 pub fn builder() -> CreateDeployKeyBuilder<'a> {
33 CreateDeployKeyBuilder::default()
34 }
35}
36
37impl Endpoint for CreateDeployKey<'_> {
38 fn method(&self) -> Method {
39 Method::POST
40 }
41
42 fn endpoint(&self) -> Cow<'static, str> {
43 format!("projects/{}/deploy_keys", self.project).into()
44 }
45
46 fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
47 let mut params = FormParams::default();
48
49 params
50 .push("title", self.title.as_ref())
51 .push("key", self.key.as_ref())
52 .push_opt("can_push", self.can_push);
53
54 params.into_body()
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use http::Method;
61
62 use crate::api::projects::deploy_keys::{CreateDeployKey, CreateDeployKeyBuilderError};
63 use crate::api::{self, Query};
64 use crate::test::client::{ExpectedUrl, SingleTestClient};
65
66 #[test]
67 fn project_source_branch_target_branch_and_title_are_necessary() {
68 let err = CreateDeployKey::builder().build().unwrap_err();
69 crate::test::assert_missing_field!(err, CreateDeployKeyBuilderError, "project");
70 }
71
72 #[test]
73 fn project_is_necessary() {
74 let err = CreateDeployKey::builder()
75 .title("title")
76 .key("ssh-rsa ABC")
77 .build()
78 .unwrap_err();
79 crate::test::assert_missing_field!(err, CreateDeployKeyBuilderError, "project");
80 }
81
82 #[test]
83 fn title_is_necessary() {
84 let err = CreateDeployKey::builder()
85 .project(1)
86 .key("ssh-rsa ABC")
87 .build()
88 .unwrap_err();
89 crate::test::assert_missing_field!(err, CreateDeployKeyBuilderError, "title");
90 }
91
92 #[test]
93 fn key_is_necessary() {
94 let err = CreateDeployKey::builder()
95 .project(1)
96 .title("title")
97 .build()
98 .unwrap_err();
99 crate::test::assert_missing_field!(err, CreateDeployKeyBuilderError, "key");
100 }
101
102 #[test]
103 fn project_title_and_key_are_sufficient() {
104 CreateDeployKey::builder()
105 .project(1)
106 .title("title")
107 .key("ssh-rsa ABC")
108 .build()
109 .unwrap();
110 }
111
112 #[test]
113 fn endpoint() {
114 let endpoint = ExpectedUrl::builder()
115 .method(Method::POST)
116 .endpoint("projects/simple%2Fproject/deploy_keys")
117 .content_type("application/x-www-form-urlencoded")
118 .body_str(concat!("title=title", "&key=ssh-rsa+ABC"))
119 .build()
120 .unwrap();
121 let client = SingleTestClient::new_raw(endpoint, "");
122
123 let endpoint = CreateDeployKey::builder()
124 .project("simple/project")
125 .title("title")
126 .key("ssh-rsa ABC")
127 .build()
128 .unwrap();
129 api::ignore(endpoint).query(&client).unwrap();
130 }
131
132 #[test]
133 fn endpoint_can_push() {
134 let endpoint = ExpectedUrl::builder()
135 .method(Method::POST)
136 .endpoint("projects/simple%2Fproject/deploy_keys")
137 .content_type("application/x-www-form-urlencoded")
138 .body_str(concat!("title=title", "&key=ssh-rsa+ABC", "&can_push=true"))
139 .build()
140 .unwrap();
141 let client = SingleTestClient::new_raw(endpoint, "");
142
143 let endpoint = CreateDeployKey::builder()
144 .project("simple/project")
145 .title("title")
146 .key("ssh-rsa ABC")
147 .can_push(true)
148 .build()
149 .unwrap();
150 api::ignore(endpoint).query(&client).unwrap();
151 }
152}