Skip to main content

max / goingson

4.1 KB · 105 lines History Blame Raw
1 //! Test utilities for Tauri command integration tests.
2 //!
3 //! Provides setup helpers for creating test state with in-memory SQLite database.
4
5 use std::sync::Arc;
6
7 use goingson_core::{ProjectId, UserId};
8 use goingson_db_sqlite::{
9 init_pool, run_migrations,
10 SqliteAttachmentRepository, SqliteBackupSettingsRepository, SqliteContactRepository,
11 SqliteDailyNoteRepository, SqliteEmailAccountRepository, SqliteEmailRepository,
12 SqliteEventRepository, SqliteMilestoneRepository,
13 SqliteProjectRepository, SqliteSavedViewRepository, SqliteMonthlyReviewRepository,
14 SqliteSearchRepository, SqliteStatsRepository, SqliteSyncAccountRepository,
15 SqliteTaskRepository, SqliteWeeklyReviewRepository,
16 };
17 use sqlx::SqlitePool;
18
19 use crate::state::AppState;
20
21 /// Creates an in-memory test database with all migrations applied.
22 pub async fn setup_test_db() -> SqlitePool {
23 let pool = init_pool(Some(":memory:"))
24 .await
25 .expect("Failed to create in-memory pool");
26 run_migrations(&pool)
27 .await
28 .expect("Failed to run migrations");
29 pool
30 }
31
32 /// Creates a test user and returns their ID.
33 pub async fn create_test_user(pool: &SqlitePool) -> UserId {
34 let user_id = UserId::new();
35 let now = chrono::Utc::now().format("%Y-%m-%d %H:%M:%S").to_string();
36
37 sqlx::query(
38 "INSERT INTO users (id, email, password_hash, display_name, created_at) VALUES (?, ?, ?, ?, ?)"
39 )
40 .bind(user_id.to_string())
41 .bind(format!("test-{}@example.com", user_id))
42 .bind("test-password-hash")
43 .bind("Test User")
44 .bind(&now)
45 .execute(pool)
46 .await
47 .expect("Failed to create test user");
48
49 user_id
50 }
51
52 /// Creates a fully initialized AppState with in-memory database for testing.
53 pub async fn setup_test_state() -> (Arc<AppState>, UserId) {
54 let pool = setup_test_db().await;
55 let user_id = create_test_user(&pool).await;
56
57 let state = AppState {
58 pool: pool.clone(),
59 projects: Arc::new(SqliteProjectRepository::new(pool.clone())),
60 tasks: Arc::new(SqliteTaskRepository::new(pool.clone())),
61 events: Arc::new(SqliteEventRepository::new(pool.clone())),
62 emails: Arc::new(SqliteEmailRepository::new(pool.clone())),
63 email_accounts: Arc::new(SqliteEmailAccountRepository::new(pool.clone())),
64 contacts: Arc::new(SqliteContactRepository::new(pool.clone())),
65 daily_notes: Arc::new(SqliteDailyNoteRepository::new(pool.clone())),
66 attachments: Arc::new(SqliteAttachmentRepository::new(pool.clone())),
67 stats: Arc::new(SqliteStatsRepository::new(pool.clone())),
68 search: Arc::new(SqliteSearchRepository::new(pool.clone())),
69 milestones: Arc::new(SqliteMilestoneRepository::new(pool.clone())),
70 saved_views: Arc::new(SqliteSavedViewRepository::new(pool.clone())),
71 weekly_reviews: Arc::new(SqliteWeeklyReviewRepository::new(pool.clone())),
72 monthly_reviews: Arc::new(SqliteMonthlyReviewRepository::new(pool.clone())),
73 backup_settings: Arc::new(SqliteBackupSettingsRepository::new(pool.clone())),
74 sync_accounts: Arc::new(SqliteSyncAccountRepository::new(pool.clone())),
75 sync_client: std::sync::RwLock::new(None),
76 sync_lock: Arc::new(tokio::sync::Mutex::new(())),
77 email_sync_locks: Arc::new(std::sync::Mutex::new(std::collections::HashSet::new())),
78 token_refresh_locks: Arc::new(std::sync::Mutex::new(std::collections::HashMap::new())),
79 pending_oauth_flows: Arc::new(std::sync::Mutex::new(std::collections::HashMap::new())),
80 data_dir: std::path::PathBuf::from("/tmp/goingson-test"),
81 };
82
83 (Arc::new(state), user_id)
84 }
85
86 /// Creates a test project and returns its ID.
87 pub async fn create_test_project(state: &AppState, user_id: UserId) -> ProjectId {
88 use goingson_core::{NewProject, ProjectStatus, ProjectType};
89
90 let new_project = NewProject {
91 name: "Test Project".to_string(),
92 description: "A test project".to_string(),
93 project_type: ProjectType::SideProject,
94 status: ProjectStatus::Active,
95 };
96
97 let project = state
98 .projects
99 .create(user_id, new_project)
100 .await
101 .expect("Failed to create test project");
102
103 project.id
104 }
105