ContactSyncMapperTest.swift 100 lignes · 3261 octets
import XCTest
@testable import Card2vcf

final class ContactSyncMapperTest: XCTestCase {
    private let mapper = ContactSyncMapper()

    func testMapsLocalFieldsToApiJson() throws {
        let entity = CrmContactEntity(
            id: 1,
            fullName: "Marie Dubois",
            firstName: "Marie",
            lastName: "Dubois",
            jobTitle: "Directrice",
            phones: ["+33 1 23 45 67 89"],
            emails: ["marie@acme.fr"],
            notes: "Rencontrée au salon",
            serverId: nil,
            statut: "client",
            etape: "qualifie",
            tags: ["vip", "lyon"],
            entrepriseServerId: "ent-42"
        )

        let payload = mapper.toCreatePayload(entity)
        let request = try SyncJson.decode(CreateContactRequest.self, from: payload)

        XCTAssertEqual("Marie", request.prenom)
        XCTAssertEqual("Dubois", request.nom)
        XCTAssertEqual("ent-42", request.entrepriseId)
        XCTAssertEqual("Directrice", request.fonction)
        XCTAssertEqual("marie@acme.fr", request.emails.first?.valeur)
        XCTAssertEqual(1, request.emails.count)
        XCTAssertEqual("+33 1 23 45 67 89", request.telephones.first?.valeur)
        XCTAssertEqual(1, request.telephones.count)
        XCTAssertEqual("Rencontrée au salon", request.notes)
        XCTAssertEqual("client", request.statut)
        XCTAssertEqual("qualifie", request.etape)
        XCTAssertEqual(["vip", "lyon"], request.tags)
    }

    func testSendsEntrepriseNomWhenNoServerLink() throws {
        let entity = CrmContactEntity(
            fullName: "Ada",
            company: " Acme "
        )

        let payload = mapper.toCreatePayload(entity)
        let request = try SyncJson.decode(CreateContactRequest.self, from: payload)

        XCTAssertNil(request.entrepriseId)
        XCTAssertEqual("Acme", request.entrepriseNom)
        XCTAssertTrue(payload.contains(#""entreprise_nom""#))
    }

    func testOmitsEntrepriseNomWhenServerLinkExists() throws {
        let entity = CrmContactEntity(
            fullName: "Ada",
            company: "Acme",
            entrepriseServerId: "ent-42"
        )

        let request = try SyncJson.decode(
            CreateContactRequest.self,
            from: mapper.toCreatePayload(entity)
        )

        XCTAssertEqual("ent-42", request.entrepriseId)
        XCTAssertNil(request.entrepriseNom)
    }

    func testOmitsEntrepriseNomWhenCompanyBlank() throws {
        let entity = CrmContactEntity(
            fullName: "Ada",
            company: "   "
        )

        let request = try SyncJson.decode(
            CreateContactRequest.self,
            from: mapper.toCreatePayload(entity)
        )

        XCTAssertNil(request.entrepriseNom)
    }

    func testSplitsFullNameWhenFirstAndLastMissing() throws {
        let entity = CrmContactEntity(
            fullName: "Jean Paul Sartre",
            emails: ["jp@ex.com"]
        )

        let request = try SyncJson.decode(
            CreateContactRequest.self,
            from: mapper.toCreatePayload(entity)
        )

        XCTAssertEqual("Jean", request.prenom)
        XCTAssertEqual("Paul Sartre", request.nom)
        XCTAssertNil(request.entrepriseId)
    }
}