gitlab/api/projects/packages/generic/
get.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 crate::api::common::{self, NameOrId};
8use crate::api::endpoint_prelude::*;
9use derive_builder::Builder;
10
11/// Upload a package file of a single package.
12#[derive(Debug, Builder, Clone)]
13pub struct GetPackageFile<'a> {
14    /// The project to query for the packages.
15    #[builder(setter(into))]
16    project: NameOrId<'a>,
17
18    /// The package name.
19    ///
20    /// It can contain only lowercase letters (a-z),
21    /// uppercase letter (A-Z), numbers (0-9), dots (.),
22    /// hyphens (-), or underscores (_).
23    #[builder(setter(into))]
24    package_name: Cow<'a, str>,
25
26    /// The package version.
27    ///
28    /// The following regex validates this: \A(\.?[\w\+-]+\.?)+\z.
29    #[builder(setter(into))]
30    package_version: Cow<'a, str>,
31
32    /// The filename.
33    ///
34    /// It can contain only lowercase letters (a-z),
35    /// uppercase letter (A-Z), numbers (0-9), dots (.),
36    /// hyphens (-), or underscores (_).
37    #[builder(setter(into))]
38    file_name: Cow<'a, str>,
39}
40
41impl<'a> GetPackageFile<'a> {
42    /// Create a builder for the endpoint.
43    pub fn builder() -> GetPackageFileBuilder<'a> {
44        GetPackageFileBuilder::default()
45    }
46}
47
48impl Endpoint for GetPackageFile<'_> {
49    fn method(&self) -> Method {
50        Method::GET
51    }
52
53    fn endpoint(&self) -> Cow<'static, str> {
54        format!(
55            "projects/{}/packages/generic/{}/{}/{}",
56            self.project,
57            common::path_escaped(self.package_name.as_ref()),
58            common::path_escaped(self.package_version.as_ref()),
59            common::directory_path_escaped(self.file_name.as_ref()),
60        )
61        .into()
62    }
63}
64
65#[cfg(test)]
66mod tests {
67    use http::Method;
68
69    use crate::{
70        api::{
71            self,
72            projects::packages::generic::get::{GetPackageFile, GetPackageFileBuilderError},
73            Query,
74        },
75        test::client::{ExpectedUrl, SingleTestClient},
76    };
77
78    #[test]
79    fn project_is_needed() {
80        let err = GetPackageFile::builder()
81            .package_name("test_package")
82            .package_version("1.2.3")
83            .file_name("test_file.zip")
84            .build()
85            .unwrap_err();
86        crate::test::assert_missing_field!(err, GetPackageFileBuilderError, "project");
87    }
88
89    #[test]
90    fn package_name_is_needed() {
91        let err = GetPackageFile::builder()
92            .project(1337)
93            .package_version("1.2.3")
94            .file_name("test_file.zip")
95            .build()
96            .unwrap_err();
97        crate::test::assert_missing_field!(err, GetPackageFileBuilderError, "package_name");
98    }
99
100    #[test]
101    fn package_version_is_needed() {
102        let err = GetPackageFile::builder()
103            .project(1337)
104            .package_name("test_package")
105            .file_name("test_file.zip")
106            .build()
107            .unwrap_err();
108        crate::test::assert_missing_field!(err, GetPackageFileBuilderError, "package_version");
109    }
110
111    #[test]
112    fn file_name_is_needed() {
113        let err = GetPackageFile::builder()
114            .project(1337)
115            .package_name("test_package")
116            .package_version("1.2.3")
117            .build()
118            .unwrap_err();
119        crate::test::assert_missing_field!(err, GetPackageFileBuilderError, "file_name");
120    }
121
122    #[test]
123    fn required_parameter_are_sufficient() {
124        GetPackageFile::builder()
125            .project(1)
126            .package_name("test_package")
127            .package_version("1.2.3")
128            .file_name("test_file.zip")
129            .build()
130            .unwrap();
131    }
132
133    #[test]
134    fn endpoint() {
135        let endpoint = ExpectedUrl::builder()
136            .method(Method::GET)
137            .endpoint("projects/1337/packages/generic/test_package/1.2.3/test_file.zip")
138            .build()
139            .unwrap();
140        let client = SingleTestClient::new_raw(endpoint, "");
141
142        let endpoint = GetPackageFile::builder()
143            .project(1337)
144            .package_name("test_package")
145            .package_version("1.2.3")
146            .file_name("test_file.zip")
147            .build()
148            .unwrap();
149        api::ignore(endpoint).query(&client).unwrap();
150    }
151
152    #[test]
153    fn endpoint_pathed() {
154        let endpoint = ExpectedUrl::builder()
155            .method(Method::GET)
156            .endpoint("projects/1337/packages/generic/test_package%2Fwith_dir/subpkg%2F1.2.3/test_dir/file.zip")
157            .build()
158            .unwrap();
159        let client = SingleTestClient::new_raw(endpoint, "");
160
161        let endpoint = GetPackageFile::builder()
162            .project(1337)
163            .package_name("test_package/with_dir")
164            .package_version("subpkg/1.2.3")
165            .file_name("test_dir/file.zip")
166            .build()
167            .unwrap();
168        api::ignore(endpoint).query(&client).unwrap();
169    }
170}