use std::sync::Arc;
use torii::{Torii, sqlite::SqliteRepositoryProvider};
use torii_core::repositories::RepositoryProvider;
#[cfg(all(feature = "magic-link", feature = "sqlite"))]
#[tokio::test]
#[ignore]
async fn test_magic_link_auth() {
let pool = sqlx::SqlitePool::connect("sqlite::memory:").await.unwrap();
let repositories = SqliteRepositoryProvider::new(pool);
repositories.migrate().await.unwrap();
let torii = Torii::new(Arc::new(repositories));
let email = "test@example.com";
let magic_token = torii.magic_link().generate_token(email).await.unwrap();
assert!(!magic_token.token.is_empty());
assert!(magic_token.token.len() > 32); assert!(!magic_token.used()); assert!(magic_token.expires_at > chrono::Utc::now());
let (user, session) = torii
.magic_link()
.authenticate(&magic_token.token, None, None)
.await
.unwrap();
assert_eq!(user.email, email);
assert_eq!(session.user_id, user.id);
assert!(!session.is_expired());
let result = torii
.magic_link()
.authenticate(&magic_token.token, None, None)
.await;
assert!(result.is_err());
}
#[cfg(all(feature = "magic-link", feature = "sqlite"))]
#[tokio::test]
#[ignore]
async fn test_magic_link_expired_token() {
use chrono::Duration;
use std::time::Duration as StdDuration;
use tokio::time::sleep;
let pool = sqlx::SqlitePool::connect("sqlite::memory:").await.unwrap();
let repositories = SqliteRepositoryProvider::new(pool);
repositories.migrate().await.unwrap();
let torii = Torii::new(Arc::new(repositories)).with_session_config(torii::SessionConfig {
expires_in: Duration::seconds(2), provider_type: torii::SessionProviderType::Opaque,
});
let email = "expired@example.com";
let magic_token = torii.magic_link().generate_token(email).await.unwrap();
sleep(StdDuration::from_secs(2)).await;
let (_, session) = torii
.magic_link()
.authenticate(&magic_token.token, None, None)
.await
.unwrap();
sleep(StdDuration::from_secs(3)).await;
let result = torii.get_session(&session.token).await;
assert!(result.is_err());
}
#[cfg(all(feature = "magic-link", feature = "sqlite"))]
#[tokio::test]
#[ignore]
async fn test_magic_link_connection_info() {
let pool = sqlx::SqlitePool::connect("sqlite::memory:").await.unwrap();
let repositories = SqliteRepositoryProvider::new(pool);
repositories.migrate().await.unwrap();
let torii = Torii::new(Arc::new(repositories));
let email = "connection@example.com";
let magic_token = torii.magic_link().generate_token(email).await.unwrap();
let user_agent = Some("Test User Agent".to_string());
let ip_address = Some("127.0.0.1".to_string());
let (_, session) = torii
.magic_link()
.authenticate(&magic_token.token, user_agent.clone(), ip_address.clone())
.await
.unwrap();
assert_eq!(session.user_agent, user_agent);
assert_eq!(session.ip_address, ip_address);
}