|  | 
| 5 | 5 |     TC_FILE, | 
| 6 | 6 |     get_user_overwritten_connection_mode, | 
| 7 | 7 |     ConnectionMode, | 
|  | 8 | +    get_docker_socket, | 
| 8 | 9 | ) | 
| 9 | 10 | 
 | 
| 10 | 11 | from pytest import MonkeyPatch, mark, LogCaptureFixture | 
| 11 | 12 | 
 | 
| 12 | 13 | import logging | 
| 13 | 14 | import tempfile | 
|  | 15 | +from unittest.mock import Mock | 
| 14 | 16 | 
 | 
| 15 | 17 | 
 | 
| 16 | 18 | def test_read_tc_properties(monkeypatch: MonkeyPatch) -> None: | 
| @@ -84,3 +86,61 @@ def test_valid_connection_mode(monkeypatch: pytest.MonkeyPatch, mode: str, use_m | 
| 84 | 86 | def test_no_connection_mode_given(monkeypatch: pytest.MonkeyPatch) -> None: | 
| 85 | 87 |     monkeypatch.delenv("TESTCONTAINERS_CONNECTION_MODE", raising=False) | 
| 86 | 88 |     assert get_user_overwritten_connection_mode() is None | 
|  | 89 | + | 
|  | 90 | + | 
|  | 91 | +def test_get_docker_socket_uses_env(monkeypatch: pytest.MonkeyPatch) -> None: | 
|  | 92 | +    """ | 
|  | 93 | +    If TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE env var is given prefer it | 
|  | 94 | +    """ | 
|  | 95 | +    monkeypatch.setenv("TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE", "/var/test.socket") | 
|  | 96 | +    assert get_docker_socket() == "/var/test.socket" | 
|  | 97 | + | 
|  | 98 | + | 
|  | 99 | +@pytest.fixture | 
|  | 100 | +def mock_docker_client_connections(monkeypatch: pytest.MonkeyPatch) -> None: | 
|  | 101 | +    """ | 
|  | 102 | +    Ensure the docker client does not make any actual network calls | 
|  | 103 | +    """ | 
|  | 104 | +    from docker.transport.sshconn import SSHHTTPAdapter | 
|  | 105 | +    from docker.api.client import APIClient | 
|  | 106 | + | 
|  | 107 | +    # ensure that no actual connection is tried | 
|  | 108 | +    monkeypatch.setattr(SSHHTTPAdapter, "_connect", Mock()) | 
|  | 109 | +    monkeypatch.setattr(SSHHTTPAdapter, "_create_paramiko_client", Mock()) | 
|  | 110 | +    monkeypatch.setattr(APIClient, "_retrieve_server_version", Mock(return_value="1.47")) | 
|  | 111 | + | 
|  | 112 | + | 
|  | 113 | +@pytest.mark.usefixtures("mock_docker_client_connections") | 
|  | 114 | +def test_get_docker_host_default(monkeypatch: pytest.MonkeyPatch) -> None: | 
|  | 115 | +    """ | 
|  | 116 | +    If non socket docker-host is given return default | 
|  | 117 | +
 | 
|  | 118 | +    Still ryuk will properly still not work but this is the historical default | 
|  | 119 | +
 | 
|  | 120 | +    """ | 
|  | 121 | +    monkeypatch.delenv("TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE", raising=False) | 
|  | 122 | +    # Define Fake SSH Docker client | 
|  | 123 | +    monkeypatch.setenv("DOCKER_HOST", "ssh://remote_host") | 
|  | 124 | +    assert get_docker_socket() == "/var/run/docker.sock" | 
|  | 125 | + | 
|  | 126 | + | 
|  | 127 | +@pytest.mark.usefixtures("mock_docker_client_connections") | 
|  | 128 | +def test_get_docker_host_non_root(monkeypatch: pytest.MonkeyPatch) -> None: | 
|  | 129 | +    """ | 
|  | 130 | +    Use the socket determined by the Docker API Adapter | 
|  | 131 | +    """ | 
|  | 132 | +    monkeypatch.delenv("TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE", raising=False) | 
|  | 133 | +    # Define a Non-Root like Docker Client | 
|  | 134 | +    monkeypatch.setenv("DOCKER_HOST", "unix://var/run/user/1000/docker.sock") | 
|  | 135 | +    assert get_docker_socket() == "/var/run/user/1000/docker.sock" | 
|  | 136 | + | 
|  | 137 | + | 
|  | 138 | +@pytest.mark.usefixtures("mock_docker_client_connections") | 
|  | 139 | +def test_get_docker_host_root(monkeypatch: pytest.MonkeyPatch) -> None: | 
|  | 140 | +    """ | 
|  | 141 | +    Use the socket determined by the Docker API Adapter | 
|  | 142 | +    """ | 
|  | 143 | +    monkeypatch.delenv("TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE", raising=False) | 
|  | 144 | +    # Define a Root like Docker Client | 
|  | 145 | +    monkeypatch.setenv("DOCKER_HOST", "unix://") | 
|  | 146 | +    assert get_docker_socket() == "/var/run/docker.sock" | 
0 commit comments