Signal-iOS/SignalServiceKit/tests/Contacts/AuthorMergeHelperTest.swift
Max Radermacher 4fe2cc6047
Improve AuthorMergeObserver performance
Co-authored-by: Harry <109690906+harry-signal@users.noreply.github.com>
2023-10-31 02:10:20 -05:00

87 lines
4.6 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import XCTest
@testable import SignalServiceKit
final class AuthorMergeHelperTest: XCTestCase {
func testShouldCleanUp() throws {
let phoneNumber = "+16505550101"
let authorMergeHelper = AuthorMergeHelper(keyValueStoreFactory: InMemoryKeyValueStoreFactory())
try MockDB().write { tx in
XCTAssertTrue(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber, tx: tx))
try authorMergeHelper.setCurrentVersion(nextVersion: 1, tx: tx)
XCTAssertFalse(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber, tx: tx))
}
}
func testShouldCleanUpThenJustLearnedThenRebuilt() throws {
let phoneNumber = "+16505550101"
let authorMergeHelper = AuthorMergeHelper(keyValueStoreFactory: InMemoryKeyValueStoreFactory())
try MockDB().write { tx in
authorMergeHelper.foundMissingAci(for: phoneNumber, tx: tx)
try authorMergeHelper.setCurrentVersion(nextVersion: 1, tx: tx)
XCTAssertTrue(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber, tx: tx))
authorMergeHelper.maybeJustLearnedAci(for: phoneNumber, tx: tx)
XCTAssertTrue(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber, tx: tx))
try authorMergeHelper.setCurrentVersion(nextVersion: 2, tx: tx)
XCTAssertFalse(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber, tx: tx))
}
}
func testShouldCleanUpThenJustLearnedThenDisassociate() throws {
let phoneNumber = "+16505550101"
let authorMergeHelper = AuthorMergeHelper(keyValueStoreFactory: InMemoryKeyValueStoreFactory())
try MockDB().write { tx in
authorMergeHelper.foundMissingAci(for: phoneNumber, tx: tx)
try authorMergeHelper.setCurrentVersion(nextVersion: 1, tx: tx)
XCTAssertTrue(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber, tx: tx))
authorMergeHelper.maybeJustLearnedAci(for: phoneNumber, tx: tx)
XCTAssertTrue(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber, tx: tx))
authorMergeHelper.didCleanUp(phoneNumber: phoneNumber, tx: tx)
XCTAssertFalse(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber, tx: tx))
try authorMergeHelper.setCurrentVersion(nextVersion: 2, tx: tx)
XCTAssertFalse(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber, tx: tx))
}
}
func testJustLearnedWhenNotJustLearned() throws {
let phoneNumber = "+16505550101"
let authorMergeHelper = AuthorMergeHelper(keyValueStoreFactory: InMemoryKeyValueStoreFactory())
try MockDB().write { tx in
authorMergeHelper.maybeJustLearnedAci(for: phoneNumber, tx: tx)
XCTAssertEqual(authorMergeHelper.nextVersion(tx: tx), 1)
try authorMergeHelper.setCurrentVersion(nextVersion: 1, tx: tx)
authorMergeHelper.maybeJustLearnedAci(for: phoneNumber, tx: tx)
XCTAssertEqual(authorMergeHelper.nextVersion(tx: tx), 1)
}
}
func testInvalidatedWhileBuilding() throws {
let phoneNumber1 = "+16505550101"
let phoneNumber2 = "+16505550102"
let phoneNumber3 = "+16505550103"
let authorMergeHelper = AuthorMergeHelper(keyValueStoreFactory: InMemoryKeyValueStoreFactory())
try MockDB().write { tx in
authorMergeHelper.foundMissingAci(for: phoneNumber1, tx: tx)
authorMergeHelper.foundMissingAci(for: phoneNumber2, tx: tx)
authorMergeHelper.foundMissingAci(for: phoneNumber3, tx: tx)
try authorMergeHelper.setCurrentVersion(nextVersion: 1, tx: tx)
authorMergeHelper.maybeJustLearnedAci(for: phoneNumber1, tx: tx)
XCTAssertEqual(authorMergeHelper.nextVersion(tx: tx), 2)
authorMergeHelper.maybeJustLearnedAci(for: phoneNumber2, tx: tx)
XCTAssertThrowsError(try authorMergeHelper.setCurrentVersion(nextVersion: 2, tx: tx))
XCTAssertTrue(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber1, tx: tx))
XCTAssertTrue(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber2, tx: tx))
XCTAssertTrue(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber3, tx: tx))
try authorMergeHelper.setCurrentVersion(nextVersion: 3, tx: tx)
XCTAssertFalse(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber1, tx: tx))
XCTAssertFalse(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber2, tx: tx))
XCTAssertTrue(authorMergeHelper.shouldCleanUp(phoneNumber: phoneNumber3, tx: tx))
}
}
}