this repo has no description
1mod common;
2use common::*;
3use reqwest::StatusCode;
4use reqwest::header;
5use serde_json::Value;
6
7#[tokio::test]
8async fn test_get_latest_commit_success() {
9 let client = client();
10 let (_, did) = create_account_and_login(&client).await;
11
12 let params = [("did", did.as_str())];
13 let res = client
14 .get(format!(
15 "{}/xrpc/com.atproto.sync.getLatestCommit",
16 base_url().await
17 ))
18 .query(¶ms)
19 .send()
20 .await
21 .expect("Failed to send request");
22
23 assert_eq!(res.status(), StatusCode::OK);
24 let body: Value = res.json().await.expect("Response was not valid JSON");
25 assert!(body["cid"].is_string());
26 assert!(body["rev"].is_string());
27}
28
29#[tokio::test]
30async fn test_get_latest_commit_not_found() {
31 let client = client();
32 let params = [("did", "did:plc:nonexistent12345")];
33 let res = client
34 .get(format!(
35 "{}/xrpc/com.atproto.sync.getLatestCommit",
36 base_url().await
37 ))
38 .query(¶ms)
39 .send()
40 .await
41 .expect("Failed to send request");
42
43 assert_eq!(res.status(), StatusCode::NOT_FOUND);
44 let body: Value = res.json().await.expect("Response was not valid JSON");
45 assert_eq!(body["error"], "RepoNotFound");
46}
47
48#[tokio::test]
49async fn test_get_latest_commit_missing_param() {
50 let client = client();
51 let res = client
52 .get(format!(
53 "{}/xrpc/com.atproto.sync.getLatestCommit",
54 base_url().await
55 ))
56 .send()
57 .await
58 .expect("Failed to send request");
59
60 assert_eq!(res.status(), StatusCode::BAD_REQUEST);
61}
62
63#[tokio::test]
64async fn test_list_repos() {
65 let client = client();
66 let _ = create_account_and_login(&client).await;
67
68 let res = client
69 .get(format!(
70 "{}/xrpc/com.atproto.sync.listRepos",
71 base_url().await
72 ))
73 .send()
74 .await
75 .expect("Failed to send request");
76
77 assert_eq!(res.status(), StatusCode::OK);
78 let body: Value = res.json().await.expect("Response was not valid JSON");
79 assert!(body["repos"].is_array());
80 let repos = body["repos"].as_array().unwrap();
81 assert!(!repos.is_empty());
82
83 let repo = &repos[0];
84 assert!(repo["did"].is_string());
85 assert!(repo["head"].is_string());
86 assert!(repo["active"].is_boolean());
87}
88
89#[tokio::test]
90async fn test_list_repos_with_limit() {
91 let client = client();
92 let _ = create_account_and_login(&client).await;
93 let _ = create_account_and_login(&client).await;
94 let _ = create_account_and_login(&client).await;
95
96 let params = [("limit", "2")];
97 let res = client
98 .get(format!(
99 "{}/xrpc/com.atproto.sync.listRepos",
100 base_url().await
101 ))
102 .query(¶ms)
103 .send()
104 .await
105 .expect("Failed to send request");
106
107 assert_eq!(res.status(), StatusCode::OK);
108 let body: Value = res.json().await.expect("Response was not valid JSON");
109 let repos = body["repos"].as_array().unwrap();
110 assert!(repos.len() <= 2);
111}
112
113#[tokio::test]
114async fn test_list_repos_pagination() {
115 let client = client();
116 let _ = create_account_and_login(&client).await;
117 let _ = create_account_and_login(&client).await;
118 let _ = create_account_and_login(&client).await;
119
120 let params = [("limit", "1")];
121 let res = client
122 .get(format!(
123 "{}/xrpc/com.atproto.sync.listRepos",
124 base_url().await
125 ))
126 .query(¶ms)
127 .send()
128 .await
129 .expect("Failed to send request");
130
131 assert_eq!(res.status(), StatusCode::OK);
132 let body: Value = res.json().await.expect("Response was not valid JSON");
133 let repos = body["repos"].as_array().unwrap();
134 assert_eq!(repos.len(), 1);
135
136 if let Some(cursor) = body["cursor"].as_str() {
137 let params = [("limit", "1"), ("cursor", cursor)];
138 let res = client
139 .get(format!(
140 "{}/xrpc/com.atproto.sync.listRepos",
141 base_url().await
142 ))
143 .query(¶ms)
144 .send()
145 .await
146 .expect("Failed to send request");
147
148 assert_eq!(res.status(), StatusCode::OK);
149 let body: Value = res.json().await.expect("Response was not valid JSON");
150 let repos2 = body["repos"].as_array().unwrap();
151 assert_eq!(repos2.len(), 1);
152 assert_ne!(repos[0]["did"], repos2[0]["did"]);
153 }
154}
155
156#[tokio::test]
157async fn test_get_repo_status_success() {
158 let client = client();
159 let (_, did) = create_account_and_login(&client).await;
160
161 let params = [("did", did.as_str())];
162 let res = client
163 .get(format!(
164 "{}/xrpc/com.atproto.sync.getRepoStatus",
165 base_url().await
166 ))
167 .query(¶ms)
168 .send()
169 .await
170 .expect("Failed to send request");
171
172 assert_eq!(res.status(), StatusCode::OK);
173 let body: Value = res.json().await.expect("Response was not valid JSON");
174 assert_eq!(body["did"], did);
175 assert_eq!(body["active"], true);
176 assert!(body["rev"].is_string());
177}
178
179#[tokio::test]
180async fn test_get_repo_status_not_found() {
181 let client = client();
182 let params = [("did", "did:plc:nonexistent12345")];
183 let res = client
184 .get(format!(
185 "{}/xrpc/com.atproto.sync.getRepoStatus",
186 base_url().await
187 ))
188 .query(¶ms)
189 .send()
190 .await
191 .expect("Failed to send request");
192
193 assert_eq!(res.status(), StatusCode::NOT_FOUND);
194 let body: Value = res.json().await.expect("Response was not valid JSON");
195 assert_eq!(body["error"], "RepoNotFound");
196}
197
198#[tokio::test]
199async fn test_list_blobs_success() {
200 let client = client();
201 let (access_jwt, did) = create_account_and_login(&client).await;
202
203 let blob_res = client
204 .post(format!(
205 "{}/xrpc/com.atproto.repo.uploadBlob",
206 base_url().await
207 ))
208 .header(header::CONTENT_TYPE, "text/plain")
209 .bearer_auth(&access_jwt)
210 .body("test blob content")
211 .send()
212 .await
213 .expect("Failed to upload blob");
214
215 assert_eq!(blob_res.status(), StatusCode::OK);
216
217 let params = [("did", did.as_str())];
218 let res = client
219 .get(format!(
220 "{}/xrpc/com.atproto.sync.listBlobs",
221 base_url().await
222 ))
223 .query(¶ms)
224 .send()
225 .await
226 .expect("Failed to send request");
227
228 assert_eq!(res.status(), StatusCode::OK);
229 let body: Value = res.json().await.expect("Response was not valid JSON");
230 assert!(body["cids"].is_array());
231 let cids = body["cids"].as_array().unwrap();
232 assert!(!cids.is_empty());
233}
234
235#[tokio::test]
236async fn test_list_blobs_not_found() {
237 let client = client();
238 let params = [("did", "did:plc:nonexistent12345")];
239 let res = client
240 .get(format!(
241 "{}/xrpc/com.atproto.sync.listBlobs",
242 base_url().await
243 ))
244 .query(¶ms)
245 .send()
246 .await
247 .expect("Failed to send request");
248
249 assert_eq!(res.status(), StatusCode::NOT_FOUND);
250 let body: Value = res.json().await.expect("Response was not valid JSON");
251 assert_eq!(body["error"], "RepoNotFound");
252}
253
254#[tokio::test]
255async fn test_get_blob_success() {
256 let client = client();
257 let (access_jwt, did) = create_account_and_login(&client).await;
258
259 let blob_content = "test blob for get_blob";
260 let blob_res = client
261 .post(format!(
262 "{}/xrpc/com.atproto.repo.uploadBlob",
263 base_url().await
264 ))
265 .header(header::CONTENT_TYPE, "text/plain")
266 .bearer_auth(&access_jwt)
267 .body(blob_content)
268 .send()
269 .await
270 .expect("Failed to upload blob");
271
272 assert_eq!(blob_res.status(), StatusCode::OK);
273 let blob_body: Value = blob_res.json().await.expect("Response was not valid JSON");
274 let cid = blob_body["blob"]["ref"]["$link"].as_str().expect("No CID");
275
276 let params = [("did", did.as_str()), ("cid", cid)];
277 let res = client
278 .get(format!(
279 "{}/xrpc/com.atproto.sync.getBlob",
280 base_url().await
281 ))
282 .query(¶ms)
283 .send()
284 .await
285 .expect("Failed to send request");
286
287 assert_eq!(res.status(), StatusCode::OK);
288 assert_eq!(
289 res.headers()
290 .get("content-type")
291 .and_then(|h| h.to_str().ok()),
292 Some("text/plain")
293 );
294 let body = res.text().await.expect("Failed to get body");
295 assert_eq!(body, blob_content);
296}
297
298#[tokio::test]
299async fn test_get_blob_not_found() {
300 let client = client();
301 let (_, did) = create_account_and_login(&client).await;
302
303 let params = [
304 ("did", did.as_str()),
305 ("cid", "bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku"),
306 ];
307 let res = client
308 .get(format!(
309 "{}/xrpc/com.atproto.sync.getBlob",
310 base_url().await
311 ))
312 .query(¶ms)
313 .send()
314 .await
315 .expect("Failed to send request");
316
317 assert_eq!(res.status(), StatusCode::NOT_FOUND);
318 let body: Value = res.json().await.expect("Response was not valid JSON");
319 assert_eq!(body["error"], "BlobNotFound");
320}
321
322#[tokio::test]
323async fn test_notify_of_update() {
324 let client = client();
325 let params = [("hostname", "example.com")];
326 let res = client
327 .post(format!(
328 "{}/xrpc/com.atproto.sync.notifyOfUpdate",
329 base_url().await
330 ))
331 .query(¶ms)
332 .send()
333 .await
334 .expect("Failed to send request");
335
336 assert_eq!(res.status(), StatusCode::OK);
337}
338
339#[tokio::test]
340async fn test_request_crawl() {
341 let client = client();
342 let payload = serde_json::json!({"hostname": "example.com"});
343 let res = client
344 .post(format!(
345 "{}/xrpc/com.atproto.sync.requestCrawl",
346 base_url().await
347 ))
348 .json(&payload)
349 .send()
350 .await
351 .expect("Failed to send request");
352
353 assert_eq!(res.status(), StatusCode::OK);
354}