diff --git a/crates/db/tests/ai_credits_reaper.rs b/crates/db/tests/ai_credits_reaper.rs index 44a8d05..deb6ed3 100644 --- a/crates/db/tests/ai_credits_reaper.rs +++ b/crates/db/tests/ai_credits_reaper.rs @@ -23,6 +23,17 @@ async fn expired_hold_is_swept_and_credits_return_to_available() { let pool = pool().await; let user_id = Uuid::parse_str("33333333-3333-3333-3333-333333333333").unwrap(); + // user_ai_subscriptions.user_id has a FK to users(id) - this fixed UUID + // isn't a real seeded user in every environment this test might run + // against (e.g. a fresh CI database), so provision it here rather than + // assuming it pre-exists. Matches ai_credits.rs's make_user() pattern. + sqlx::query("INSERT INTO users (id, email, password_hash) VALUES ($1, $2, 'x') ON CONFLICT (id) DO NOTHING") + .bind(user_id) + .bind(format!("{user_id}@test.local")) + .execute(&pool) + .await + .unwrap(); + AiCreditsRepository::ensure_wallet(&pool, user_id).await.unwrap(); let hold = AiCreditsRepository::try_reserve_credits(&pool, user_id, "help_answer", 4, None, None)