openai_interface/files/list/
mod.rs

1pub mod request;
2pub mod response;
3
4#[cfg(test)]
5mod tests {
6    use std::sync::LazyLock;
7
8    use super::request::*;
9    use crate::rest::get::{Get, GetNoStream};
10
11    const QWEN_BASE_URL: &'static str = "https://dashscope.aliyuncs.com/compatible-mode/v1/";
12    const QWEN_API_KEY: LazyLock<&str> =
13        LazyLock::new(|| include_str!("../../../keys/modelstudio_domestic_key").trim());
14
15    #[test]
16    fn test_build_url_no_params() {
17        let request = ListFilesRequest::default();
18        let base_url = "https://api.openai.com/v1/";
19        let url = request.build_url(base_url);
20        assert_eq!(url, "https://api.openai.com/v1/files");
21    }
22
23    #[test]
24    fn test_build_url_with_purpose() {
25        let request = ListFilesRequest {
26            purpose: Some("fine-tune".to_string()),
27            ..Default::default()
28        };
29        let base_url = "https://api.openai.com/v1/";
30        let url = request.build_url(base_url);
31        assert_eq!(url, "https://api.openai.com/v1/files?purpose=fine-tune");
32    }
33
34    #[test]
35    fn test_build_url_with_limit() {
36        let request = ListFilesRequest {
37            limit: Some(100),
38            ..Default::default()
39        };
40        let base_url = "https://api.openai.com/v1/";
41        let url = request.build_url(base_url);
42        assert_eq!(url, "https://api.openai.com/v1/files?limit=100");
43    }
44
45    #[test]
46    fn test_build_url_with_after() {
47        let request = ListFilesRequest {
48            after: Some("file_123".to_string()),
49            ..Default::default()
50        };
51        let base_url = "https://api.openai.com/v1/";
52        let url = request.build_url(base_url);
53        assert_eq!(url, "https://api.openai.com/v1/files?after=file_123");
54    }
55
56    #[test]
57    fn test_build_url_with_all_params() {
58        let request = ListFilesRequest {
59            purpose: Some("assistants".to_string()),
60            limit: Some(50),
61            after: Some("file_abc".to_string()),
62        };
63        let base_url = "https://api.openai.com/v1/";
64        let url = request.build_url(base_url);
65        // Note: URL parameters are ordered alphabetically by the url crate
66        assert!(url.contains("after=file_abc"));
67        assert!(url.contains("limit=50"));
68        assert!(url.contains("purpose=assistants"));
69        assert!(url.starts_with("https://api.openai.com/v1/files?"));
70    }
71
72    #[test]
73    fn test_build_url_encoding() {
74        let request = ListFilesRequest {
75            purpose: Some("fine tune".to_string()), // Space should be encoded
76            ..Default::default()
77        };
78        let base_url = "https://api.openai.com/v1/";
79        let url = request.build_url(base_url);
80        assert_eq!(url, "https://api.openai.com/v1/files?purpose=fine+tune");
81    }
82
83    #[tokio::test]
84    async fn test_query_qwen_no_params() -> Result<(), anyhow::Error> {
85        let request = ListFilesRequest::default();
86        let response = request.get_response(QWEN_BASE_URL, &QWEN_API_KEY).await?;
87
88        println!("Response: {:?}", response);
89
90        Ok(())
91    }
92
93    #[tokio::test]
94    async fn test_query_qwen_with_params() -> Result<(), anyhow::Error> {
95        let request = ListFilesRequest {
96            purpose: Some("batch".to_string()),
97            limit: Some(1),
98            // after: Some("file_123".to_string()),
99            ..Default::default()
100        };
101        let response = request.get_response(QWEN_BASE_URL, &QWEN_API_KEY).await?;
102
103        println!("Response: {:?}", response);
104
105        Ok(())
106    }
107}