use super::{CacheConfig, CachedTursoStorage};
use crate::TursoStorage;
use libsql::Builder;
use do_memory_core::{Episode, TaskContext, TaskType};
use std::sync::Arc;
use tempfile::TempDir;
use uuid::Uuid;
use super::create_test_episode;
use super::create_test_turso_storage;
#[tokio::test]
async fn test_concurrent_episode_access() {
let (storage, _dir) = create_test_turso_storage().await;
let cached = Arc::new(CachedTursoStorage::new(storage, CacheConfig::default()));
let episode_id = Uuid::new_v4();
let episode = create_test_episode(episode_id);
cached.store_episode_cached(&episode).await.unwrap();
let mut handles = Vec::new();
for _ in 0..10 {
let cached_clone = Arc::clone(&cached);
let handle = tokio::spawn(async move { cached_clone.get_episode_cached(episode_id).await });
handles.push(handle);
}
let results: Vec<_> = futures::future::join_all(handles)
.await
.into_iter()
.flatten()
.collect();
for result in results {
assert!(result.is_ok());
let episode_opt = result.unwrap();
assert!(episode_opt.is_some());
assert_eq!(episode_opt.unwrap().episode_id, episode_id);
}
}
#[tokio::test]
async fn test_concurrent_episode_updates() {
let (storage, _dir) = create_test_turso_storage().await;
let cached = Arc::new(CachedTursoStorage::new(storage, CacheConfig::default()));
let episode_id = Uuid::new_v4();
let mut handles = Vec::new();
for i in 0..5 {
let cached_clone = Arc::clone(&cached);
let handle = tokio::spawn(async move {
let episode = create_test_episode(episode_id);
let mut updated = episode.clone();
updated.task_description = format!("Updated episode {}", i);
let _ = cached_clone.store_episode_cached(&updated).await;
});
handles.push(handle);
}
let _results: Vec<()> = futures::future::join_all(handles)
.await
.into_iter()
.flatten()
.collect();
let result = cached.get_episode_cached(episode_id).await.unwrap();
assert!(result.is_some());
}
#[tokio::test]
async fn test_mixed_read_write_operations() {
let (storage, _dir) = create_test_turso_storage().await;
let cached = Arc::new(CachedTursoStorage::new(storage, CacheConfig::default()));
let mut handles = Vec::new();
for i in 0..20 {
let cached_clone = Arc::clone(&cached);
let id = Uuid::new_v4();
let handle = tokio::spawn(async move {
if i % 3 == 0 {
let episode = create_test_episode(id);
let _ = cached_clone.store_episode_cached(&episode).await;
} else {
let _ = cached_clone.get_episode_cached(id).await;
}
});
handles.push(handle);
}
let _results: Vec<()> = futures::future::join_all(handles)
.await
.into_iter()
.flatten()
.collect();
}