from urllib.parse import urlunsplit

import pytest
from tests.support.classic.asserts import assert_error

from . import navigate_to


@pytest.fixture
def http_with_https_port_url(server_config):
    """
    Creates an HTTP URL with a port for HTTPS that would trigger a HTTPS-First
    upgrade when entered in the url bar.
    """

    def _http_with_https_port_url(path, query="", fragment=""):
        domain = server_config["domains"][""][""]
        port = server_config["ports"]["https"][0]
        return urlunsplit(("http", f"{domain}:{port}", path, query, fragment))

    return _http_with_https_port_url


@pytest.mark.capabilities({
    "pageLoadStrategy": "eager",
    "moz:firefoxOptions": {
        "prefs": {
            # Allow HTTPS upgrades for localhost and custom ports
            "dom.security.https_first_for_custom_ports": True,
            "dom.security.https_first_for_local_addresses": True,
            "dom.security.https_first_for_unknown_suffixes": True,
        },
    },
})
def test_no_https_first_upgrade(session, http_with_https_port_url):
    page = http_with_https_port_url("/webdriver/tests/support/html/default.html")

    # A navigation via the WebDriver API should not cause an HTTPS upgrade,
    # so it fails with a neterror page.
    response = navigate_to(session, page)
    assert_error(response, "unknown error")

    assert session.url.startswith("http://")
