// Copyright 2025 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import { assert } from 'chai'; import { AttachmentDownloadSource, type WritableDB } from '../../sql/Interface'; import { objectToJSON, sql } from '../../sql/util'; import { createDB, updateToVersion } from './helpers'; import type { AttachmentDownloadJobType } from '../../types/AttachmentDownload'; import { createAttachmentDownloadJob } from '../../test-helpers/attachmentDownloads'; function createJobAndEnsureMessage( db: WritableDB, index: number, overrides?: Partial ) { const job = createAttachmentDownloadJob(index, overrides); try { db.prepare('INSERT INTO messages (id) VALUES ($id)').run({ id: job.messageId, }); } catch (e) { // pass; message has already been inserted } return job; } function insertLegacyJob( db: WritableDB, index: number, overrides?: Partial ): void { const job = createJobAndEnsureMessage(db, index, overrides); const [query, params] = sql` INSERT INTO attachment_downloads ( messageId, attachmentType, attachmentJson, attachmentSignature, ciphertextSize, contentType, size, receivedAt, sentAt, active, attempts, retryAfter, lastAttemptTimestamp, source ) VALUES ( ${job.messageId}, ${job.attachmentType}, ${objectToJSON(job.attachment)}, ${job.attachmentSignature}, ${job.ciphertextSize}, ${job.attachment.contentType}, ${job.attachment.size}, ${job.receivedAt}, ${job.sentAt}, ${job.active ? 1 : 0}, ${job.attempts}, ${job.retryAfter}, ${job.lastAttemptTimestamp}, ${job.source} ); `; db.prepare(query).run(params); } describe('SQL/updateToSchemaVersion1410', () => { let db: WritableDB; afterEach(() => { db.close(); }); it('copies source to originalSource', () => { db = createDB(); updateToVersion(db, 1410); db.transaction(() => { for (let i = 0; i < 15; i += 1) { insertLegacyJob(db, i, { source: i < 5 ? AttachmentDownloadSource.STANDARD : AttachmentDownloadSource.BACKUP_IMPORT, }); } })(); updateToVersion(db, 1420); const numOriginalSourceStandardJobs = db .prepare( "SELECT COUNT(*) FROM attachment_downloads WHERE originalSource = 'standard'", { pluck: true } ) .get(); assert.strictEqual(numOriginalSourceStandardJobs, 5); const numOriginalSourceBackupJobs = db .prepare( "SELECT COUNT(*) FROM attachment_downloads WHERE originalSource = 'backup_import'", { pluck: true } ) .get(); assert.strictEqual(numOriginalSourceBackupJobs, 10); }); });