Skip to main content

gitee_rs/
lib.rs

1//! Gitee Core Library
2//! Provides a unified interface for interacting with Gitee API
3
4pub 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
30/// Gitee API Client
31pub struct GiteeClient {
32    client: Client,
33    base_url: String,
34    token: String,
35}
36
37impl GiteeClient {
38    /// Creates a new GiteeClient instance
39    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    /// Get the HTTP client
54    pub fn client(&self) -> &Client {
55        &self.client
56    }
57
58    /// Get the API base URL
59    pub fn base_url(&self) -> &str {
60        &self.base_url
61    }
62
63    /// Get the authentication token
64    pub fn token(&self) -> &str {
65        &self.token
66    }
67
68    /// Build authorization header value
69    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}