this repo has no description
1mod common; 2mod helpers; 3use common::*; 4use helpers::*; 5use reqwest::StatusCode; 6use serde_json::{Value, json}; 7 8#[tokio::test] 9async fn test_list_sessions_returns_current_session() { 10 let client = client(); 11 let (did, jwt) = setup_new_user("list-sessions").await; 12 let res = client 13 .get(format!( 14 "{}/xrpc/com.tranquil.account.listSessions", 15 base_url().await 16 )) 17 .bearer_auth(&jwt) 18 .send() 19 .await 20 .expect("Failed to send request"); 21 assert_eq!(res.status(), StatusCode::OK); 22 let body: Value = res.json().await.unwrap(); 23 let sessions = body["sessions"] 24 .as_array() 25 .expect("sessions should be array"); 26 assert!(!sessions.is_empty(), "Should have at least one session"); 27 let current = sessions 28 .iter() 29 .find(|s| s["isCurrent"].as_bool() == Some(true)); 30 assert!(current.is_some(), "Should have a current session marked"); 31 let session = current.unwrap(); 32 assert!(session["id"].as_str().is_some(), "Session should have id"); 33 assert!( 34 session["createdAt"].as_str().is_some(), 35 "Session should have createdAt" 36 ); 37 assert!( 38 session["expiresAt"].as_str().is_some(), 39 "Session should have expiresAt" 40 ); 41 let _ = did; 42} 43 44#[tokio::test] 45async fn test_list_sessions_multiple_sessions() { 46 let client = client(); 47 let ts = chrono::Utc::now().timestamp_millis(); 48 let handle = format!("multi-list-{}.test", ts); 49 let email = format!("multi-list-{}@test.com", ts); 50 let password = "Testpass123!"; 51 let create_payload = json!({ 52 "handle": handle, 53 "email": email, 54 "password": password 55 }); 56 let create_res = client 57 .post(format!( 58 "{}/xrpc/com.atproto.server.createAccount", 59 base_url().await 60 )) 61 .json(&create_payload) 62 .send() 63 .await 64 .expect("Failed to create account"); 65 assert_eq!(create_res.status(), StatusCode::OK); 66 let create_body: Value = create_res.json().await.unwrap(); 67 let did = create_body["did"].as_str().unwrap(); 68 let jwt1 = verify_new_account(&client, did).await; 69 let login_payload = json!({ 70 "identifier": handle, 71 "password": password 72 }); 73 let login_res = client 74 .post(format!( 75 "{}/xrpc/com.atproto.server.createSession", 76 base_url().await 77 )) 78 .json(&login_payload) 79 .send() 80 .await 81 .expect("Failed to login"); 82 assert_eq!(login_res.status(), StatusCode::OK); 83 let login_body: Value = login_res.json().await.unwrap(); 84 let jwt2 = login_body["accessJwt"].as_str().unwrap(); 85 let list_res = client 86 .get(format!( 87 "{}/xrpc/com.tranquil.account.listSessions", 88 base_url().await 89 )) 90 .bearer_auth(jwt2) 91 .send() 92 .await 93 .expect("Failed to list sessions"); 94 assert_eq!(list_res.status(), StatusCode::OK); 95 let list_body: Value = list_res.json().await.unwrap(); 96 let sessions = list_body["sessions"].as_array().unwrap(); 97 assert!( 98 sessions.len() >= 2, 99 "Should have at least 2 sessions, got {}", 100 sessions.len() 101 ); 102 let _ = jwt1; 103} 104 105#[tokio::test] 106async fn test_list_sessions_requires_auth() { 107 let client = client(); 108 let res = client 109 .get(format!( 110 "{}/xrpc/com.tranquil.account.listSessions", 111 base_url().await 112 )) 113 .send() 114 .await 115 .expect("Failed to send request"); 116 assert_eq!(res.status(), StatusCode::UNAUTHORIZED); 117} 118 119#[tokio::test] 120async fn test_revoke_session_success() { 121 let client = client(); 122 let ts = chrono::Utc::now().timestamp_millis(); 123 let handle = format!("revoke-sess-{}.test", ts); 124 let email = format!("revoke-sess-{}@test.com", ts); 125 let password = "Testpass123!"; 126 let create_payload = json!({ 127 "handle": handle, 128 "email": email, 129 "password": password 130 }); 131 let create_res = client 132 .post(format!( 133 "{}/xrpc/com.atproto.server.createAccount", 134 base_url().await 135 )) 136 .json(&create_payload) 137 .send() 138 .await 139 .expect("Failed to create account"); 140 assert_eq!(create_res.status(), StatusCode::OK); 141 let create_body: Value = create_res.json().await.unwrap(); 142 let did = create_body["did"].as_str().unwrap(); 143 let jwt1 = verify_new_account(&client, did).await; 144 let login_payload = json!({ 145 "identifier": handle, 146 "password": password 147 }); 148 let login_res = client 149 .post(format!( 150 "{}/xrpc/com.atproto.server.createSession", 151 base_url().await 152 )) 153 .json(&login_payload) 154 .send() 155 .await 156 .expect("Failed to login"); 157 assert_eq!(login_res.status(), StatusCode::OK); 158 let login_body: Value = login_res.json().await.unwrap(); 159 let jwt2 = login_body["accessJwt"].as_str().unwrap(); 160 let list_res = client 161 .get(format!( 162 "{}/xrpc/com.tranquil.account.listSessions", 163 base_url().await 164 )) 165 .bearer_auth(jwt2) 166 .send() 167 .await 168 .expect("Failed to list sessions"); 169 let list_body: Value = list_res.json().await.unwrap(); 170 let sessions = list_body["sessions"].as_array().unwrap(); 171 let other_session = sessions 172 .iter() 173 .find(|s| s["isCurrent"].as_bool() != Some(true)); 174 assert!( 175 other_session.is_some(), 176 "Should have another session to revoke" 177 ); 178 let session_id = other_session.unwrap()["id"].as_str().unwrap(); 179 let revoke_res = client 180 .post(format!( 181 "{}/xrpc/com.tranquil.account.revokeSession", 182 base_url().await 183 )) 184 .bearer_auth(jwt2) 185 .json(&json!({"sessionId": session_id})) 186 .send() 187 .await 188 .expect("Failed to revoke session"); 189 assert_eq!(revoke_res.status(), StatusCode::OK); 190 let list_after_res = client 191 .get(format!( 192 "{}/xrpc/com.tranquil.account.listSessions", 193 base_url().await 194 )) 195 .bearer_auth(jwt2) 196 .send() 197 .await 198 .expect("Failed to list sessions after revoke"); 199 let list_after_body: Value = list_after_res.json().await.unwrap(); 200 let sessions_after = list_after_body["sessions"].as_array().unwrap(); 201 let revoked_still_exists = sessions_after 202 .iter() 203 .any(|s| s["id"].as_str() == Some(session_id)); 204 assert!( 205 !revoked_still_exists, 206 "Revoked session should not appear in list" 207 ); 208 let _ = jwt1; 209} 210 211#[tokio::test] 212async fn test_revoke_session_invalid_id() { 213 let client = client(); 214 let (_, jwt) = setup_new_user("revoke-invalid").await; 215 let res = client 216 .post(format!( 217 "{}/xrpc/com.tranquil.account.revokeSession", 218 base_url().await 219 )) 220 .bearer_auth(&jwt) 221 .json(&json!({"sessionId": "not-a-number"})) 222 .send() 223 .await 224 .expect("Failed to send request"); 225 assert_eq!(res.status(), StatusCode::BAD_REQUEST); 226} 227 228#[tokio::test] 229async fn test_revoke_session_not_found() { 230 let client = client(); 231 let (_, jwt) = setup_new_user("revoke-notfound").await; 232 let res = client 233 .post(format!( 234 "{}/xrpc/com.tranquil.account.revokeSession", 235 base_url().await 236 )) 237 .bearer_auth(&jwt) 238 .json(&json!({"sessionId": "jwt:999999999"})) 239 .send() 240 .await 241 .expect("Failed to send request"); 242 assert_eq!(res.status(), StatusCode::NOT_FOUND); 243} 244 245#[tokio::test] 246async fn test_revoke_session_requires_auth() { 247 let client = client(); 248 let res = client 249 .post(format!( 250 "{}/xrpc/com.tranquil.account.revokeSession", 251 base_url().await 252 )) 253 .json(&json!({"sessionId": "1"})) 254 .send() 255 .await 256 .expect("Failed to send request"); 257 assert_eq!(res.status(), StatusCode::UNAUTHORIZED); 258}