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 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 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}