TachePayloadPlanificationTest.swift 66 lignes · 2604 octets
import XCTest
@testable import Card2vcf

/// Miroir de `UpdateTacheRequestTest.kt`.
///
/// Le serveur applique « absent = ne pas toucher, `null` = effacer ». Ce test
/// fige les deux faces de ce contrat : les champs que le mobile n'édite pas
/// doivent rester **hors** du JSON, et un champ vidé doit partir à `null`.
///
/// `ProjetDetailViewModel` est `@MainActor` : ses membres statiques le sont aussi.
@MainActor
final class TachePayloadPlanificationTest: XCTestCase {

    private func payloadMaj(
        debut: String? = nil,
        dureeJours: Int? = nil,
        etiquette: String? = nil
    ) -> String {
        ProjetDetailViewModel.updateTachePayload(
            titre: "Câblage",
            description: "",
            assigneA: "alice",
            debut: debut,
            dureeJours: dureeJours,
            etiquette: etiquette
        )
    }

    func testNEnvoieJamaisLesChampsQuIlNEditePas() {
        let json = payloadMaj()
        // Ces champs existent côté serveur mais ne sont pas édités sur mobile :
        // les omettre est ce qui les préserve.
        XCTAssertFalse(json.contains("sous_taches"), "les sous-tâches seraient écrasées : \(json)")
        XCTAssertFalse(json.contains("depend_de"), "les dépendances seraient écrasées : \(json)")
        XCTAssertFalse(json.contains("parent_id"), "le regroupement serait écrasé : \(json)")
    }

    func testPorteLaPlanificationQuandElleEstRenseignee() {
        let json = payloadMaj(debut: "2026-07-22", dureeJours: 3, etiquette: "câblage")
        XCTAssertTrue(json.contains(#""debut":"2026-07-22""#), json)
        XCTAssertTrue(json.contains(#""duree_jours":3"#), json)
        XCTAssertTrue(json.contains(#""etiquette":"câblage""#), json)
        XCTAssertTrue(json.contains(#""assigne_a_pose":true"#), json)
    }

    func testUnChampVideEstEnvoyeANullPourEffacer() {
        let json = payloadMaj()
        XCTAssertTrue(json.contains(#""debut":null"#), json)
        XCTAssertTrue(json.contains(#""etiquette":null"#), json)
    }

    func testLaCreationPorteAussiLaPlanification() {
        let json = ProjetDetailViewModel.createTachePayload(
            titre: "Câblage",
            description: "",
            colonneId: "explorer",
            assigneA: nil,
            debut: "2026-07-22",
            dureeJours: 3,
            etiquette: "câblage"
        )
        XCTAssertTrue(json.contains(#""colonne_id":"explorer""#), json)
        XCTAssertTrue(json.contains(#""debut":"2026-07-22""#), json)
        XCTAssertTrue(json.contains(#""duree_jours":3"#), json)
    }
}