LwwMergerTest.kt 119 lignes · 3000 octets
package fr.ebii.card2vcf.sync

import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test

class LwwMergerTest {
    @Test
    fun pickLww_remoteNewerWins() {
        val result = LwwMerger.pickLww(
            local = "local-value",
            localTs = 100L,
            remote = "remote-value",
            remoteTs = 200L,
        )
        assertEquals("remote-value", result)
    }

    @Test
    fun pickLww_localNewerWins() {
        val result = LwwMerger.pickLww(
            local = "local-value",
            localTs = 300L,
            remote = "remote-value",
            remoteTs = 200L,
        )
        assertEquals("local-value", result)
    }

    @Test
    fun pickLww_equalTimestampsRemoteWins() {
        val result = LwwMerger.pickLww(
            local = "local-value",
            localTs = 100L,
            remote = "remote-value",
            remoteTs = 100L,
        )
        assertEquals("remote-value", result)
    }

    @Test
    fun pickTaskMove_remoteNewerWins() {
        val local = LwwMerger.TaskPlacement(
            colonneId = "todo",
            ordre = 1,
            updatedAt = 100L,
        )
        val remote = LwwMerger.TaskPlacement(
            colonneId = "done",
            ordre = 2,
            updatedAt = 200L,
        )

        val result = LwwMerger.pickTaskMove(local, remote)

        assertEquals(remote, result)
    }

    @Test
    fun pickTaskMove_localNewerWins() {
        val local = LwwMerger.TaskPlacement(
            colonneId = "todo",
            ordre = 1,
            updatedAt = 300L,
        )
        val remote = LwwMerger.TaskPlacement(
            colonneId = "done",
            ordre = 2,
            updatedAt = 200L,
        )

        val result = LwwMerger.pickTaskMove(local, remote)

        assertEquals(local, result)
    }

    @Test
    fun pickTaskMove_equalTimestampsRemoteWins() {
        val local = LwwMerger.TaskPlacement(
            colonneId = "todo",
            ordre = 1,
            updatedAt = 100L,
        )
        val remote = LwwMerger.TaskPlacement(
            colonneId = "done",
            ordre = 2,
            updatedAt = 100L,
        )

        val result = LwwMerger.pickTaskMove(local, remote)

        assertEquals(remote, result)
    }

    @Test
    fun shouldInsertInteraction_whenUnknownServerId() {
        val existing = setOf("srv-1", "srv-2")

        assertTrue(LwwMerger.shouldInsertInteraction(existing, "srv-3"))
    }

    @Test
    fun shouldInsertInteraction_whenKnownServerId() {
        val existing = setOf("srv-1", "srv-2")

        assertFalse(LwwMerger.shouldInsertInteraction(existing, "srv-1"))
    }

    @Test
    fun applyTombstoneIds_removesMatchingIds() {
        val local = setOf("a", "b", "c")
        val tombstones = setOf("b", "d")

        val remaining = LwwMerger.applyTombstoneIds(local, tombstones)

        assertEquals(setOf("a", "c"), remaining)
    }
}