ServerUrlPolicyTest.kt 74 lignes · 2589 octets
package fr.ebii.card2vcf.sync

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

/** TDD : HTTPS obligatoire sauf option « autoriser HTTP clair ». */
class ServerUrlPolicyTest {

    @Test
    fun https_url_is_allowed_by_default() {
        assertNull(ServerUrlPolicy.validate("https://api.example.com", allowCleartext = false))
        assertNull(ServerUrlPolicy.validate("HTTPS://API.EXAMPLE.COM/v1", allowCleartext = false))
    }

    @Test
    fun http_url_rejected_when_cleartext_disallowed() {
        val err = ServerUrlPolicy.validate("http://192.168.1.10:3000", allowCleartext = false)
        assertEquals(ServerUrlPolicy.ERROR_HTTPS_REQUIRED, err)
    }

    @Test
    fun http_url_allowed_when_cleartext_enabled() {
        assertNull(ServerUrlPolicy.validate("http://192.168.1.10:3000", allowCleartext = true))
        assertNull(ServerUrlPolicy.validate("http://localhost:3000", allowCleartext = true))
    }

    @Test
    fun blank_or_missing_scheme_rejected() {
        assertEquals(ServerUrlPolicy.ERROR_INVALID_URL, ServerUrlPolicy.validate(" ", allowCleartext = true))
        assertEquals(
            ServerUrlPolicy.ERROR_INVALID_URL,
            ServerUrlPolicy.validate("api.example.com", allowCleartext = false),
        )
        assertEquals(
            ServerUrlPolicy.ERROR_INVALID_URL,
            ServerUrlPolicy.validate("ftp://api.example.com", allowCleartext = true),
        )
    }

    @Test
    fun isHttps_helper() {
        assertTrue(ServerUrlPolicy.isHttps("https://x"))
        assertFalse(ServerUrlPolicy.isHttps("http://x"))
        assertFalse(ServerUrlPolicy.isHttps("x"))
    }

    @Test
    fun lan_https_without_port_rejected() {
        val err = ServerUrlPolicy.validate("https://192.168.1.35", allowCleartext = false)
        assertEquals(ServerUrlPolicy.ERROR_LAN_HTTPS_NO_PORT, err)
    }

    @Test
    fun lan_http_without_port_rejected_even_when_cleartext() {
        val err = ServerUrlPolicy.validate("http://192.168.1.35", allowCleartext = true)
        assertEquals(ServerUrlPolicy.ERROR_LAN_HTTP_NO_PORT, err)
    }

    @Test
    fun normalizeBaseUrl_strips_version_path() {
        assertEquals(
            "http://192.168.1.35:3000",
            ServerUrlPolicy.normalizeBaseUrl("http://192.168.1.35:3000/version/"),
        )
    }

    @Test
    fun public_https_without_port_still_allowed() {
        assertNull(ServerUrlPolicy.validate("https://api.example.com", allowCleartext = false))
    }
}