qlty_coverage/ci/
codefresh.rs

1use crate::{
2    ci::CI,
3    env::{EnvSource, SystemEnv},
4};
5
6#[derive(Debug)]
7pub struct Codefresh {
8    env: Box<dyn EnvSource>,
9}
10
11impl Default for Codefresh {
12    fn default() -> Self {
13        Self {
14            env: Box::<SystemEnv>::default(),
15        }
16    }
17}
18
19impl CI for Codefresh {
20    fn detect(&self) -> bool {
21        !self
22            .env
23            .var("CF_PIPELINE_NAME")
24            .unwrap_or_default()
25            .is_empty()
26    }
27
28    fn ci_name(&self) -> String {
29        "Codefresh".to_string()
30    }
31
32    fn ci_url(&self) -> String {
33        self.env.var("CF_URL").unwrap_or_default()
34    }
35
36    fn branch(&self) -> String {
37        self.env.var("CF_BRANCH").unwrap_or_default()
38    }
39
40    fn workflow(&self) -> String {
41        self.env.var("CF_PIPELINE_NAME").unwrap_or_default()
42    }
43
44    fn job(&self) -> String {
45        self.env.var("CF_STEP_NAME").unwrap_or_default()
46    }
47
48    fn build_id(&self) -> String {
49        self.env.var("CF_BUILD_ID").unwrap_or_default()
50    }
51
52    fn build_url(&self) -> String {
53        self.env.var("CF_BUILD_URL").unwrap_or_default()
54    }
55
56    fn pull_number(&self) -> String {
57        self.env.var("CF_PULL_REQUEST_NUMBER").unwrap_or_default()
58    }
59
60    fn repository_name(&self) -> String {
61        let repository_owner = self.env.var("CF_REPO_OWNER").unwrap_or_default();
62        let repository_name = self.env.var("CF_REPO_NAME").unwrap_or_default();
63
64        if repository_owner.is_empty() || repository_name.is_empty() {
65            "".to_string()
66        } else {
67            format!("{}/{}", repository_owner, repository_name)
68        }
69    }
70
71    fn repository_url(&self) -> String {
72        // Codefresh does not provide a repository URL
73        "".to_string()
74    }
75
76    fn pull_url(&self) -> String {
77        // Codefresh does not provide a pull request URL
78        "".to_string()
79    }
80
81    fn commit_sha(&self) -> String {
82        self.env.var("CF_REVISION").unwrap_or_default()
83    }
84}
85
86#[cfg(test)]
87mod test {
88    use super::*;
89    use std::collections::HashMap;
90
91    #[derive(Debug, Clone, Default)]
92    pub struct HashMapEnv {
93        inner: HashMap<String, String>,
94    }
95
96    impl HashMapEnv {
97        pub fn new(env: HashMap<String, String>) -> Self {
98            Self { inner: env }
99        }
100    }
101
102    impl EnvSource for HashMapEnv {
103        fn var(&self, name: &str) -> Option<String> {
104            self.inner.get(name).cloned()
105        }
106    }
107
108    #[test]
109    fn detect_ci() {
110        let ci = Codefresh {
111            env: Box::new(HashMapEnv::default()),
112        };
113        assert_eq!(ci.detect(), false);
114
115        let mut env: HashMap<String, String> = HashMap::default();
116        env.insert("CF_PIPELINE_NAME".to_string(), "tests".to_string());
117        let ci = Codefresh {
118            env: Box::new(HashMapEnv::new(env)),
119        };
120        assert_eq!(ci.detect(), true);
121        assert_eq!(&ci.ci_name(), "Codefresh");
122    }
123
124    #[test]
125    fn ci_url() {
126        let mut env: HashMap<String, String> = HashMap::default();
127        env.insert("CF_URL".to_string(), "https://codefresh.io".to_string());
128
129        let ci = Codefresh {
130            env: Box::new(HashMapEnv::new(env)),
131        };
132        assert_eq!(&ci.ci_url(), "https://codefresh.io");
133    }
134
135    #[test]
136    fn branch() {
137        let mut env: HashMap<String, String> = HashMap::default();
138        env.insert("CF_BRANCH".to_string(), "main".to_string());
139
140        let ci = Codefresh {
141            env: Box::new(HashMapEnv::new(env)),
142        };
143        assert_eq!(&ci.branch(), "main");
144    }
145
146    #[test]
147    fn workflow() {
148        let mut env: HashMap<String, String> = HashMap::default();
149        env.insert("CF_PIPELINE_NAME".to_string(), "pipepline_name".to_string());
150
151        let ci = Codefresh {
152            env: Box::new(HashMapEnv::new(env)),
153        };
154        assert_eq!(&ci.workflow(), "pipepline_name");
155    }
156
157    #[test]
158    fn job() {
159        let mut env: HashMap<String, String> = HashMap::default();
160        env.insert("CF_STEP_NAME".to_string(), "step_name".to_string());
161
162        let ci = Codefresh {
163            env: Box::new(HashMapEnv::new(env)),
164        };
165        assert_eq!(&ci.job(), "step_name");
166    }
167
168    #[test]
169    fn build_id() {
170        let mut env: HashMap<String, String> = HashMap::default();
171        env.insert("CF_BUILD_ID".to_string(), "1234".to_string());
172
173        let ci = Codefresh {
174            env: Box::new(HashMapEnv::new(env)),
175        };
176        assert_eq!(&ci.build_id(), "1234");
177    }
178
179    #[test]
180    fn build_url() {
181        let mut env: HashMap<String, String> = HashMap::default();
182        env.insert(
183            "CF_BUILD_URL".to_string(),
184            "http://example.com/build/1234".to_string(),
185        );
186
187        let ci = Codefresh {
188            env: Box::new(HashMapEnv::new(env)),
189        };
190        assert_eq!(&ci.build_url(), "http://example.com/build/1234");
191    }
192
193    #[test]
194    fn pull_number() {
195        let mut env: HashMap<String, String> = HashMap::default();
196        env.insert("CF_PULL_REQUEST_NUMBER".to_string(), "43".to_string());
197
198        let ci = Codefresh {
199            env: Box::new(HashMapEnv::new(env)),
200        };
201        assert_eq!(&ci.pull_number(), "43");
202    }
203
204    #[test]
205    fn repository_name() {
206        let mut env: HashMap<String, String> = HashMap::default();
207
208        env.insert("CF_REPO_OWNER".to_string(), "owner_name".to_string());
209
210        env.insert("CF_REPO_NAME".to_string(), "repo_name".to_string());
211
212        let ci = Codefresh {
213            env: Box::new(HashMapEnv::new(env)),
214        };
215        assert_eq!(&ci.repository_name(), "owner_name/repo_name");
216    }
217
218    #[test]
219    fn repository_url() {
220        let env: HashMap<String, String> = HashMap::default();
221
222        let ci = Codefresh {
223            env: Box::new(HashMapEnv::new(env)),
224        };
225        assert_eq!(&ci.repository_url(), "");
226    }
227
228    #[test]
229    fn pull_url() {
230        let env: HashMap<String, String> = HashMap::default();
231
232        let ci = Codefresh {
233            env: Box::new(HashMapEnv::new(env)),
234        };
235        assert_eq!(&ci.pull_url(), "");
236    }
237
238    #[test]
239    fn commit_sha() {
240        let mut env: HashMap<String, String> = HashMap::default();
241        env.insert(
242            "CF_REVISION".to_string(),
243            "aca725d7c7f20a91575ed1d2616cf8bffa635704".to_string(),
244        );
245
246        let ci = Codefresh {
247            env: Box::new(HashMapEnv::new(env)),
248        };
249        assert_eq!(&ci.commit_sha(), "aca725d7c7f20a91575ed1d2616cf8bffa635704");
250    }
251}