Models: - Convert Conversation and ChatMessage to SwiftData @Model classes with a one-to-many relationship and cascade delete. - Rename ChatMessage.id to clientID and drop Conversation.id in favor of jid (the string id would clash with PersistentIdentifier). - Keep MessageReaction as a Codable value stored in an array attribute. Persistence: - Add ArchiveStore, a per-account ModelContainer/ModelContext that replaces the JSON ChatArchive with load/save/erase. - Add ArchiveMetadataRecord for the durable MAM checkpoints, cursor, locally deleted message IDs and roster contact JIDs. - Add LegacyArchiveImporter to import the old JSON snapshot once and delete the file afterwards, preserving existing history. AppModel: - Replace ChatArchive with ArchiveStore and persist via context.save(); insert new models and delete the replaced object on upsert merges so SwiftData never keeps an orphaned duplicate. Tests: - Replace ChatArchiveTests with ArchiveStoreTests (store round-trip and legacy import) and drop the now-obsolete Codable round-trip assertions.
36 lines
1.1 KiB
Swift
36 lines
1.1 KiB
Swift
import Foundation
|
|
import XCTest
|
|
@testable import Luma
|
|
|
|
final class GroupConversationTests: XCTestCase {
|
|
func testGroupConversationProperties() {
|
|
let conversation = Conversation(
|
|
jid: "team@conference.example.org",
|
|
displayName: "Команда",
|
|
encryptionPreference: .disabled,
|
|
kind: .group,
|
|
groupNickname: "Alice",
|
|
isGroupJoined: true,
|
|
shouldAutojoin: true,
|
|
occupantCount: 4,
|
|
invitedBy: "bob@example.org"
|
|
)
|
|
|
|
XCTAssertTrue(conversation.isGroup)
|
|
XCTAssertEqual(conversation.groupNickname, "Alice")
|
|
XCTAssertEqual(conversation.occupantCount, 4)
|
|
XCTAssertEqual(conversation.invitedBy, "bob@example.org")
|
|
XCTAssertEqual(conversation.encryptionPreference, .disabled)
|
|
}
|
|
|
|
func testNewGroupInheritsGlobalEncryptionByDefault() {
|
|
let conversation = Conversation(
|
|
jid: "team@conference.example.org",
|
|
kind: .group
|
|
)
|
|
|
|
XCTAssertEqual(conversation.encryptionPreference, .inheritGlobal)
|
|
XCTAssertTrue(conversation.isGroup)
|
|
}
|
|
}
|