Skip to main content

max / goingson

4.3 KB · 106 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: crate::state::SyncClientCell::default(),
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 pending_oauth_servers: Arc::new(std::sync::Mutex::new(std::collections::HashMap::new())),
81 data_dir: std::path::PathBuf::from("/tmp/goingson-test"),
82 };
83
84 (Arc::new(state), user_id)
85 }
86
87 /// Creates a test project and returns its ID.
88 pub async fn create_test_project(state: &AppState, user_id: UserId) -> ProjectId {
89 use goingson_core::{NewProject, ProjectStatus, ProjectType};
90
91 let new_project = NewProject {
92 name: "Test Project".to_string(),
93 description: "A test project".to_string(),
94 project_type: ProjectType::SideProject,
95 status: ProjectStatus::Active,
96 };
97
98 let project = state
99 .projects
100 .create(user_id, new_project)
101 .await
102 .expect("Failed to create test project");
103
104 project.id
105 }
106