Skip to main content

torii_storage_sqlite/
password.rs

1use crate::SqliteStorage;
2use async_trait::async_trait;
3use torii_core::UserId;
4use torii_core::error::StorageError;
5use torii_core::storage::PasswordStorage;
6
7#[async_trait]
8impl PasswordStorage for SqliteStorage {
9    async fn set_password_hash(
10        &self,
11        user_id: &UserId,
12        hash: &str,
13    ) -> Result<(), torii_core::Error> {
14        sqlx::query("UPDATE users SET password_hash = $1 WHERE id = $2")
15            .bind(hash)
16            .bind(user_id.as_str())
17            .execute(&self.pool)
18            .await
19            .map_err(|e| StorageError::Database(e.to_string()))?;
20        Ok(())
21    }
22
23    async fn get_password_hash(
24        &self,
25        user_id: &UserId,
26    ) -> Result<Option<String>, torii_core::Error> {
27        let result = sqlx::query_scalar("SELECT password_hash FROM users WHERE id = $1")
28            .bind(user_id.as_str())
29            .fetch_optional(&self.pool)
30            .await
31            .map_err(|e| StorageError::Database(e.to_string()))?;
32        Ok(result)
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39    use crate::tests::{create_test_user, setup_sqlite_storage};
40
41    #[tokio::test]
42    async fn test_password_hash() {
43        let storage = setup_sqlite_storage()
44            .await
45            .expect("Failed to setup storage");
46
47        // Create test user
48        let user = create_test_user(&storage, "1")
49            .await
50            .expect("Failed to create user");
51
52        // Set password hash
53        let hash = "test_hash_123";
54        storage
55            .set_password_hash(&user.id, hash)
56            .await
57            .expect("Failed to set password hash");
58
59        // Get password hash
60        let stored_hash = storage
61            .get_password_hash(&user.id)
62            .await
63            .expect("Failed to get password hash");
64
65        assert_eq!(stored_hash, Some(hash.to_string()));
66
67        // Get password hash for non-existent user
68        let non_existent = storage
69            .get_password_hash(&UserId::new("non_existent"))
70            .await
71            .expect("Failed to get password hash");
72
73        assert_eq!(non_existent, None);
74    }
75
76    #[tokio::test]
77    async fn test_password_hash_update() {
78        let storage = setup_sqlite_storage()
79            .await
80            .expect("Failed to setup storage");
81
82        // Create test user with initial password hash
83        let user = create_test_user(&storage, "1")
84            .await
85            .expect("Failed to create user");
86
87        let initial_hash = "initial_hash_123";
88        storage
89            .set_password_hash(&user.id, initial_hash)
90            .await
91            .expect("Failed to set initial password hash");
92
93        // Set updated password hash
94        let updated_hash = "updated_hash_456";
95        storage
96            .set_password_hash(&user.id, updated_hash)
97            .await
98            .expect("Failed to set updated password hash");
99
100        // Get updated password hash
101        let stored_hash = storage
102            .get_password_hash(&user.id)
103            .await
104            .expect("Failed to get updated password hash");
105
106        assert_eq!(stored_hash, Some(updated_hash.to_string()));
107    }
108}