use std::time::{Duration, SystemTime};
use gradatum_server::state::AppState;
use tempfile::TempDir;
#[tokio::test]
async fn appstate_sqlite_revocation_store_persists() {
let dir = TempDir::new().expect("tempdir");
let revocation_path = dir.path().join("revocation.sqlite");
let state = AppState::new()
.with_revocation_path(&revocation_path)
.await
.expect("revocation store init");
assert!(
revocation_path.exists(),
"le fichier SQLite de révocation doit être créé par with_revocation_path"
);
let jti = "test-jti-12345";
let exp = SystemTime::now() + Duration::from_secs(3600);
state
.revocation
.revoke(jti, exp)
.await
.expect("revoke doit réussir");
let is_revoked = state
.revocation
.is_revoked(jti)
.await
.expect("is_revoked doit réussir");
assert!(
is_revoked,
"le jti révoqué doit être reconnu par le store SQLite"
);
let is_other_revoked = state
.revocation
.is_revoked("autre-jti-non-revoque")
.await
.expect("is_revoked non-révoqué doit réussir");
assert!(
!is_other_revoked,
"un jti non révoqué ne doit pas être bloqué"
);
}
#[tokio::test]
async fn appstate_revocation_expired_not_blocked() {
let dir = TempDir::new().expect("tempdir");
let revocation_path = dir.path().join("revocation_exp.sqlite");
let state = AppState::new()
.with_revocation_path(&revocation_path)
.await
.expect("revocation store init");
let jti = "jti-expire";
let exp_passe = SystemTime::now() - Duration::from_secs(1);
state
.revocation
.revoke(jti, exp_passe)
.await
.expect("revoke avec exp passé doit réussir");
let is_revoked = state
.revocation
.is_revoked(jti)
.await
.expect("is_revoked doit réussir");
assert!(
!is_revoked,
"un token avec exp dans le passé ne doit pas être considéré comme révoqué actif"
);
}