UpdateTacheRequestTest.kt 72 lignes · 2703 octets
package fr.ebii.card2vcf.sync

import kotlinx.serialization.encodeToString
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertTrue

/**
 * Forme du payload d'édition de tâche.
 *
 * Le serveur applique une sémantique partielle : champ **absent** = laisser tel
 * quel, `null` = effacer. Ce test fige les deux conséquences qui comptent —
 * ce que le téléphone envoie, et surtout ce qu'il n'envoie **pas**.
 */
class UpdateTacheRequestTest {

    @Test
    fun nEnvoieJamaisLesChampsQuIlNEditePas() {
        val json = syncJson.encodeToString(
            UpdateTacheRequest(titre = "Câblage", assigneA = "alice"),
        )
        // Ces champs existent côté serveur mais ne sont pas édités sur mobile :
        // les omettre est ce qui les préserve.
        assertFalse(json.contains("sous_taches"), "les sous-tâches seraient écrasées : $json")
        assertFalse(json.contains("depend_de"), "les dépendances seraient écrasées : $json")
        assertFalse(json.contains("parent_id"), "le regroupement serait écrasé : $json")
    }

    @Test
    fun transporteLaPlanificationEditee() {
        val json = syncJson.encodeToString(
            UpdateTacheRequest(
                titre = "Câblage",
                assigneA = "alice",
                debut = "2026-07-22",
                dureeJours = 3,
                etiquette = "câblage",
            ),
        )
        assertTrue(json.contains("\"debut\":\"2026-07-22\""), json)
        assertTrue(json.contains("\"duree_jours\":3"), json)
        assertTrue(json.contains("\"etiquette\":\"câblage\""), json)
        assertTrue(json.contains("\"assigne_a_pose\":true"), json)
    }

    /** Vider un champ dans le dialogue doit effacer la valeur, pas la conserver. */
    @Test
    fun unChampVideEstEnvoyeANullPourEffacer() {
        val json = syncJson.encodeToString(
            UpdateTacheRequest(titre = "Câblage", debut = null, dureeJours = null),
        )
        assertTrue(json.contains("\"debut\":null"), json)
        assertTrue(json.contains("\"duree_jours\":null"), json)
    }

    @Test
    fun laCreationTransporteAussiLaPlanification() {
        val json = syncJson.encodeToString(
            CreateTacheRequest(
                titre = "Câblage",
                colonneId = "cadrer",
                debut = "2026-07-22",
                dureeJours = 2,
                etiquette = "essais",
            ),
        )
        assertTrue(json.contains("\"colonne_id\":\"cadrer\""), json)
        assertTrue(json.contains("\"debut\":\"2026-07-22\""), json)
        assertEquals(true, json.contains("\"duree_jours\":2"), json)
    }
}