this repo has no description
1mod common;
2use common::*;
3use reqwest::StatusCode;
4use serde_json::{Value, json};
5
6#[tokio::test]
7async fn test_create_invite_code_success() {
8 let client = client();
9 let (access_jwt, _did) = create_admin_account_and_login(&client).await;
10 let payload = json!({
11 "useCount": 5
12 });
13 let res = client
14 .post(format!(
15 "{}/xrpc/com.atproto.server.createInviteCode",
16 base_url().await
17 ))
18 .bearer_auth(&access_jwt)
19 .json(&payload)
20 .send()
21 .await
22 .expect("Failed to send request");
23 assert_eq!(res.status(), StatusCode::OK);
24 let body: Value = res.json().await.expect("Response was not valid JSON");
25 assert!(body["code"].is_string());
26 let code = body["code"].as_str().unwrap();
27 assert!(!code.is_empty());
28 assert!(code.contains('-'), "Code should be in hostname-xxxxx-xxxxx format");
29 let parts: Vec<&str> = code.split('-').collect();
30 assert!(parts.len() >= 3, "Code should have at least 3 parts (hostname + 2 random parts)");
31}
32
33#[tokio::test]
34async fn test_create_invite_code_no_auth() {
35 let client = client();
36 let payload = json!({
37 "useCount": 5
38 });
39 let res = client
40 .post(format!(
41 "{}/xrpc/com.atproto.server.createInviteCode",
42 base_url().await
43 ))
44 .json(&payload)
45 .send()
46 .await
47 .expect("Failed to send request");
48 assert_eq!(res.status(), StatusCode::UNAUTHORIZED);
49 let body: Value = res.json().await.expect("Response was not valid JSON");
50 assert_eq!(body["error"], "AuthenticationRequired");
51}
52
53#[tokio::test]
54async fn test_create_invite_code_non_admin() {
55 let client = client();
56 let _ = create_admin_account_and_login(&client).await;
57 let (access_jwt, _did) = create_account_and_login(&client).await;
58 let payload = json!({
59 "useCount": 5
60 });
61 let res = client
62 .post(format!(
63 "{}/xrpc/com.atproto.server.createInviteCode",
64 base_url().await
65 ))
66 .bearer_auth(&access_jwt)
67 .json(&payload)
68 .send()
69 .await
70 .expect("Failed to send request");
71 assert_eq!(res.status(), StatusCode::FORBIDDEN);
72 let body: Value = res.json().await.expect("Response was not valid JSON");
73 assert_eq!(body["error"], "AdminRequired");
74}
75
76#[tokio::test]
77async fn test_create_invite_code_invalid_use_count() {
78 let client = client();
79 let (access_jwt, _did) = create_admin_account_and_login(&client).await;
80 let payload = json!({
81 "useCount": 0
82 });
83 let res = client
84 .post(format!(
85 "{}/xrpc/com.atproto.server.createInviteCode",
86 base_url().await
87 ))
88 .bearer_auth(&access_jwt)
89 .json(&payload)
90 .send()
91 .await
92 .expect("Failed to send request");
93 assert_eq!(res.status(), StatusCode::BAD_REQUEST);
94 let body: Value = res.json().await.expect("Response was not valid JSON");
95 assert_eq!(body["error"], "InvalidRequest");
96}
97
98#[tokio::test]
99async fn test_create_invite_code_for_another_account() {
100 let client = client();
101 let (access_jwt1, _did1) = create_admin_account_and_login(&client).await;
102 let (_access_jwt2, did2) = create_account_and_login(&client).await;
103 let payload = json!({
104 "useCount": 3,
105 "forAccount": did2
106 });
107 let res = client
108 .post(format!(
109 "{}/xrpc/com.atproto.server.createInviteCode",
110 base_url().await
111 ))
112 .bearer_auth(&access_jwt1)
113 .json(&payload)
114 .send()
115 .await
116 .expect("Failed to send request");
117 assert_eq!(res.status(), StatusCode::OK);
118 let body: Value = res.json().await.expect("Response was not valid JSON");
119 assert!(body["code"].is_string());
120}
121
122#[tokio::test]
123async fn test_create_invite_codes_success() {
124 let client = client();
125 let (access_jwt, did) = create_admin_account_and_login(&client).await;
126 let payload = json!({
127 "useCount": 2,
128 "codeCount": 3
129 });
130 let res = client
131 .post(format!(
132 "{}/xrpc/com.atproto.server.createInviteCodes",
133 base_url().await
134 ))
135 .bearer_auth(&access_jwt)
136 .json(&payload)
137 .send()
138 .await
139 .expect("Failed to send request");
140 assert_eq!(res.status(), StatusCode::OK);
141 let body: Value = res.json().await.expect("Response was not valid JSON");
142 assert!(body["codes"].is_array());
143 let codes = body["codes"].as_array().unwrap();
144 assert_eq!(codes.len(), 1);
145 assert_eq!(codes[0]["account"], did);
146 assert_eq!(codes[0]["codes"].as_array().unwrap().len(), 3);
147}
148
149#[tokio::test]
150async fn test_create_invite_codes_for_multiple_accounts() {
151 let client = client();
152 let (access_jwt1, did1) = create_admin_account_and_login(&client).await;
153 let (_access_jwt2, did2) = create_account_and_login(&client).await;
154 let payload = json!({
155 "useCount": 1,
156 "codeCount": 2,
157 "forAccounts": [did1, did2]
158 });
159 let res = client
160 .post(format!(
161 "{}/xrpc/com.atproto.server.createInviteCodes",
162 base_url().await
163 ))
164 .bearer_auth(&access_jwt1)
165 .json(&payload)
166 .send()
167 .await
168 .expect("Failed to send request");
169 assert_eq!(res.status(), StatusCode::OK);
170 let body: Value = res.json().await.expect("Response was not valid JSON");
171 let codes = body["codes"].as_array().unwrap();
172 assert_eq!(codes.len(), 2);
173 for code_obj in codes {
174 assert!(code_obj["account"].is_string());
175 assert_eq!(code_obj["codes"].as_array().unwrap().len(), 2);
176 }
177}
178
179#[tokio::test]
180async fn test_create_invite_codes_no_auth() {
181 let client = client();
182 let payload = json!({
183 "useCount": 2
184 });
185 let res = client
186 .post(format!(
187 "{}/xrpc/com.atproto.server.createInviteCodes",
188 base_url().await
189 ))
190 .json(&payload)
191 .send()
192 .await
193 .expect("Failed to send request");
194 assert_eq!(res.status(), StatusCode::UNAUTHORIZED);
195}
196
197#[tokio::test]
198async fn test_create_invite_codes_non_admin() {
199 let client = client();
200 let (access_jwt, _did) = create_account_and_login(&client).await;
201 let payload = json!({
202 "useCount": 2
203 });
204 let res = client
205 .post(format!(
206 "{}/xrpc/com.atproto.server.createInviteCodes",
207 base_url().await
208 ))
209 .bearer_auth(&access_jwt)
210 .json(&payload)
211 .send()
212 .await
213 .expect("Failed to send request");
214 assert_eq!(res.status(), StatusCode::FORBIDDEN);
215 let body: Value = res.json().await.expect("Response was not valid JSON");
216 assert_eq!(body["error"], "AdminRequired");
217}
218
219#[tokio::test]
220async fn test_get_account_invite_codes_success() {
221 let client = client();
222 let (admin_jwt, _admin_did) = create_admin_account_and_login(&client).await;
223 let (user_jwt, user_did) = create_account_and_login(&client).await;
224
225 let create_payload = json!({
226 "useCount": 5,
227 "forAccount": user_did
228 });
229 let _ = client
230 .post(format!(
231 "{}/xrpc/com.atproto.server.createInviteCode",
232 base_url().await
233 ))
234 .bearer_auth(&admin_jwt)
235 .json(&create_payload)
236 .send()
237 .await
238 .expect("Failed to create invite code");
239
240 let res = client
241 .get(format!(
242 "{}/xrpc/com.atproto.server.getAccountInviteCodes",
243 base_url().await
244 ))
245 .bearer_auth(&user_jwt)
246 .send()
247 .await
248 .expect("Failed to send request");
249 assert_eq!(res.status(), StatusCode::OK);
250 let body: Value = res.json().await.expect("Response was not valid JSON");
251 assert!(body["codes"].is_array());
252 let codes = body["codes"].as_array().unwrap();
253 assert!(!codes.is_empty());
254 let code = &codes[0];
255 assert!(code["code"].is_string());
256 assert!(code["available"].is_number());
257 assert!(code["disabled"].is_boolean());
258 assert!(code["createdAt"].is_string());
259 assert!(code["uses"].is_array());
260 assert_eq!(code["forAccount"], user_did);
261 assert_eq!(code["createdBy"], "admin");
262}
263
264#[tokio::test]
265async fn test_get_account_invite_codes_no_auth() {
266 let client = client();
267 let res = client
268 .get(format!(
269 "{}/xrpc/com.atproto.server.getAccountInviteCodes",
270 base_url().await
271 ))
272 .send()
273 .await
274 .expect("Failed to send request");
275 assert_eq!(res.status(), StatusCode::UNAUTHORIZED);
276}
277
278#[tokio::test]
279async fn test_get_account_invite_codes_include_used_filter() {
280 let client = client();
281 let (admin_jwt, _admin_did) = create_admin_account_and_login(&client).await;
282 let (user_jwt, user_did) = create_account_and_login(&client).await;
283
284 let create_payload = json!({
285 "useCount": 5,
286 "forAccount": user_did
287 });
288 let _ = client
289 .post(format!(
290 "{}/xrpc/com.atproto.server.createInviteCode",
291 base_url().await
292 ))
293 .bearer_auth(&admin_jwt)
294 .json(&create_payload)
295 .send()
296 .await
297 .expect("Failed to create invite code");
298
299 let res = client
300 .get(format!(
301 "{}/xrpc/com.atproto.server.getAccountInviteCodes",
302 base_url().await
303 ))
304 .bearer_auth(&user_jwt)
305 .query(&[("includeUsed", "false")])
306 .send()
307 .await
308 .expect("Failed to send request");
309 assert_eq!(res.status(), StatusCode::OK);
310 let body: Value = res.json().await.expect("Response was not valid JSON");
311 assert!(body["codes"].is_array());
312 for code in body["codes"].as_array().unwrap() {
313 assert!(code["available"].as_i64().unwrap() > 0);
314 }
315}
316
317#[tokio::test]
318async fn test_get_account_invite_codes_filters_disabled() {
319 let client = client();
320 let (admin_jwt, admin_did) = create_admin_account_and_login(&client).await;
321
322 let create_payload = json!({
323 "useCount": 5,
324 "forAccount": admin_did
325 });
326 let create_res = client
327 .post(format!(
328 "{}/xrpc/com.atproto.server.createInviteCode",
329 base_url().await
330 ))
331 .bearer_auth(&admin_jwt)
332 .json(&create_payload)
333 .send()
334 .await
335 .expect("Failed to create invite code");
336 let create_body: Value = create_res.json().await.unwrap();
337 let code = create_body["code"].as_str().unwrap();
338
339 let disable_payload = json!({
340 "codes": [code]
341 });
342 let _ = client
343 .post(format!(
344 "{}/xrpc/com.atproto.admin.disableInviteCodes",
345 base_url().await
346 ))
347 .bearer_auth(&admin_jwt)
348 .json(&disable_payload)
349 .send()
350 .await
351 .expect("Failed to disable invite code");
352
353 let res = client
354 .get(format!(
355 "{}/xrpc/com.atproto.server.getAccountInviteCodes",
356 base_url().await
357 ))
358 .bearer_auth(&admin_jwt)
359 .send()
360 .await
361 .expect("Failed to send request");
362 assert_eq!(res.status(), StatusCode::OK);
363 let body: Value = res.json().await.expect("Response was not valid JSON");
364 let codes = body["codes"].as_array().unwrap();
365 for c in codes {
366 assert_ne!(c["code"].as_str().unwrap(), code, "Disabled code should be filtered out");
367 }
368}