ContactSyncBadgesTest.swift 53 lignes · 1939 octets
import XCTest
@testable import Card2vcf

final class ContactSyncBadgesTest: XCTestCase {
    private let contact = CrmContactEntity(id: 1, fullName: "Ada", serverId: "srv-1")

    func testPendingWhenCreateOpMatchesByLocalId() {
        let ops = [SyncOpEntity(entityType: "contact", op: "create", localId: 1)]
        XCTAssertEqual(
            [1: ContactSyncBadge.pending],
            ContactSyncBadges.compute(contacts: [contact], ops: ops)
        )
    }

    func testPendingWhenUpdateOpMatchesByServerId() {
        let ops = [SyncOpEntity(entityType: "contact", op: "update", serverId: "srv-1")]
        XCTAssertEqual(
            [1: ContactSyncBadge.pending],
            ContactSyncBadges.compute(contacts: [contact], ops: ops)
        )
    }

    func testErrorWinsOverPending() {
        let ops = [
            SyncOpEntity(id: 1, entityType: "contact", op: "create", localId: 1),
            SyncOpEntity(id: 2, entityType: "contact", op: "update", serverId: "srv-1", lastError: "HTTP 500"),
        ]
        XCTAssertEqual(
            [1: ContactSyncBadge.error],
            ContactSyncBadges.compute(contacts: [contact], ops: ops)
        )
    }

    func testContactWithoutOpHasNoBadge() {
        let ops = [SyncOpEntity(entityType: "contact", op: "create", localId: 99)]
        XCTAssertTrue(ContactSyncBadges.compute(contacts: [contact], ops: ops).isEmpty)
    }

    func testNonContactOpsAreIgnored() {
        let ops = [SyncOpEntity(entityType: "projet", op: "create", localId: 1)]
        XCTAssertTrue(ContactSyncBadges.compute(contacts: [contact], ops: ops).isEmpty)
    }

    func testMediaOpsCountAsContactOps() {
        let ops = [
            SyncOpEntity(entityType: "contact_media", op: "create", localId: 1, serverId: "srv-1"),
        ]
        XCTAssertEqual(
            [1: ContactSyncBadge.pending],
            ContactSyncBadges.compute(contacts: [contact], ops: ops)
        )
    }
}