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