ContactMergeTest.swift 134 lignes · 4276 octets
import XCTest
@testable import Card2vcf

final class ContactMergeTest: XCTestCase {
    private func contact(
        _ id: Int64,
        fullName: String? = nil,
        firstName: String? = nil,
        lastName: String? = nil,
        company: String? = nil,
        jobTitle: String? = nil,
        website: String? = nil,
        address: String? = nil,
        notes: String? = nil,
        phones: [String] = [],
        emails: [String] = []
    ) -> CrmContactEntity {
        CrmContactEntity(
            id: id,
            fullName: fullName,
            firstName: firstName,
            lastName: lastName,
            company: company,
            jobTitle: jobTitle,
            phones: phones,
            emails: emails,
            website: website,
            address: address,
            notes: notes,
            createdAt: id,
            updatedAt: id,
            phonesText: phones.joined(separator: " "),
            emailsText: emails.joined(separator: " ")
        )
    }

    private func choices(
        keepId: Int64,
        notesMode: NotesMode = .keepPrimary,
        fullNameFromId: Int64? = nil,
        firstNameFromId: Int64? = nil,
        lastNameFromId: Int64? = nil,
        companyFromId: Int64? = nil,
        jobTitleFromId: Int64? = nil,
        websiteFromId: Int64? = nil,
        addressFromId: Int64? = nil
    ) -> MergeFieldChoices {
        MergeFieldChoices(
            fullNameFromId: fullNameFromId ?? keepId,
            firstNameFromId: firstNameFromId ?? keepId,
            lastNameFromId: lastNameFromId ?? keepId,
            companyFromId: companyFromId ?? keepId,
            jobTitleFromId: jobTitleFromId ?? keepId,
            websiteFromId: websiteFromId ?? keepId,
            addressFromId: addressFromId ?? keepId,
            notesMode: notesMode,
            cardImageFromId: nil,
            profileImageFromId: nil,
            keepId: keepId
        )
    }

    func testPicksScalarsAndUnionsLists() {
        let a = contact(
            1,
            fullName: "A",
            firstName: "Ada",
            company: "CoA",
            notes: "note A",
            phones: ["111"],
            emails: ["a@ex.com"]
        )
        let b = contact(
            2,
            fullName: "B",
            lastName: "Lovelace",
            jobTitle: "Eng",
            website: "https://b",
            address: "Paris",
            notes: "note B",
            phones: ["111", "222"],
            emails: ["b@ex.com"]
        )
        let merged = ContactMerge.merge(
            sources: [a, b],
            choices: choices(
                keepId: 1,
                fullNameFromId: 2,
                lastNameFromId: 2,
                jobTitleFromId: 2,
                websiteFromId: 2,
                addressFromId: 2
            ),
            now: 99
        )
        XCTAssertEqual(1, merged.id)
        XCTAssertEqual("B", merged.fullName)
        XCTAssertEqual("Ada", merged.firstName)
        XCTAssertEqual("Lovelace", merged.lastName)
        XCTAssertEqual("CoA", merged.company)
        XCTAssertEqual("Eng", merged.jobTitle)
        XCTAssertEqual("https://b", merged.website)
        XCTAssertEqual("Paris", merged.address)
        XCTAssertEqual("note A", merged.notes)
        XCTAssertEqual(["111", "222"], merged.phones)
        XCTAssertEqual(["a@ex.com", "b@ex.com"], merged.emails)
        XCTAssertEqual("111 222", merged.phonesText)
        XCTAssertEqual("a@ex.com b@ex.com", merged.emailsText)
        XCTAssertEqual(99, merged.updatedAt)
        XCTAssertEqual(1, merged.createdAt)
    }

    func testConcatNotes() {
        let a = contact(1, notes: "alpha")
        let b = contact(2, notes: "beta")
        let merged = ContactMerge.merge(
            sources: [a, b],
            choices: choices(keepId: 1, notesMode: .concat),
            now: 1
        )
        XCTAssertEqual("alpha\n---\nbeta", merged.notes)
    }

    func testConcatNotesBlankBecomesNull() {
        let a = contact(1, notes: "  ")
        let b = contact(2, notes: nil)
        let merged = ContactMerge.merge(
            sources: [a, b],
            choices: choices(keepId: 1, notesMode: .concat),
            now: 1
        )
        XCTAssertNil(merged.notes)
    }
}