Our Personal Data Server from scratch!
0

Configure Feed

Select the types of activity you want to include in your feed.

fix(test): oauth token eviction should be agnostic

Lewis: May this revision serve well! <lu5a@proton.me>

author
Lewis
date (May 25, 2026, 4:17 PM +0300) commit 96c83757 parent 86c59955 change-id pwytqrsm
+64 -39
+64 -39
crates/tranquil-pds/tests/oauth_token_eviction.rs
··· 2 2 mod helpers; 3 3 4 4 use chrono::{DateTime, Duration, Utc}; 5 - use common::{base_url, client, get_test_db_pool, get_test_repos}; 5 + use common::{base_url, client, get_test_repos}; 6 + use futures::StreamExt; 6 7 use helpers::verify_new_account; 7 8 use reqwest::StatusCode; 8 9 use serde_json::{Value, json}; 10 + use tranquil_oauth::{ 11 + AuthorizationRequestParameters, ClientAuth, CodeChallengeMethod, ResponseType, TokenData, 12 + TokenId, 13 + }; 9 14 use tranquil_types::Did; 10 15 11 16 async fn create_account_and_get_did(handle: &str, email: &str, password: &str) -> Did { ··· 33 38 Did::new(did_str).expect("invalid DID format") 34 39 } 35 40 36 - async fn insert_token_with_created_at( 37 - pool: &sqlx::PgPool, 38 - did: &Did, 39 - token_id: &str, 40 - created_at: DateTime<Utc>, 41 - ) { 42 - sqlx::query( 43 - r#" 44 - INSERT INTO oauth_token ( 45 - did, token_id, created_at, updated_at, expires_at, 46 - client_id, client_auth, parameters 47 - ) VALUES ($1, $2, $3, $3, $4, $5, $6::jsonb, $7::jsonb) 48 - "#, 49 - ) 50 - .bind(did.as_str()) 51 - .bind(token_id) 52 - .bind(created_at) 53 - .bind(created_at + Duration::hours(1)) 54 - .bind("https://test.example/client") 55 - .bind(r#"{"method":"none"}"#) 56 - .bind( 57 - r#"{"response_type":"code","client_id":"https://test.example/client","redirect_uri":"https://test.example/cb","code_challenge":"x","code_challenge_method":"S256"}"#, 58 - ) 59 - .execute(pool) 60 - .await 61 - .expect("token insert failed"); 41 + fn make_token_data(did: &Did, token_id: &str, created_at: DateTime<Utc>) -> TokenData { 42 + let client_id = "https://squid.nel.pet/client".to_string(); 43 + TokenData { 44 + did: did.clone(), 45 + token_id: TokenId(token_id.to_string()), 46 + created_at, 47 + updated_at: created_at, 48 + expires_at: created_at + Duration::hours(1), 49 + client_id: client_id.clone(), 50 + client_auth: ClientAuth::None, 51 + device_id: None, 52 + parameters: AuthorizationRequestParameters { 53 + response_type: ResponseType::Code, 54 + client_id, 55 + redirect_uri: "https://squid.nel.pet/cb".to_string(), 56 + scope: None, 57 + state: None, 58 + code_challenge: "x".to_string(), 59 + code_challenge_method: CodeChallengeMethod::S256, 60 + response_mode: None, 61 + login_hint: None, 62 + dpop_jkt: None, 63 + prompt: None, 64 + extra: None, 65 + }, 66 + details: None, 67 + code: None, 68 + current_refresh_token: None, 69 + scope: None, 70 + controller_did: None, 71 + } 72 + } 73 + 74 + async fn seed_tokens(repos: &tranquil_db::PostgresRepositories, tokens: &[TokenData]) { 75 + futures::stream::iter(tokens) 76 + .for_each(|token| async move { 77 + repos 78 + .oauth 79 + .create_token(token) 80 + .await 81 + .expect("token insert failed"); 82 + }) 83 + .await; 62 84 } 63 85 64 86 #[tokio::test] ··· 68 90 let email = format!("tok-evict-{}@test.com", ts); 69 91 let did = create_account_and_get_did(&handle, &email, "EvictTest123!").await; 70 92 71 - let pool = get_test_db_pool().await; 72 93 let repos = get_test_repos().await; 73 94 74 95 let base = Utc::now(); 75 96 let token_ids: Vec<String> = (0..5).map(|i| format!("tok-{}-{}", ts, i)).collect(); 76 - 77 - for (i, tid) in token_ids.iter().enumerate() { 78 - let created = base + Duration::seconds(i as i64); 79 - insert_token_with_created_at(pool, &did, tid, created).await; 80 - } 97 + let tokens: Vec<TokenData> = (0i64..) 98 + .zip(token_ids.iter()) 99 + .map(|(offset, tid)| make_token_data(&did, tid, base + Duration::seconds(offset))) 100 + .collect(); 101 + seed_tokens(repos, &tokens).await; 81 102 82 103 let count_before = repos 83 104 .oauth ··· 116 137 let email = format!("tok-evict-noop-{}@test.com", ts); 117 138 let did = create_account_and_get_did(&handle, &email, "EvictTest123!").await; 118 139 119 - let pool = get_test_db_pool().await; 120 140 let repos = get_test_repos().await; 121 141 122 142 let base = Utc::now(); 123 - for i in 0..2 { 124 - let tid = format!("noop-tok-{}-{}", ts, i); 125 - let created = base + Duration::seconds(i); 126 - insert_token_with_created_at(pool, &did, &tid, created).await; 127 - } 143 + let tokens: Vec<TokenData> = (0i64..2) 144 + .map(|offset| { 145 + make_token_data( 146 + &did, 147 + &format!("noop-tok-{}-{}", ts, offset), 148 + base + Duration::seconds(offset), 149 + ) 150 + }) 151 + .collect(); 152 + seed_tokens(repos, &tokens).await; 128 153 129 154 let deleted = repos 130 155 .oauth