mirror of
https://tangled.org/tranquil.farm/tranquil-pds
synced 2026-06-03 21:56:23 +00:00
fix(test): oauth token eviction should be agnostic
Lewis: May this revision serve well! <lu5a@proton.me>
This commit is contained in:
@@ -2,10 +2,15 @@ mod common;
|
||||
mod helpers;
|
||||
|
||||
use chrono::{DateTime, Duration, Utc};
|
||||
use common::{base_url, client, get_test_db_pool, get_test_repos};
|
||||
use common::{base_url, client, get_test_repos};
|
||||
use futures::StreamExt;
|
||||
use helpers::verify_new_account;
|
||||
use reqwest::StatusCode;
|
||||
use serde_json::{Value, json};
|
||||
use tranquil_oauth::{
|
||||
AuthorizationRequestParameters, ClientAuth, CodeChallengeMethod, ResponseType, TokenData,
|
||||
TokenId,
|
||||
};
|
||||
use tranquil_types::Did;
|
||||
|
||||
async fn create_account_and_get_did(handle: &str, email: &str, password: &str) -> Did {
|
||||
@@ -33,32 +38,49 @@ async fn create_account_and_get_did(handle: &str, email: &str, password: &str) -
|
||||
Did::new(did_str).expect("invalid DID format")
|
||||
}
|
||||
|
||||
async fn insert_token_with_created_at(
|
||||
pool: &sqlx::PgPool,
|
||||
did: &Did,
|
||||
token_id: &str,
|
||||
created_at: DateTime<Utc>,
|
||||
) {
|
||||
sqlx::query(
|
||||
r#"
|
||||
INSERT INTO oauth_token (
|
||||
did, token_id, created_at, updated_at, expires_at,
|
||||
client_id, client_auth, parameters
|
||||
) VALUES ($1, $2, $3, $3, $4, $5, $6::jsonb, $7::jsonb)
|
||||
"#,
|
||||
)
|
||||
.bind(did.as_str())
|
||||
.bind(token_id)
|
||||
.bind(created_at)
|
||||
.bind(created_at + Duration::hours(1))
|
||||
.bind("https://test.example/client")
|
||||
.bind(r#"{"method":"none"}"#)
|
||||
.bind(
|
||||
r#"{"response_type":"code","client_id":"https://test.example/client","redirect_uri":"https://test.example/cb","code_challenge":"x","code_challenge_method":"S256"}"#,
|
||||
)
|
||||
.execute(pool)
|
||||
.await
|
||||
.expect("token insert failed");
|
||||
fn make_token_data(did: &Did, token_id: &str, created_at: DateTime<Utc>) -> TokenData {
|
||||
let client_id = "https://squid.nel.pet/client".to_string();
|
||||
TokenData {
|
||||
did: did.clone(),
|
||||
token_id: TokenId(token_id.to_string()),
|
||||
created_at,
|
||||
updated_at: created_at,
|
||||
expires_at: created_at + Duration::hours(1),
|
||||
client_id: client_id.clone(),
|
||||
client_auth: ClientAuth::None,
|
||||
device_id: None,
|
||||
parameters: AuthorizationRequestParameters {
|
||||
response_type: ResponseType::Code,
|
||||
client_id,
|
||||
redirect_uri: "https://squid.nel.pet/cb".to_string(),
|
||||
scope: None,
|
||||
state: None,
|
||||
code_challenge: "x".to_string(),
|
||||
code_challenge_method: CodeChallengeMethod::S256,
|
||||
response_mode: None,
|
||||
login_hint: None,
|
||||
dpop_jkt: None,
|
||||
prompt: None,
|
||||
extra: None,
|
||||
},
|
||||
details: None,
|
||||
code: None,
|
||||
current_refresh_token: None,
|
||||
scope: None,
|
||||
controller_did: None,
|
||||
}
|
||||
}
|
||||
|
||||
async fn seed_tokens(repos: &tranquil_db::PostgresRepositories, tokens: &[TokenData]) {
|
||||
futures::stream::iter(tokens)
|
||||
.for_each(|token| async move {
|
||||
repos
|
||||
.oauth
|
||||
.create_token(token)
|
||||
.await
|
||||
.expect("token insert failed");
|
||||
})
|
||||
.await;
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
@@ -68,16 +90,15 @@ async fn delete_oldest_tokens_evicts_lowest_created_at() {
|
||||
let email = format!("tok-evict-{}@test.com", ts);
|
||||
let did = create_account_and_get_did(&handle, &email, "EvictTest123!").await;
|
||||
|
||||
let pool = get_test_db_pool().await;
|
||||
let repos = get_test_repos().await;
|
||||
|
||||
let base = Utc::now();
|
||||
let token_ids: Vec<String> = (0..5).map(|i| format!("tok-{}-{}", ts, i)).collect();
|
||||
|
||||
for (i, tid) in token_ids.iter().enumerate() {
|
||||
let created = base + Duration::seconds(i as i64);
|
||||
insert_token_with_created_at(pool, &did, tid, created).await;
|
||||
}
|
||||
let tokens: Vec<TokenData> = (0i64..)
|
||||
.zip(token_ids.iter())
|
||||
.map(|(offset, tid)| make_token_data(&did, tid, base + Duration::seconds(offset)))
|
||||
.collect();
|
||||
seed_tokens(repos, &tokens).await;
|
||||
|
||||
let count_before = repos
|
||||
.oauth
|
||||
@@ -116,15 +137,19 @@ async fn delete_oldest_tokens_no_op_when_under_keep_count() {
|
||||
let email = format!("tok-evict-noop-{}@test.com", ts);
|
||||
let did = create_account_and_get_did(&handle, &email, "EvictTest123!").await;
|
||||
|
||||
let pool = get_test_db_pool().await;
|
||||
let repos = get_test_repos().await;
|
||||
|
||||
let base = Utc::now();
|
||||
for i in 0..2 {
|
||||
let tid = format!("noop-tok-{}-{}", ts, i);
|
||||
let created = base + Duration::seconds(i);
|
||||
insert_token_with_created_at(pool, &did, &tid, created).await;
|
||||
}
|
||||
let tokens: Vec<TokenData> = (0i64..2)
|
||||
.map(|offset| {
|
||||
make_token_data(
|
||||
&did,
|
||||
&format!("noop-tok-{}-{}", ts, offset),
|
||||
base + Duration::seconds(offset),
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
seed_tokens(repos, &tokens).await;
|
||||
|
||||
let deleted = repos
|
||||
.oauth
|
||||
|
||||
Reference in New Issue
Block a user