meegle/file/
mod.rs

1pub mod api;
2pub mod types;
3
4#[cfg(test)]
5mod tests {
6    use super::api::FileApi;
7    use super::types::*;
8    use crate::{
9        client::{AuthType, Client},
10        workitem::{api::WorkItemApi, types::GetWorkItemDetailsRequestBuilder},
11    };
12    use dotenv::dotenv;
13    use std::env;
14
15    fn setup_test_client() -> Client {
16        dotenv().ok();
17
18        Client::new(
19            &env::var("MII_PLUGIN_ID").expect("MII_PLUGIN_ID not set"),
20            &env::var("MII_PLUGIN_SECRET").expect("MII_PLUGIN_SECRET not set"),
21            Some(&env::var("MII_BASE_URL").expect("MII_BASE_URL not set")),
22        )
23    }
24
25    #[tokio::test]
26    async fn test_upload_and_download_and_delete_work_item_file() {
27        let client = setup_test_client();
28        let user_key = env::var("MII_USER_KEY").expect("MII_USER_KEY not set");
29        let project_key = env::var("MII_PROJECT_KEY").expect("MII_PROJECT_KEY not set");
30        let work_item_type_key =
31            env::var("MII_WORK_ITEM_TYPE_KEY").expect("MII_WORK_ITEM_TYPE_KEY not set");
32        let work_item_id = env::var("MII_WORK_ITEM_ID")
33            .expect("MII_WORK_ITEM_ID not set")
34            .parse::<i64>()
35            .unwrap();
36        let file_field_key = env::var("MII_FILE_FIELD_KEY").expect("MII_FILE_FIELD_KEY not set");
37
38        let file_content = [0x89].to_vec();
39
40        let request = UploadWorkItemFileRequestBuilder::default()
41            .project_key(project_key.clone())
42            .work_item_type_key(work_item_type_key.clone())
43            .work_item_id(work_item_id)
44            .file(file_content)
45            .filename("test.png")
46            .field_key(file_field_key.clone())
47            .build()
48            .unwrap();
49
50        let result = client
51            .upload_work_item_file(
52                request,
53                AuthType::Plugin {
54                    user_key: user_key.clone(),
55                },
56            )
57            .await;
58
59        match result {
60            Ok(response) => {
61                println!("File uploaded successfully: {:?}", response);
62            }
63            Err(e) => {
64                println!("Upload failed: {:?}", e);
65                panic!("API request failed: {}", e);
66            }
67        }
68
69        let request = GetWorkItemDetailsRequestBuilder::default()
70            .work_item_ids(vec![work_item_id])
71            .build()
72            .unwrap();
73
74        let mut work_item_details = client
75            .get_work_item_details(
76                project_key.clone(),
77                work_item_type_key.clone(),
78                request,
79                AuthType::Plugin {
80                    user_key: user_key.clone(),
81                },
82            )
83            .await
84            .unwrap();
85
86        let file_uuid = work_item_details
87            .get_mut(0)
88            .unwrap()
89            .fields
90            .iter_mut()
91            .find_map(|field| {
92                if field.field_key.clone().unwrap() == file_field_key.clone() {
93                    Some(
94                        field
95                            .field_value
96                            .as_array_mut()
97                            .unwrap()
98                            .iter()
99                            .last()
100                            .unwrap()
101                            .as_object()
102                            .unwrap()
103                            .get("uid")
104                            .unwrap()
105                            .as_str(),
106                    )
107                } else {
108                    None
109                }
110            })
111            .unwrap();
112
113        println!("File UUID: {}", file_uuid.unwrap());
114        test_download_work_item_file(file_uuid.unwrap()).await;
115        test_delete_file(file_uuid.unwrap()).await;
116    }
117
118    #[tokio::test]
119    async fn test_upload_file() {
120        let client = setup_test_client();
121        let user_key = env::var("MII_USER_KEY").expect("MII_USER_KEY not set");
122        let project_key = env::var("MII_PROJECT_KEY").expect("MII_PROJECT_KEY not set");
123
124        let file_content = b"test file content".to_vec();
125
126        let request = UploadFileRequestBuilder::default()
127            .project_key(project_key)
128            .file(file_content)
129            .filename("test.txt")
130            .build()
131            .unwrap();
132
133        let result = client
134            .upload_file(request, AuthType::Plugin { user_key })
135            .await;
136
137        match result {
138            Ok(response) => {
139                println!("File uploaded successfully: {:?}", response);
140            }
141            Err(e) => {
142                println!("Upload failed: {:?}", e);
143                panic!("API request failed: {}", e);
144            }
145        }
146    }
147
148    // #[tokio::test]
149    async fn test_download_work_item_file(uuid: &str) {
150        let client = setup_test_client();
151        let user_key = env::var("MII_USER_KEY").expect("MII_USER_KEY not set");
152        let project_key = env::var("MII_PROJECT_KEY").expect("MII_PROJECT_KEY not set");
153        let work_item_type_key =
154            env::var("MII_WORK_ITEM_TYPE_KEY").expect("MII_WORK_ITEM_TYPE_KEY not set");
155        let work_item_id = env::var("MII_WORK_ITEM_ID")
156            .expect("MII_WORK_ITEM_ID not set")
157            .parse::<i64>()
158            .unwrap();
159
160        let request = DownloadWorkItemFileRequest {
161            project_key,
162            work_item_type_key,
163            work_item_id,
164            uuid: uuid.to_string(),
165        };
166
167        let result = client
168            .download_work_item_file(request, AuthType::Plugin { user_key })
169            .await;
170
171        match result {
172            Ok(response) => {
173                println!(
174                    "File downloaded successfully, size: {} bytes",
175                    response.len()
176                );
177            }
178            Err(e) => {
179                println!("Download failed: {:?}", e);
180                panic!("API request failed: {}", e);
181            }
182        }
183    }
184
185    // #[tokio::test]
186    async fn test_delete_file(uuid: &str) {
187        let client = setup_test_client();
188        let user_key = env::var("MII_USER_KEY").expect("MII_USER_KEY not set");
189        let project_key = env::var("MII_PROJECT_KEY").expect("MII_PROJECT_KEY not set");
190        let work_item_id = env::var("MII_WORK_ITEM_ID").expect("MII_WORK_ITEM_ID not set");
191        let field_key = env::var("MII_FILE_FIELD_KEY").expect("MII_FILE_FIELD_KEY not set");
192
193        let request = DeleteFileRequest {
194            project_key,
195            work_item_id,
196            uuids: vec![uuid.to_string()],
197            field_key: Some(field_key),
198            ..Default::default()
199        };
200
201        let result = client
202            .delete_file(request, AuthType::Plugin { user_key })
203            .await;
204
205        match result {
206            Ok(response) => {
207                println!("File deleted successfully: {:?}", response);
208            }
209            Err(e) => {
210                println!("Delete failed: {:?}", e);
211                panic!("API request failed: {}", e);
212            }
213        }
214    }
215}