129 lines
4.8 KiB
Rust
129 lines
4.8 KiB
Rust
//! Round-trip tests against a throwaway, freshly migrated SQLite database.
|
|
//!
|
|
//! Run with `SQLX_OFFLINE=true cargo test -p sqlite_database`.
|
|
|
|
use sqlite_database::connection::TaskDbConnection;
|
|
use sqlite_database::queries::create::create_task::{create_task, CreateTaskArgs};
|
|
use sqlite_database::queries::read::get_task_by_provider_and_provider_job_id::{
|
|
get_task_by_provider_and_provider_job_id, GetTaskByProviderAndProviderJobIdArgs,
|
|
};
|
|
use sqlite_database::queries::read::list_tasks_for_frontend::list_tasks_for_frontend;
|
|
use sqlite_database::queries::update::update_successful_task_status_with_metadata::{
|
|
update_successful_task_status_with_metadata, UpdateSuccessfulTaskArgs,
|
|
};
|
|
use sqlite_database::queries::update::update_task_download_locations::{
|
|
update_task_download_locations, UpdateTaskDownloadLocationsArgs,
|
|
};
|
|
use core_types::enums::generation_source::GenerationSource;
|
|
use sqlite_identifiers::enums::task_media_file_class::TaskMediaFileClass;
|
|
use sqlite_identifiers::enums::task_status::TaskStatus;
|
|
use sqlite_identifiers::enums::task_type::TaskType;
|
|
use sqlite_identifiers::ids::media_file_token::MediaFileToken;
|
|
use std::path::Path;
|
|
|
|
const PROVIDER_JOB_ID: &str = "job_test_123";
|
|
|
|
#[tokio::test]
|
|
async fn batch_flag_is_written_on_insert_and_read_back() {
|
|
let (_dir, db) = fresh_database().await;
|
|
|
|
let task_id = create_task(CreateTaskArgs {
|
|
db: &db,
|
|
status: TaskStatus::Pending,
|
|
task_type: TaskType::ImageGeneration,
|
|
model_type: None,
|
|
provider: GenerationSource::Artcraft,
|
|
provider_job_id: Some(PROVIDER_JOB_ID),
|
|
is_batch_generation: true,
|
|
queue_status_url: None,
|
|
queue_response_url: None,
|
|
prompt_token: None,
|
|
frontend_caller: None,
|
|
frontend_subscriber_id: None,
|
|
frontend_subscriber_payload: None,
|
|
}).await.unwrap();
|
|
|
|
let task = get_task_by_provider_and_provider_job_id(GetTaskByProviderAndProviderJobIdArgs {
|
|
db: &db,
|
|
provider: GenerationSource::Artcraft,
|
|
provider_job_id: PROVIDER_JOB_ID,
|
|
}).await.unwrap().expect("task exists");
|
|
assert_eq!(task.id, task_id);
|
|
assert!(task.is_batch_generation);
|
|
|
|
let listed = list_tasks_for_frontend(&db).await.unwrap();
|
|
assert_eq!(listed.tasks.len(), 1);
|
|
assert!(listed.tasks[0].is_batch_generation);
|
|
assert_eq!(listed.tasks[0].on_complete_directory_location, None);
|
|
assert_eq!(listed.tasks[0].on_complete_first_file_location, None);
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn download_locations_are_recorded_on_completion() {
|
|
let (_dir, db) = fresh_database().await;
|
|
|
|
let task_id = create_task(CreateTaskArgs {
|
|
db: &db,
|
|
status: TaskStatus::Pending,
|
|
task_type: TaskType::VideoGeneration,
|
|
model_type: None,
|
|
provider: GenerationSource::Artcraft,
|
|
provider_job_id: Some(PROVIDER_JOB_ID),
|
|
is_batch_generation: false,
|
|
queue_status_url: None,
|
|
queue_response_url: None,
|
|
prompt_token: None,
|
|
frontend_caller: None,
|
|
frontend_subscriber_id: None,
|
|
frontend_subscriber_payload: None,
|
|
}).await.unwrap();
|
|
|
|
let media_token = MediaFileToken::new_from_str("m_test");
|
|
let completed = update_successful_task_status_with_metadata(UpdateSuccessfulTaskArgs {
|
|
db: &db,
|
|
task_id: &task_id,
|
|
maybe_batch_token: None,
|
|
maybe_primary_media_file_token: Some(&media_token),
|
|
maybe_primary_media_file_class: Some(TaskMediaFileClass::Video),
|
|
maybe_primary_media_file_cdn_url: Some("https://cdn.example/out.mp4"),
|
|
maybe_primary_media_file_thumbnail_url_template: None,
|
|
}).await.unwrap();
|
|
assert!(completed);
|
|
|
|
let recorded = update_task_download_locations(UpdateTaskDownloadLocationsArgs {
|
|
db: &db,
|
|
task_id: &task_id,
|
|
directory_location: Path::new("/Users/someone/Downloads/Artcraft"),
|
|
first_file_location: Path::new("/Users/someone/Downloads/Artcraft/veo_3_2026-08-30.mp4"),
|
|
}).await.unwrap();
|
|
assert!(recorded);
|
|
|
|
let listed = list_tasks_for_frontend(&db).await.unwrap();
|
|
let task = &listed.tasks[0];
|
|
assert_eq!(task.status, TaskStatus::CompleteSuccess);
|
|
assert!(!task.is_batch_generation);
|
|
assert_eq!(task.on_complete_directory_location.as_deref(), Some("/Users/someone/Downloads/Artcraft"));
|
|
assert_eq!(
|
|
task.on_complete_first_file_location.as_deref(),
|
|
Some("/Users/someone/Downloads/Artcraft/veo_3_2026-08-30.mp4"),
|
|
);
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn recording_locations_for_an_unknown_task_updates_nothing() {
|
|
let (_dir, db) = fresh_database().await;
|
|
let recorded = update_task_download_locations(UpdateTaskDownloadLocationsArgs {
|
|
db: &db,
|
|
task_id: &sqlite_identifiers::ids::task_id::TaskId::generate(),
|
|
directory_location: Path::new("/tmp"),
|
|
first_file_location: Path::new("/tmp/x.png"),
|
|
}).await.unwrap();
|
|
assert!(!recorded);
|
|
}
|
|
|
|
async fn fresh_database() -> (tempfile::TempDir, TaskDbConnection) {
|
|
let dir = tempfile::tempdir().unwrap();
|
|
let db = TaskDbConnection::connect_and_migrate(dir.path().join("tasks.sqlite")).await.unwrap();
|
|
(dir, db)
|
|
}
|