TM-SGNL-iOS/Signal/test/Contacts/AuthorMergeHelperBuilderTest.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

81 lines
3.8 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import GRDB
import LibSignalClient
import XCTest
@testable import Signal
@testable import SignalServiceKit
final class AuthorMergeHelperBuilderTest: XCTestCase {
func testBuildTableIfNeeded() async {
let appContext = TestAppContext()
let authorMergeHelper = AuthorMergeHelper()
let inMemoryDb = InMemoryDB()
let recipientDatabaseTable = MockRecipientDatabaseTable()
let aci1 = Aci.constantForTesting("00000000-0000-4000-8000-0000000000a1")
let aci2 = Aci.constantForTesting("00000000-0000-4000-8000-0000000000a2")
let phoneNumber1 = E164("+16505550101")!
let phoneNumber2 = E164("+16505550102")!
inMemoryDb.write { tx in
recipientDatabaseTable.insertRecipient(SignalRecipient(aci: aci1, pni: nil, phoneNumber: phoneNumber1), transaction: tx)
}
inMemoryDb.write { tx in
let db = tx.db
insertObject(rowId: 1, aci: aci1, phoneNumber: phoneNumber1, db: db)
insertObject(rowId: 2, aci: aci1, phoneNumber: phoneNumber2, db: db)
insertObject(rowId: 3, aci: aci2, phoneNumber: phoneNumber1, db: db)
insertObject(rowId: 4, aci: aci2, phoneNumber: phoneNumber2, db: db)
insertObject(rowId: 5, aci: nil, phoneNumber: phoneNumber1, db: db)
insertObject(rowId: 6, aci: nil, phoneNumber: phoneNumber1, db: db)
insertObject(rowId: 7, aci: nil, phoneNumber: phoneNumber2, db: db)
insertObject(rowId: 8, aci: nil, phoneNumber: phoneNumber2, db: db)
insertObject(rowId: 9, aci: aci1, phoneNumber: nil, db: db)
}
await AuthorMergeHelperBuilder(
appContext: appContext,
authorMergeHelper: authorMergeHelper,
db: inMemoryDb,
modelReadCaches: AuthorMergeHelperBuilder_MockModelReadCaches(),
recipientDatabaseTable: recipientDatabaseTable
).buildTableIfNeeded()
inMemoryDb.read { tx in
XCTAssertEqual(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber1.stringValue, tx: tx), false)
XCTAssertEqual(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber2.stringValue, tx: tx), true)
let db = tx.db
XCTAssert(containsObject(rowId: 1, aci: aci1, phoneNumber: nil, db: db))
XCTAssert(containsObject(rowId: 2, aci: aci1, phoneNumber: nil, db: db))
XCTAssert(containsObject(rowId: 3, aci: aci2, phoneNumber: nil, db: db))
XCTAssert(containsObject(rowId: 4, aci: aci2, phoneNumber: nil, db: db))
XCTAssert(containsObject(rowId: 5, aci: aci1, phoneNumber: nil, db: db))
XCTAssert(containsObject(rowId: 6, aci: aci1, phoneNumber: nil, db: db))
XCTAssert(containsObject(rowId: 7, aci: nil, phoneNumber: phoneNumber2, db: db))
XCTAssert(containsObject(rowId: 8, aci: nil, phoneNumber: phoneNumber2, db: db))
XCTAssert(containsObject(rowId: 9, aci: aci1, phoneNumber: nil, db: db))
}
}
private func insertObject(rowId: Int64, aci: Aci?, phoneNumber: E164?, db: Database) {
let sqlQuery = """
INSERT INTO "pending_read_receipts" ("id", "threadId", "messageTimestamp", "authorPhoneNumber", "authorUuid")
VALUES (?, 0, 0, ?, ?)
"""
try! db.execute(sql: sqlQuery, arguments: [rowId, phoneNumber?.stringValue, aci?.serviceIdUppercaseString])
}
private func containsObject(rowId: Int64, aci: Aci?, phoneNumber: E164?, db: Database) -> Bool {
let sqlQuery = """
SELECT 1 FROM "pending_read_receipts" WHERE "id" = ? AND "authorPhoneNumber" IS ? AND "authorUuid" IS ?
"""
return try! Bool.fetchOne(db, sql: sqlQuery, arguments: [rowId, phoneNumber?.stringValue, aci?.serviceIdUppercaseString]) ?? false
}
}