TM-SGNL-iOS/SignalServiceKit/tests/Contacts/UserProfileMergerTest.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

115 lines
4.8 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import LibSignalClient
import XCTest
@testable import SignalServiceKit
class UserProfileMergerTest: XCTestCase {
private var userProfileStore: MockUserProfileStore!
private var userProfileMerger: UserProfileMerger!
override func setUp() {
super.setUp()
userProfileStore = MockUserProfileStore()
userProfileMerger = UserProfileMerger(
userProfileStore: userProfileStore,
setProfileKeyShim: { [userProfileStore] userProfile, profileKey, tx in
userProfile.setValue(profileKey, forKey: "profileKey")
userProfileStore!.updateUserProfile(userProfile, tx: tx)
}
)
}
func testMergeLocal() {
let aci = Aci.constantForTesting("00000000-0000-4000-8000-000000000aaa")
let pni = Pni.constantForTesting("PNI:00000000-0000-4000-8000-000000000bbb")
let phoneNumber = E164("+16505550100")!
let localProfile = buildUserProfile(serviceId: nil, phoneNumber: OWSUserProfile.Constants.localProfilePhoneNumber, profileKey: nil)
let otherProfile = buildUserProfile(serviceId: Aci.randomForTesting(), phoneNumber: nil, profileKey: nil)
userProfileStore.userProfiles = [
localProfile,
buildUserProfile(serviceId: aci, phoneNumber: nil, profileKey: Data(repeating: 1, count: 32)),
buildUserProfile(serviceId: nil, phoneNumber: phoneNumber.stringValue, profileKey: Data(repeating: 2, count: 32)),
buildUserProfile(serviceId: pni, phoneNumber: nil, profileKey: Data(repeating: 3, count: 32)),
otherProfile
]
InMemoryDB().write { tx in
userProfileMerger.didLearnAssociation(
mergedRecipient: MergedRecipient(
isLocalRecipient: true,
oldRecipient: nil,
newRecipient: SignalRecipient(aci: aci, pni: pni, phoneNumber: phoneNumber)
),
tx: tx
)
}
XCTAssertEqual(userProfileStore.userProfiles, [localProfile, otherProfile])
}
func testMergeOther() {
let aci = Aci.constantForTesting("00000000-0000-4000-8000-000000000aaa")
let pni = Pni.constantForTesting("PNI:00000000-0000-4000-8000-000000000bbb")
let phoneNumber = E164("+16505550100")!
let localProfile = buildUserProfile(serviceId: nil, phoneNumber: OWSUserProfile.Constants.localProfilePhoneNumber, profileKey: nil)
let otherAciProfile = buildUserProfile(serviceId: Aci.randomForTesting(), phoneNumber: phoneNumber.stringValue, profileKey: nil)
let otherPniProfile = buildUserProfile(serviceId: pni, phoneNumber: "+16505550101", profileKey: nil)
let finalProfile = buildUserProfile(serviceId: aci, phoneNumber: nil, profileKey: nil)
userProfileStore.userProfiles = [
localProfile,
finalProfile,
buildUserProfile(serviceId: aci, phoneNumber: phoneNumber.stringValue, profileKey: Data(repeating: 2, count: 32)),
buildUserProfile(serviceId: nil, phoneNumber: phoneNumber.stringValue, profileKey: Data(repeating: 3, count: 32)),
buildUserProfile(serviceId: pni, phoneNumber: phoneNumber.stringValue, profileKey: Data(repeating: 4, count: 32)),
buildUserProfile(serviceId: pni, phoneNumber: nil, profileKey: Data(repeating: 5, count: 32)),
otherAciProfile,
otherPniProfile
]
InMemoryDB().write { tx in
userProfileMerger.didLearnAssociation(
mergedRecipient: MergedRecipient(
isLocalRecipient: false,
oldRecipient: nil,
newRecipient: SignalRecipient(aci: aci, pni: pni, phoneNumber: phoneNumber)
),
tx: tx
)
}
finalProfile.setValue(Aes256Key(data: Data(repeating: 2, count: 32))!, forKey: "profileKey")
otherAciProfile.phoneNumber = nil
otherPniProfile.serviceIdString = nil
XCTAssertEqual(userProfileStore.userProfiles, [localProfile, finalProfile, otherAciProfile, otherPniProfile])
}
private func buildUserProfile(serviceId: ServiceId?, phoneNumber: String?, profileKey: Data?) -> OWSUserProfile {
return OWSUserProfile(
id: nil,
uniqueId: UUID().uuidString,
serviceIdString: serviceId?.serviceIdUppercaseString,
phoneNumber: phoneNumber,
avatarFileName: nil,
avatarUrlPath: nil,
profileKey: profileKey.map { Aes256Key(data: $0)! },
givenName: nil,
familyName: nil,
bio: nil,
bioEmoji: nil,
badges: [],
lastFetchDate: nil,
lastMessagingDate: nil,
isPhoneNumberShared: false
)
}
}