TM-SGNL-iOS/SignalUI/RecipientPickers/RecipientPickerViewControllerTest.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

98 lines
4.2 KiB
Swift

//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import LibSignalClient
import XCTest
@testable import SignalServiceKit
@testable import SignalUI
final class RecipientPickerViewControllerTests: XCTestCase {
private struct MockContactDiscoveryManager: ContactDiscoveryManager {
var lookUpBlock: ((Set<String>) async throws -> Set<SignalRecipient>)?
func lookUp(phoneNumbers: Set<String>, mode: ContactDiscoveryMode) async throws -> Set<SignalRecipient> {
return try await lookUpBlock?(phoneNumbers) ?? []
}
}
func testPhoneNumberFinderParseResults() {
let finder = PhoneNumberFinder(
localNumber: "+16505550100",
contactDiscoveryManager: MockContactDiscoveryManager(),
phoneNumberUtil: PhoneNumberUtil()
)
struct TestCase {
var searchText: String
var searchResults: [String]
}
let testCases: [TestCase] = [
// test empty results
TestCase(searchText: "", searchResults: []),
TestCase(searchText: "12", searchResults: []),
TestCase(searchText: "+123.cat", searchResults: []),
TestCase(searchText: "cat.123", searchResults: []),
// test multiple search results
TestCase(searchText: "5215550100", searchResults: ["+15215550100", "+5215550100"]),
// test punctuation and whitespace
TestCase(searchText: "123", searchResults: ["+1123"]),
TestCase(searchText: "+123", searchResults: ["+123"]),
TestCase(searchText: "+1 (23", searchResults: ["+123"]),
TestCase(searchText: "+1 (234) 555-0100", searchResults: ["+12345550100"]),
// test too many digits
TestCase(searchText: "+ 12345 12345 12345 1234", searchResults: ["+1234512345123451234"]),
TestCase(searchText: "+ 12345 12345 12345 12345", searchResults: [])
]
for testCase in testCases {
let searchResults = finder.parseResults(for: testCase.searchText).map { $0.maybeValidE164 }
XCTAssertEqual(searchResults, testCase.searchResults, "searchText: \(testCase.searchText)")
}
}
func testPhoneNumberFinderLookUp() async throws {
struct TestCase {
var searchResult: PhoneNumberFinder.SearchResult
var isValid: Bool
var isFound: Bool
}
let testCases: [TestCase] = [
TestCase(searchResult: .valid(validE164: "+16505550100"), isValid: true, isFound: true),
TestCase(searchResult: .valid(validE164: "+16505550101"), isValid: true, isFound: false),
TestCase(searchResult: .maybeValid(maybeValidE164: "+16505550102"), isValid: true, isFound: true),
TestCase(searchResult: .maybeValid(maybeValidE164: "+1650"), isValid: false, isFound: false)
]
for testCase in testCases {
let context = "searchResult: \(testCase.searchResult)"
let finder = PhoneNumberFinder(
localNumber: "+16505550100",
contactDiscoveryManager: MockContactDiscoveryManager(lookUpBlock: { phoneNumbers in
XCTAssertTrue(testCase.isValid)
return testCase.isFound ? [
SignalRecipient(
aci: Aci.randomForTesting(),
pni: Pni.randomForTesting(),
phoneNumber: E164(phoneNumbers.first)!
)
] : []
}),
phoneNumberUtil: PhoneNumberUtil()
)
let lookupResult = try await finder.lookUp(phoneNumber: testCase.searchResult).awaitable()
switch lookupResult {
case .success:
XCTAssertTrue(testCase.isFound, context)
case .notFound(let validE164):
XCTAssertFalse(testCase.isFound, context)
XCTAssertEqual(validE164, testCase.searchResult.maybeValidE164, context)
case .notValid(let invalidE164):
XCTAssertFalse(testCase.isValid, context)
XCTAssertEqual(invalidE164, testCase.searchResult.maybeValidE164, context)
}
}
}
}