gitlab/api/projects/deploy_keys/
create.rs

1// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
2// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
4// option. This file may not be copied, modified, or distributed
5// except according to those terms.
6
7use derive_builder::Builder;
8
9use crate::api::common::NameOrId;
10use crate::api::endpoint_prelude::*;
11
12/// Create a new deploy key on project.
13#[derive(Debug, Builder, Clone)]
14#[builder(setter(strip_option))]
15pub struct CreateDeployKey<'a> {
16    /// The project to add the deploy key to
17    #[builder(setter(into))]
18    project: NameOrId<'a>,
19    /// The title of the deploy key
20    #[builder(setter(into))]
21    title: Cow<'a, str>,
22    /// The key value as found in an openssh public key file or authorized_key file
23    #[builder(setter(into))]
24    key: Cow<'a, str>,
25    /// Can this deploy key push to the project repository
26    #[builder(default)]
27    can_push: Option<bool>,
28}
29
30impl<'a> CreateDeployKey<'a> {
31    /// Create a builder for the endpoint.
32    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}