qlty_coverage/ci/
codefresh.rs1use 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 "".to_string()
74 }
75
76 fn pull_url(&self) -> String {
77 "".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}