NoteProjetDaoTest.swift 106 lignes · 4072 octets
import XCTest
@testable import Card2vcf

/// Port de NoteProjetDaoTest Android — exerc\u{e9} via InMemoryCrmDatabase.
final class NoteProjetDaoTest: XCTestCase {
    private var db: InMemoryCrmDatabase!

    override func setUp() {
        super.setUp()
        db = InMemoryCrmDatabase()
    }

    func testUpsertInsertEtGetByServerId() async throws {
        var note = NoteProjetEntity()
        note.serverId = "n1"
        note.projetServerId = "p1"
        note.titre = "Premi\u{e8}re note"
        note.texte = "Contenu initial"
        note.auteur = "alice"
        note.createdAt = 1_000
        note.updatedAt = 1_000

        let localId = try await db.noteProjetDao.upsert(note)
        XCTAssertGreaterThan(localId, 0)

        let found = try await db.noteProjetDao.getByServerId("n1")
        XCTAssertNotNil(found)
        XCTAssertEqual("Premi\u{e8}re note", found?.titre)
        XCTAssertEqual("Contenu initial", found?.texte)
        XCTAssertEqual("p1", found?.projetServerId)
        XCTAssertEqual("alice", found?.auteur)
    }

    func testUpsertMiseAJour() async throws {
        var note = NoteProjetEntity()
        note.serverId = "n2"
        note.projetServerId = "p1"
        note.titre = "Titre original"
        note.texte = "Texte original"
        note.auteur = "bob"
        note.createdAt = 500
        note.updatedAt = 500
        let localId = try await db.noteProjetDao.upsert(note)

        var updated = note
        updated.localId = localId
        updated.titre = "Titre modifi\u{e9}"
        updated.updatedAt = 600
        try await db.noteProjetDao.upsert(updated)

        let found = try await db.noteProjetDao.getByServerId("n2")
        XCTAssertEqual("Titre modifi\u{e9}", found?.titre)
        XCTAssertEqual(600, found?.updatedAt)
    }

    func testListByProjetServerId() async throws {
        var n1 = NoteProjetEntity()
        n1.serverId = "n1"; n1.projetServerId = "pA"; n1.titre = "A1"; n1.texte = ""; n1.auteur = "x"; n1.createdAt = 1
        var n2 = NoteProjetEntity()
        n2.serverId = "n2"; n2.projetServerId = "pA"; n2.titre = "A2"; n2.texte = ""; n2.auteur = "x"; n2.createdAt = 2
        var n3 = NoteProjetEntity()
        n3.serverId = "n3"; n3.projetServerId = "pB"; n3.titre = "B1"; n3.texte = ""; n3.auteur = "x"; n3.createdAt = 3

        try await db.noteProjetDao.upsert(n1)
        try await db.noteProjetDao.upsert(n2)
        try await db.noteProjetDao.upsert(n3)

        let forA = try await db.noteProjetDao.listByProjetServerId("pA")
        XCTAssertEqual(2, forA.count)
        XCTAssertTrue(forA.contains { $0.serverId == "n1" })
        XCTAssertTrue(forA.contains { $0.serverId == "n2" })

        let forB = try await db.noteProjetDao.listByProjetServerId("pB")
        XCTAssertEqual(1, forB.count)
        XCTAssertEqual("n3", forB.first?.serverId)
    }

    func testDeleteByServerId() async throws {
        var note = NoteProjetEntity()
        note.serverId = "n-del"; note.projetServerId = "p1"; note.titre = "T"; note.texte = ""; note.auteur = ""; note.createdAt = 1
        try await db.noteProjetDao.upsert(note)

        try await db.noteProjetDao.deleteByServerId("n-del")

        let found = try await db.noteProjetDao.getByServerId("n-del")
        XCTAssertNil(found)
    }

    func testAudioPathPreserved() async throws {
        var note = NoteProjetEntity()
        note.serverId = "n-audio"; note.projetServerId = "p1"; note.titre = "Avec audio"
        note.texte = "Texte"; note.auteur = "alice"; note.createdAt = 100; note.updatedAt = 100
        note.audioPath = "/local/notes/n-audio.wav"
        let localId = try await db.noteProjetDao.upsert(note)

        // Met \u{e0} jour sans changer audioPath
        var updated = note
        updated.localId = localId
        updated.titre = "Titre mis \u{e0} jour"
        updated.updatedAt = 200
        try await db.noteProjetDao.upsert(updated)

        let found = try await db.noteProjetDao.getByServerId("n-audio")
        XCTAssertEqual("/local/notes/n-audio.wav", found?.audioPath)
    }
}