Skip to main content

gitlab/api/users/impersonation_tokens/
impersonation_tokens.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::endpoint_prelude::*;
10use crate::api::ParamValue;
11
12/// States of impersonation tokens.
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
14#[non_exhaustive]
15pub enum ImpersonationTokenState {
16    /// All states.
17    All,
18    /// Filter to return only active tokens.
19    Active,
20    /// Filter to return only inactive tokens.
21    Inactive,
22}
23
24impl ImpersonationTokenState {
25    /// The scope as a query parameter.
26    pub(crate) fn as_str(self) -> &'static str {
27        match self {
28            ImpersonationTokenState::All => "all",
29            ImpersonationTokenState::Active => "active",
30            ImpersonationTokenState::Inactive => "inactive",
31        }
32    }
33}
34
35impl ParamValue<'static> for ImpersonationTokenState {
36    fn as_value(&self) -> Cow<'static, str> {
37        self.as_str().into()
38    }
39}
40
41/// Get impersonation tokens of a user.
42#[derive(Debug, Builder, Clone)]
43#[builder(setter(strip_option))]
44pub struct ImpersonationTokens {
45    /// The user to list impersonation tokens for.
46    user: u64,
47    /// Filter based on state.
48    #[builder(default)]
49    state: Option<ImpersonationTokenState>,
50}
51
52impl ImpersonationTokens {
53    /// Create a builder for the endpoint.
54    pub fn builder() -> ImpersonationTokensBuilder {
55        ImpersonationTokensBuilder::default()
56    }
57}
58
59impl Endpoint for ImpersonationTokens {
60    fn method(&self) -> Method {
61        Method::GET
62    }
63
64    fn endpoint(&self) -> Cow<'static, str> {
65        format!("users/{}/impersonation_tokens", self.user).into()
66    }
67
68    fn parameters(&self) -> QueryParams<'_> {
69        let mut params = QueryParams::default();
70
71        params.push_opt("state", self.state);
72
73        params
74    }
75}
76
77impl Pageable for ImpersonationTokens {}
78
79#[cfg(test)]
80mod tests {
81    use http::Method;
82
83    use crate::api::users::impersonation_tokens::{
84        ImpersonationTokenState, ImpersonationTokens, ImpersonationTokensBuilderError,
85    };
86    use crate::api::{self, Query};
87    use crate::test::client::{ExpectedUrl, SingleTestClient};
88
89    #[test]
90    fn impersonation_token_state_as_str() {
91        let items = &[
92            (ImpersonationTokenState::All, "all"),
93            (ImpersonationTokenState::Active, "active"),
94            (ImpersonationTokenState::Inactive, "inactive"),
95        ];
96
97        for (i, s) in items {
98            assert_eq!(i.as_str(), *s);
99        }
100    }
101
102    #[test]
103    fn user_is_necessary() {
104        let err = ImpersonationTokens::builder().build().unwrap_err();
105        crate::test::assert_missing_field!(err, ImpersonationTokensBuilderError, "user");
106    }
107
108    #[test]
109    fn user_is_sufficient() {
110        ImpersonationTokens::builder().user(1).build().unwrap();
111    }
112
113    #[test]
114    fn endpoint() {
115        let endpoint = ExpectedUrl::builder()
116            .method(Method::GET)
117            .endpoint("users/1/impersonation_tokens")
118            .build()
119            .unwrap();
120        let client = SingleTestClient::new_raw(endpoint, "");
121
122        let endpoint = ImpersonationTokens::builder().user(1).build().unwrap();
123        api::ignore(endpoint).query(&client).unwrap();
124    }
125
126    #[test]
127    fn endpoint_state() {
128        let endpoint = ExpectedUrl::builder()
129            .method(Method::GET)
130            .endpoint("users/1/impersonation_tokens")
131            .add_query_params(&[("state", "active")])
132            .build()
133            .unwrap();
134        let client = SingleTestClient::new_raw(endpoint, "");
135
136        let endpoint = ImpersonationTokens::builder()
137            .user(1)
138            .state(ImpersonationTokenState::Active)
139            .build()
140            .unwrap();
141        api::ignore(endpoint).query(&client).unwrap();
142    }
143}