imsg/Tests/IMsgCoreTests/MessageDatabaseFixture.swift
2026-05-05 05:31:04 +01:00

101 lines
3.0 KiB
Swift

import SQLite
@testable import IMsgCore
enum MessageDatabaseFixture {
struct SchemaOptions {
var includeAttributedBody = false
var includeReactionColumns = false
var includeThreadOriginatorGUID = false
var includeDestinationCallerID = false
var includeAudioMessage = false
var includeBalloonBundleID = false
var includeAttachmentUserInfo = false
var includeChatMessageDate = false
var includeChatRouting = true
var includeChatHandleJoin = true
}
static func createSchema(_ db: Connection, options: SchemaOptions = SchemaOptions()) throws {
let attributedBodyColumn = options.includeAttributedBody ? "attributedBody BLOB," : ""
let reactionColumns =
options.includeReactionColumns
? "guid TEXT, associated_message_guid TEXT, associated_message_type INTEGER,"
: ""
let threadOriginatorColumn =
options.includeThreadOriginatorGUID ? "thread_originator_guid TEXT," : ""
let destinationCallerColumn =
options.includeDestinationCallerID ? "destination_caller_id TEXT," : ""
let audioMessageColumn = options.includeAudioMessage ? "is_audio_message INTEGER," : ""
let balloonColumn = options.includeBalloonBundleID ? "balloon_bundle_id TEXT," : ""
try db.execute(
"""
CREATE TABLE message (
ROWID INTEGER PRIMARY KEY,
handle_id INTEGER,
text TEXT,
\(attributedBodyColumn)
\(reactionColumns)
\(threadOriginatorColumn)
\(destinationCallerColumn)
\(audioMessageColumn)
\(balloonColumn)
date INTEGER,
is_from_me INTEGER,
service TEXT
);
"""
)
let chatRoutingColumns =
options.includeChatRouting
? "account_id TEXT, account_login TEXT, last_addressed_handle TEXT,"
: ""
try db.execute(
"""
CREATE TABLE chat (
ROWID INTEGER PRIMARY KEY,
chat_identifier TEXT,
guid TEXT,
display_name TEXT,
service_name TEXT,
\(chatRoutingColumns)
reserved TEXT
);
"""
)
try db.execute("CREATE TABLE handle (ROWID INTEGER PRIMARY KEY, id TEXT);")
if options.includeChatHandleJoin {
try db.execute("CREATE TABLE chat_handle_join (chat_id INTEGER, handle_id INTEGER);")
}
let messageDateColumn = options.includeChatMessageDate ? ", message_date INTEGER" : ""
try db.execute(
"CREATE TABLE chat_message_join (chat_id INTEGER, message_id INTEGER\(messageDateColumn));")
let attachmentUserInfoColumn = options.includeAttachmentUserInfo ? ", user_info BLOB" : ""
try db.execute(
"""
CREATE TABLE attachment (
ROWID INTEGER PRIMARY KEY,
filename TEXT,
transfer_name TEXT,
uti TEXT,
mime_type TEXT,
total_bytes INTEGER,
is_sticker INTEGER
\(attachmentUserInfoColumn)
);
"""
)
try db.execute(
"""
CREATE TABLE message_attachment_join (
message_id INTEGER,
attachment_id INTEGER
);
"""
)
}
}