openai_interface/files/list/
mod.rs1pub mod request;
36pub mod response;
37
38#[cfg(test)]
39mod tests {
40 use super::request::*;
41 use crate::rest::{
42 RequestOptions, default_client,
43 get::{Get, GetNoStream},
44 };
45
46 const QWEN_BASE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/v1/";
47
48 fn qwen_api_key() -> Option<String> {
49 std::env::var("QWEN_API_KEY")
50 .ok()
51 .map(|key| key.trim().to_string())
52 .filter(|key| !key.is_empty())
53 }
54
55 #[test]
56 fn test_build_url_no_params() {
57 let request = ListFilesRequest::default();
58 let base_url = "https://api.openai.com/v1/";
59 let url = request.build_url(base_url).expect("Failed to build url");
60 assert_eq!(url, "https://api.openai.com/v1/files");
61 }
62
63 #[test]
64 fn test_build_url_with_purpose() {
65 let request = ListFilesRequest {
66 purpose: Some("fine-tune".to_string()),
67 ..Default::default()
68 };
69 let base_url = "https://api.openai.com/v1/";
70 let url = request.build_url(base_url).expect("Failed to build url");
71 assert_eq!(url, "https://api.openai.com/v1/files?purpose=fine-tune");
72 }
73
74 #[test]
75 fn test_build_url_with_limit() {
76 let request = ListFilesRequest {
77 limit: Some(100),
78 ..Default::default()
79 };
80 let base_url = "https://api.openai.com/v1/";
81 let url = request.build_url(base_url).expect("Failed to build url");
82 assert_eq!(url, "https://api.openai.com/v1/files?limit=100");
83 }
84
85 #[test]
86 fn test_build_url_with_after() {
87 let request = ListFilesRequest {
88 after: Some("file_123".to_string()),
89 ..Default::default()
90 };
91 let base_url = "https://api.openai.com/v1/";
92 let url = request.build_url(base_url).expect("Failed to build url");
93 assert_eq!(url, "https://api.openai.com/v1/files?after=file_123");
94 }
95
96 #[test]
97 fn test_build_url_with_all_params() {
98 let request = ListFilesRequest {
99 purpose: Some("assistants".to_string()),
100 limit: Some(50),
101 after: Some("file_abc".to_string()),
102 order: Some(ListOrder::Asc),
103 };
104 let base_url = "https://api.openai.com/v1/";
105 let url = request.build_url(base_url).expect("Failed to build url");
106 assert!(url.contains("after=file_abc"));
108 assert!(url.contains("limit=50"));
109 assert!(url.contains("order=asc"));
110 assert!(url.contains("purpose=assistants"));
111 assert!(url.starts_with("https://api.openai.com/v1/files?"));
112 }
113
114 #[test]
115 fn test_build_url_encoding() {
116 let request = ListFilesRequest {
117 purpose: Some("fine tune".to_string()), ..Default::default()
119 };
120 let base_url = "https://api.openai.com/v1/";
121 let url = request.build_url(base_url).expect("Failed to build url");
122 assert_eq!(url, "https://api.openai.com/v1/files?purpose=fine+tune");
123 }
124
125 #[tokio::test]
126 async fn test_query_qwen_no_params() -> Result<(), anyhow::Error> {
127 let Some(api_key) = qwen_api_key() else {
128 println!("Skipping: set QWEN_API_KEY to run this test");
129 return Ok(());
130 };
131
132 let request = ListFilesRequest::default();
133 let response = request
134 .get_response(
135 &default_client(),
136 QWEN_BASE_URL,
137 &RequestOptions::bearer(&api_key),
138 )
139 .await?;
140
141 println!("Response: {:?}", response);
142
143 Ok(())
144 }
145
146 #[tokio::test]
147 async fn test_query_qwen_with_params() -> Result<(), anyhow::Error> {
148 let Some(api_key) = qwen_api_key() else {
149 println!("Skipping: set QWEN_API_KEY to run this test");
150 return Ok(());
151 };
152
153 let request = ListFilesRequest {
154 purpose: Some("batch".to_string()),
155 limit: Some(1),
156 ..Default::default()
158 };
159 let response = request
160 .get_response(
161 &default_client(),
162 QWEN_BASE_URL,
163 &RequestOptions::bearer(&api_key),
164 )
165 .await?;
166
167 println!("Response: {:?}", response);
168
169 Ok(())
170 }
171}