171 lines
8.0 KiB
Swift
171 lines
8.0 KiB
Swift
//
|
||
// Copyright 2022 Signal Messenger, LLC
|
||
// SPDX-License-Identifier: AGPL-3.0-only
|
||
//
|
||
|
||
import LibSignalClient
|
||
import XCTest
|
||
|
||
@testable import SignalServiceKit
|
||
|
||
class UserProfileTest: SignalBaseTest {
|
||
override func setUp() {
|
||
super.setUp()
|
||
// Create local account.
|
||
SSKEnvironment.shared.databaseStorageRef.write { tx in
|
||
(DependenciesBridge.shared.registrationStateChangeManager as! RegistrationStateChangeManagerImpl).registerForTests(
|
||
localIdentifiers: .forUnitTests,
|
||
tx: tx
|
||
)
|
||
}
|
||
}
|
||
|
||
func testGetUserProfile() {
|
||
let addresses: [SignalServiceAddress] = [
|
||
SignalServiceAddress(Aci.randomForTesting()),
|
||
SignalServiceAddress(Pni.randomForTesting()),
|
||
SignalServiceAddress(phoneNumber: "+16505550101"),
|
||
]
|
||
write { tx in
|
||
for address in addresses {
|
||
OWSUserProfile(address: .otherUser(address)).anyInsert(transaction: tx)
|
||
}
|
||
}
|
||
read { tx in
|
||
for address in addresses {
|
||
let actual = OWSUserProfile.getUserProfile(for: .otherUser(address), tx: tx)
|
||
XCTAssertEqual(actual?.serviceIdString, address.serviceIdUppercaseString)
|
||
XCTAssertEqual(actual?.phoneNumber, address.phoneNumber)
|
||
}
|
||
}
|
||
read { tx in
|
||
let actual = OWSUserProfile.getUserProfile(for: .otherUser(SignalServiceAddress.randomForTesting()), tx: tx)
|
||
XCTAssertNil(actual)
|
||
}
|
||
}
|
||
|
||
func testGetFor() {
|
||
let addresses: [SignalServiceAddress] = [
|
||
SignalServiceAddress(Aci.randomForTesting()),
|
||
SignalServiceAddress(Pni.randomForTesting()),
|
||
SignalServiceAddress(phoneNumber: "+16505550101"),
|
||
]
|
||
write { tx in
|
||
for address in addresses {
|
||
OWSUserProfile(address: .otherUser(address)).anyInsert(transaction: tx)
|
||
}
|
||
}
|
||
read { tx in
|
||
let addressesToFetch: [SignalServiceAddress] = addresses + [SignalServiceAddress.randomForTesting()]
|
||
let userProfiles = OWSUserProfile.getUserProfiles(for: addressesToFetch.map { .otherUser($0) }, tx: tx)
|
||
XCTAssertEqual(userProfiles.count, 4)
|
||
XCTAssertEqual(userProfiles[0]?.serviceId, addresses[0].serviceId)
|
||
XCTAssertEqual(userProfiles[1]?.serviceId, addresses[1].serviceId)
|
||
XCTAssertEqual(userProfiles[2]?.phoneNumber, addresses[2].phoneNumber)
|
||
XCTAssertNil(userProfiles[3])
|
||
}
|
||
}
|
||
}
|
||
|
||
final class UserProfile2Test: XCTestCase {
|
||
func testDecodeStableRow() throws {
|
||
let db = InMemoryDB()
|
||
try db.write { tx in
|
||
try tx.database.execute(sql: """
|
||
INSERT INTO "model_OWSUserProfile" (
|
||
"id","recordType","uniqueId","avatarFileName","avatarUrlPath","profileKey","profileName","recipientPhoneNumber","recipientUUID","familyName","lastFetchDate","lastMessagingDate","bio","bioEmoji","profileBadgeInfo","isStoriesCapable","canReceiveGiftBadges","isPniCapable"
|
||
) VALUES (
|
||
1,
|
||
41,
|
||
'00000000-0000-4000-8000-00000000000A',
|
||
NULL,
|
||
NULL,
|
||
X'62706c6973743030d40102030405061415582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a407080d0e55246e756c6cd2090a0b0c576b6579446174615624636c617373800280034f10200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20d20f1011125824636c61737365735a24636c6173736e616d65a212135c4f57534145533235364b6579584e534f626a6563745f100f4e534b657965644172636869766572d1161754726f6f74800108111a232d32373c42474f56585a7d828b9699a6afc1c4c900000000000001010000000000000018000000000000000000000000000000cb',
|
||
'Bob',
|
||
'kLocalProfileUniqueId',
|
||
NULL,
|
||
'Smith',
|
||
1700000000.0000000000,
|
||
NULL,
|
||
'Speak',
|
||
'😂',
|
||
CAST('[]' AS BLOB),
|
||
0,
|
||
0,
|
||
0
|
||
),
|
||
(
|
||
2,
|
||
41,
|
||
'00000000-0000-4000-8000-00000000000B',
|
||
'00000000-0000-4000-8000-00000000000C.jpg',
|
||
'profiles/AAAAAAAAAAAAAAAAAAAAAA==',
|
||
X'02030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021',
|
||
'Alice',
|
||
'+16505550102',
|
||
'00000000-0000-4000-8000-00000000000D',
|
||
'Johnson',
|
||
1700000000.0000000000,
|
||
1702000000.0000000000,
|
||
'Freely',
|
||
'😀',
|
||
CAST('[{"badgeId":"BOOST"}]' AS BLOB),
|
||
1,
|
||
1,
|
||
1
|
||
);
|
||
""")
|
||
}
|
||
try db.read { tx in
|
||
let userProfiles = try OWSUserProfile.fetchAll(tx.database)
|
||
XCTAssertEqual(userProfiles.count, 2)
|
||
|
||
XCTAssertEqual(userProfiles[0].id, 1)
|
||
XCTAssertEqual(userProfiles[0].uniqueId, "00000000-0000-4000-8000-00000000000A")
|
||
XCTAssertEqual(userProfiles[0].serviceIdString, nil)
|
||
XCTAssertEqual(userProfiles[0].phoneNumber, OWSUserProfile.Constants.localProfilePhoneNumber)
|
||
XCTAssertEqual(userProfiles[0].avatarFileName, nil)
|
||
XCTAssertEqual(userProfiles[0].avatarUrlPath, nil)
|
||
XCTAssertEqual(userProfiles[0].profileKey?.keyData, Data(1...32))
|
||
XCTAssertEqual(userProfiles[0].givenName, "Bob")
|
||
XCTAssertEqual(userProfiles[0].familyName, "Smith")
|
||
XCTAssertEqual(userProfiles[0].bio, "Speak")
|
||
XCTAssertEqual(userProfiles[0].bioEmoji, "😂")
|
||
XCTAssertEqual(userProfiles[0].badges, [])
|
||
XCTAssertEqual(userProfiles[0].lastFetchDate, Date(timeIntervalSince1970: 1700000000))
|
||
XCTAssertEqual(userProfiles[0].lastMessagingDate, nil)
|
||
|
||
XCTAssertEqual(userProfiles[1].id, 2)
|
||
XCTAssertEqual(userProfiles[1].uniqueId, "00000000-0000-4000-8000-00000000000B")
|
||
XCTAssertEqual(userProfiles[1].serviceIdString, "00000000-0000-4000-8000-00000000000D")
|
||
XCTAssertEqual(userProfiles[1].phoneNumber, "+16505550102")
|
||
XCTAssertEqual(userProfiles[1].avatarFileName, "00000000-0000-4000-8000-00000000000C.jpg")
|
||
XCTAssertEqual(userProfiles[1].avatarUrlPath, "profiles/AAAAAAAAAAAAAAAAAAAAAA==")
|
||
XCTAssertEqual(userProfiles[1].profileKey?.keyData, Data(2...33))
|
||
XCTAssertEqual(userProfiles[1].givenName, "Alice")
|
||
XCTAssertEqual(userProfiles[1].familyName, "Johnson")
|
||
XCTAssertEqual(userProfiles[1].bio, "Freely")
|
||
XCTAssertEqual(userProfiles[1].bioEmoji, "😀")
|
||
XCTAssertEqual(userProfiles[1].badges, [OWSUserProfileBadgeInfo(badgeId: "BOOST")])
|
||
XCTAssertEqual(userProfiles[1].lastFetchDate, Date(timeIntervalSince1970: 1700000000))
|
||
XCTAssertEqual(userProfiles[1].lastMessagingDate, Date(timeIntervalSince1970: 1702000000))
|
||
}
|
||
}
|
||
|
||
func testNameComponent() {
|
||
XCTAssertEqual(
|
||
OWSUserProfile.NameComponent(truncating: String(repeating: "A", count: 27))?.stringValue.rawValue,
|
||
String(repeating: "A", count: 26)
|
||
)
|
||
XCTAssertEqual(
|
||
OWSUserProfile.NameComponent(truncating: String(repeating: "👨👩👧👦", count: 6))?.stringValue.rawValue,
|
||
String(repeating: "👨👩👧👦", count: 5)
|
||
)
|
||
// If you strip and then truncate this string, the resulting string would
|
||
// become empty if you strip it again. While you'd normally expect a
|
||
// stripped string to start with a non-strippable character, control
|
||
// characters are treated fairly strangely.
|
||
XCTAssertNil(OWSUserProfile.NameComponent(truncating: "\0" + String(repeating: " ", count: 25) + "A"))
|
||
}
|
||
}
|