DuplicateDetectorTest.swift 42 lignes · 1764 octets
import XCTest
@testable import Card2vcf

final class DuplicateDetectorTest: XCTestCase {
    private func contact(
        _ id: Int64,
        emails: [String] = [],
        phones: [String] = []
    ) -> CrmContactEntity {
        CrmContactEntity(id: id, phones: phones, emails: emails)
    }

    func testSameEmailSameCluster() {
        let a = contact(1, emails: ["Ada@Example.COM"])
        let b = contact(2, emails: [" ada@example.com "])
        let c = contact(3, emails: ["other@ex.com"])
        let clusters = DuplicateDetector.clusters(contacts: [a, b, c], exclusions: [])
        XCTAssertEqual(Set([1, 2]), clusters[1])
        XCTAssertEqual(Set([1, 2]), clusters[2])
        XCTAssertEqual(Set([3]), clusters[3])
        XCTAssertEqual(1, DuplicateDetector.duplicateCount(1, clusters: clusters))
        XCTAssertEqual(0, DuplicateDetector.duplicateCount(3, clusters: clusters))
    }

    func testExclusionSeparatesCluster() {
        let a = contact(1, emails: ["same@ex.com"])
        let b = contact(2, emails: ["same@ex.com"])
        let exclusions = [DuplicateExclusionEntity(idA: 1, idB: 2)]
        let clusters = DuplicateDetector.clusters(contacts: [a, b], exclusions: exclusions)
        XCTAssertEqual(Set([1]), clusters[1])
        XCTAssertEqual(Set([2]), clusters[2])
        XCTAssertEqual(0, DuplicateDetector.duplicateCount(1, clusters: clusters))
    }

    func testNormalizedPhoneMatch() {
        let a = contact(10, phones: ["+33 6 12-34"])
        let b = contact(20, phones: ["3361234"])
        let clusters = DuplicateDetector.clusters(contacts: [a, b], exclusions: [])
        XCTAssertEqual(Set([10, 20]), clusters[10])
        XCTAssertTrue(DuplicateDetector.duplicateCount(10, clusters: clusters) == 1)
    }
}