1pub mod error;
5pub mod users;
6pub mod repos;
7pub mod issues;
8pub mod pulls;
9pub mod labels;
10pub mod files;
11pub mod notifications;
12pub mod releases;
13pub mod wikis;
14pub(crate) mod utils;
15
16use reqwest::Client;
17use std::env;
18
19pub use crate::error::GiteeError;
20pub use crate::users::{User, SearchUserResult};
21pub use crate::repos::Repository;
22pub use crate::issues::{Issue, Milestone, Comment as IssueComment};
23pub use crate::pulls::{PullRequest, BranchRef, FileDiff, Comment as PullComment};
24pub use crate::labels::Label;
25pub use crate::files::{FileContent, RepoFile};
26pub use crate::notifications::{Notification};
27pub use crate::releases::{Release};
28pub use crate::wikis::{WikiPage};
29
30pub struct GiteeClient {
32 client: Client,
33 base_url: String,
34 token: String,
35}
36
37impl GiteeClient {
38 pub fn new(token: Option<String>, base_url: Option<String>) -> Result<Self, error::GiteeError> {
40 let token = token.or_else(|| env::var("GITEE_TOKEN").ok())
41 .ok_or(error::GiteeError::TokenNotFound)?;
42
43 let base_url = base_url.or_else(|| env::var("GITEE_API_BASE").ok())
44 .unwrap_or_else(|| "https://gitee.com/api/v5".to_string());
45
46 Ok(GiteeClient {
47 client: Client::new(),
48 base_url,
49 token,
50 })
51 }
52
53 pub fn client(&self) -> &Client {
55 &self.client
56 }
57
58 pub fn base_url(&self) -> &str {
60 &self.base_url
61 }
62
63 pub fn token(&self) -> &str {
65 &self.token
66 }
67
68 pub fn auth_header(&self) -> String {
70 format!("token {}", self.token)
71 }
72}
73
74#[cfg(test)]
75mod tests {
76 use super::*;
77 use serde_json::json;
78
79 #[test]
80 fn test_client_creation() {
81 std::env::set_var("GITEE_TOKEN", "fake_token");
82 let client = GiteeClient::new(None, None).unwrap();
83 assert_eq!(client.token(), "fake_token");
84 assert_eq!(client.base_url(), "https://gitee.com/api/v5");
85 }
86
87 #[test]
88 fn test_data_structures_deserialization() {
89 let user_json = json!({
90 "id": 12345,
91 "login": "testuser",
92 "name": "Test User",
93 "avatar_url": "https://gitee.com/assets/favicon.ico",
94 "html_url": "https://gitee.com/testuser"
95 });
96
97 let user: User = serde_json::from_value(user_json).unwrap();
98 assert_eq!(user.id, "12345");
99 assert_eq!(user.login, "testuser");
100 }
101
102 #[test]
103 fn test_label_structure_deserialization() {
104 let label_json = json!({
105 "id": "1",
106 "name": "bug",
107 "color": "FF0000",
108 "url": "https://gitee.com/api/v5/repos/owner/repo/labels/bug"
109 });
110
111 let label: Label = serde_json::from_value(label_json).unwrap();
112 assert_eq!(label.id, "1");
113 assert_eq!(label.name, "bug");
114 }
115
116 #[test]
117 fn test_pull_request_structure_deserialization() {
118 let pr_json = json!({
119 "id": 100,
120 "number": "1",
121 "title": "Test PR",
122 "state": "open",
123 "html_url": "https://gitee.com/owner/repo/pulls/1",
124 "created_at": "2023-01-01T00:00:00Z",
125 "updated_at": "2023-01-01T00:00:00Z",
126 "head": {
127 "label": "feature",
128 "ref": "feature",
129 "sha": "123456",
130 "user": {
131 "id": 1,
132 "login": "user",
133 "avatar_url": "",
134 "html_url": ""
135 }
136 },
137 "base": {
138 "label": "master",
139 "ref": "master",
140 "sha": "654321",
141 "user": {
142 "id": 2,
143 "login": "owner",
144 "avatar_url": "",
145 "html_url": ""
146 }
147 }
148 });
149
150 let pr: PullRequest = serde_json::from_value(pr_json).unwrap();
151 assert_eq!(pr.id, "100");
152 assert_eq!(pr.number, "1");
153 assert_eq!(pr.title, "Test PR");
154 }
155
156 #[test]
157 fn test_issue_structure_deserialization() {
158 let issue_json = json!({
159 "id": 123,
160 "number": "I6TABC",
161 "title": "Test Issue",
162 "state": "open",
163 "html_url": "https://gitee.com/owner/repo/issues/I6TABC",
164 "created_at": "2023-01-01T00:00:00Z",
165 "updated_at": "2023-01-01T00:00:00Z"
166 });
167
168 let issue: Issue = serde_json::from_value(issue_json).unwrap();
169 assert_eq!(issue.id, "123");
170 assert_eq!(issue.number, "I6TABC");
171 }
172
173 #[test]
174 fn test_milestone_structure_deserialization() {
175 let milestone_json = json!({
176 "id": 456,
177 "title": "v1.0",
178 "description": "First release",
179 "state": "open"
180 });
181
182 let milestone: Milestone = serde_json::from_value(milestone_json).unwrap();
183 assert_eq!(milestone.id, "456");
184 assert_eq!(milestone.title, "v1.0");
185 }
186}