CalendarBindingsStoreTest.swift 103 lignes · 3401 octets
import XCTest
@testable import Card2vcf

final class CalendarBindingsStoreTest: XCTestCase {
    private static let suiteName = "card2vcf_calendar_bindings_test"

    private var defaults: UserDefaults!
    private var store: CalendarBindingsStore!

    override func setUp() {
        super.setUp()
        defaults = UserDefaults(suiteName: Self.suiteName)
        defaults.removePersistentDomain(forName: Self.suiteName)
        store = CalendarBindingsStore(defaults: defaults)
    }

    override func tearDown() {
        defaults.removePersistentDomain(forName: Self.suiteName)
        super.tearDown()
    }

    func testInitiallyEmpty() {
        XCTAssertTrue(store.list().isEmpty)
    }

    func testUpsertRoundTrip() {
        let binding = CalendarBinding(kind: "rdv", displayName: "Mes RDV", androidCalendarId: 42)

        store.upsert(binding)

        XCTAssertEqual([binding], store.list())
    }

    func testUpsertReplacesExistingBindingWithSameKindAndServerResourceId() {
        let original = CalendarBinding(
            kind: "salle",
            serverResourceId: "salle-1",
            displayName: "Salle A",
            androidCalendarId: 1
        )
        var renamed = original
        renamed.displayName = "Salle A (renommée)"
        renamed.androidCalendarId = 2

        store.upsert(original)
        store.upsert(renamed)

        XCTAssertEqual([renamed], store.list())
    }

    func testUpsertKeepsDistinctBindingsByKindAndServerResourceId() {
        let rdv = CalendarBinding(kind: "rdv", displayName: "Mes RDV")
        let salle = CalendarBinding(kind: "salle", serverResourceId: "salle-1", displayName: "Salle A")
        let materiel = CalendarBinding(kind: "materiel", serverResourceId: "materiel-1", displayName: "Matériel A")

        store.upsert(rdv)
        store.upsert(salle)
        store.upsert(materiel)

        XCTAssertEqual(3, store.list().count)
        XCTAssertTrue(store.list().contains(rdv))
        XCTAssertTrue(store.list().contains(salle))
        XCTAssertTrue(store.list().contains(materiel))
    }

    func testRemoveDeletesMatchingBinding() {
        let salle = CalendarBinding(kind: "salle", serverResourceId: "salle-1", displayName: "Salle A")
        store.upsert(salle)

        store.remove(kind: "salle", serverResourceId: "salle-1")

        XCTAssertTrue(store.list().isEmpty)
    }

    func testRemoveOnlyAffectsMatchingKindAndServerResourceId() {
        let salleA = CalendarBinding(kind: "salle", serverResourceId: "salle-1", displayName: "Salle A")
        let salleB = CalendarBinding(kind: "salle", serverResourceId: "salle-2", displayName: "Salle B")
        store.upsert(salleA)
        store.upsert(salleB)

        store.remove(kind: "salle", serverResourceId: "salle-1")

        XCTAssertEqual([salleB], store.list())
    }

    func testRemoveWithNilServerResourceIdTargetsRdvBinding() {
        let rdv = CalendarBinding(kind: "rdv", displayName: "Mes RDV")
        store.upsert(rdv)

        store.remove(kind: "rdv", serverResourceId: nil)

        XCTAssertTrue(store.list().isEmpty)
    }

    func testClearRemovesAllBindings() {
        store.upsert(CalendarBinding(kind: "rdv", displayName: "Mes RDV"))
        store.upsert(CalendarBinding(kind: "salle", serverResourceId: "salle-1", displayName: "Salle A"))

        store.clear()

        XCTAssertTrue(store.list().isEmpty)
    }
}