SyncSchemaDaoTest.swift 103 lignes · 3398 octets
import XCTest
@testable import Card2vcf

/// Port of android `sync/SyncSchemaDaoTest.kt` against an in-memory database.
final class SyncSchemaDaoTest: XCTestCase {
    private var db: Card2vcfDatabase!

    override func setUp() {
        super.setUp()
        db = Card2vcfDatabase(inMemory: true)
    }

    override func tearDown() {
        db = nil
        super.tearDown()
    }

    func testSyncOpInsertAndList() async throws {
        let dao = db.syncOpDao
        let id = try await dao.insert(
            SyncOpEntity(
                entityType: "contact",
                op: "create",
                payloadJson: #"{"fullName":"Ada"}"#,
                localId: 42,
                createdAt: 1000
            )
        )
        let ops = try await dao.listAll()
        XCTAssertEqual(1, ops.count)
        XCTAssertEqual(id, ops[0].id)
        XCTAssertEqual("contact", ops[0].entityType)
        XCTAssertEqual("create", ops[0].op)
        XCTAssertEqual(42, ops[0].localId)
        let fetched = try await dao.getById(id)
        XCTAssertNotNil(fetched)
        try await dao.deleteById(id)
        let afterDelete = try await dao.getById(id)
        XCTAssertNil(afterDelete)
        let empty = try await dao.listAll()
        XCTAssertEqual(0, empty.count)
    }

    func testSyncOpMarkFailurePersistsAttemptsAndLastError() async throws {
        let dao = db.syncOpDao
        let id = try await dao.insert(
            SyncOpEntity(
                entityType: "contact",
                op: "create",
                payloadJson: #"{"fullName":"Ada"}"#,
                localId: 42,
                createdAt: 1000
            )
        )

        try await dao.markFailure(id: id, error: "Erreur interne.")

        let op = try await dao.getById(id)
        XCTAssertEqual(1, op?.attempts)
        XCTAssertEqual("Erreur interne.", op?.lastError)

        try await dao.markFailure(id: id, error: nil)
        let again = try await dao.getById(id)
        XCTAssertEqual(2, again?.attempts)
        XCTAssertNil(again?.lastError)
    }

    func testTacheUpsertAndGetByServerId() async throws {
        let dao = db.tacheDao
        let localId = try await dao.upsert(
            TacheEntity(
                serverId: "tache-1",
                projetServerId: "projet-1",
                titre: "Préparer démo",
                colonneId: "col-a",
                ordre: 2,
                assigneA: "alice",
                auteur: "bob",
                createdAt: 500,
                updatedAt: 600
            )
        )
        var found = try await dao.getByServerId("tache-1")
        XCTAssertNotNil(found)
        XCTAssertEqual(localId, found!.localId)
        XCTAssertEqual("Préparer démo", found!.titre)
        XCTAssertEqual("projet-1", found!.projetServerId)
        XCTAssertEqual(2, found!.ordre)
        XCTAssertEqual("alice", found!.assigneA)

        found!.titre = "Démo prête"
        found!.updatedAt = 700
        try await dao.upsert(found!)
        let updated = try await dao.getByServerId("tache-1")
        XCTAssertEqual("Démo prête", updated!.titre)

        let byProjet = try await dao.listByProjetServerId("projet-1")
        XCTAssertEqual(1, byProjet.count)
        try await dao.deleteByServerId("tache-1")
        let afterDelete = try await dao.getByServerId("tache-1")
        XCTAssertNil(afterDelete)
    }
}