Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions testcontainers/core/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@


class DockerContainer(object):
def __init__(self, image, **kwargs):
def __init__(self, image, docker_client_kw: dict = None, **kwargs):
self.env = {}
self.ports = {}
self.volumes = {}
self.image = image
self._docker = DockerClient()
self._docker = DockerClient(**(docker_client_kw or {}))
self._container = None
self._command = None
self._name = None
Expand Down
4 changes: 2 additions & 2 deletions testcontainers/core/docker_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@


class DockerClient(object):
def __init__(self):
self.client = docker.from_env()
def __init__(self, **kwargs):
self.client = docker.from_env(**kwargs)

def run(self, image: str,
command: str = None,
Expand Down
4 changes: 2 additions & 2 deletions testcontainers/elasticsearch.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ class ElasticSearchContainer(DockerContainer):
with ElasticSearchContainer() as es:
connection_url = es.get_url()
"""
def __init__(self, image="elasticsearch", port_to_expose=9200):
super(ElasticSearchContainer, self).__init__(image)
def __init__(self, image="elasticsearch", port_to_expose=9200, **kwargs):
super(ElasticSearchContainer, self).__init__(image, **kwargs)
self.port_to_expose = port_to_expose
self.with_exposed_ports(self.port_to_expose)
self.with_env('transport.host', '127.0.0.1')
Expand Down
4 changes: 2 additions & 2 deletions testcontainers/google/pubsub.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ def test_docker_run_pubsub():
topic = publisher.create_topic(topic_path)
"""
def __init__(self, image="google/cloud-sdk:latest",
project="test-project", port=8432):
super(PubSubContainer, self).__init__(image=image)
project="test-project", port=8432, **kwargs):
super(PubSubContainer, self).__init__(image=image, **kwargs)
self.project = project
self.port = port
self.with_exposed_ports(self.port)
Expand Down
4 changes: 2 additions & 2 deletions testcontainers/kafka.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ class KafkaContainer(DockerContainer):
KAFKA_PORT = 9093
TC_START_SCRIPT = '/tc-start.sh'

def __init__(self, image="confluentinc/cp-kafka:5.4.3", port_to_expose=KAFKA_PORT):
super(KafkaContainer, self).__init__(image)
def __init__(self, image="confluentinc/cp-kafka:5.4.3", port_to_expose=KAFKA_PORT, **kwargs):
super(KafkaContainer, self).__init__(image, **kwargs)
self.port_to_expose = port_to_expose
self.with_exposed_ports(self.port_to_expose)
listeners = 'PLAINTEXT://0.0.0.0:{},BROKER://0.0.0.0:9092'.format(port_to_expose)
Expand Down
4 changes: 2 additions & 2 deletions testcontainers/localstack.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ class LocalStackContainer(DockerContainer):
EDGE_PORT = 4566
IMAGE = 'localstack/localstack:0.11.4'

def __init__(self, image=IMAGE):
super(LocalStackContainer, self).__init__(image)
def __init__(self, image=IMAGE, **kwargs):
super(LocalStackContainer, self).__init__(image, **kwargs)
self.with_exposed_ports(LocalStackContainer.EDGE_PORT)

def with_services(self, *services):
Expand Down
4 changes: 2 additions & 2 deletions testcontainers/mongodb.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ class MongoDbContainer(DbContainer):
MONGO_INITDB_ROOT_PASSWORD = os.environ.get("MONGO_INITDB_ROOT_PASSWORD", "test")
MONGO_DB = os.environ.get("MONGO_DB", "test")

def __init__(self, image="mongo:latest"):
super(MongoDbContainer, self).__init__(image=image)
def __init__(self, image="mongo:latest", **kwargs):
super(MongoDbContainer, self).__init__(image=image, **kwargs)
self.command = "mongo"
self.port_to_expose = 27017
self.with_exposed_ports(self.port_to_expose)
Expand Down
4 changes: 2 additions & 2 deletions testcontainers/mssql.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ class SqlServerContainer(DbContainer):
linux-mac/installing-the-microsoft-odbc-driver-for-sql-server>`_.
"""
def __init__(self, image="mcr.microsoft.com/mssql/server:2019-latest", user="SA", password=None,
port=1433, dbname="tempdb", dialect='mssql+pymssql'):
super(SqlServerContainer, self).__init__(image)
port=1433, dbname="tempdb", dialect='mssql+pymssql', **kwargs):
super(SqlServerContainer, self).__init__(image, **kwargs)

self.SQLSERVER_PASSWORD = password or environ.get("SQLSERVER_PASSWORD", "1Secure*Password1")
self.port_to_expose = port
Expand Down
2 changes: 1 addition & 1 deletion testcontainers/neo4j.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class Neo4jContainer(DbContainer):
NEO4J_USER = "neo4j"

def __init__(self, image="neo4j:latest", **kwargs):
super(Neo4jContainer, self).__init__(image)
super(Neo4jContainer, self).__init__(image, **kwargs)
self.bolt_port = Neo4jContainer.DEFAULT_BOLT_PORT
self.with_exposed_ports(self.bolt_port)
self._driver = None
Expand Down
4 changes: 2 additions & 2 deletions testcontainers/nginx.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

class NginxContainer(DockerContainer):
@deprecated(details="Use `DockerContainer` with 'nginx:latest' image and expose port 80.")
def __init__(self, image="nginx:latest", port_to_expose=80):
super(NginxContainer, self).__init__(image)
def __init__(self, image="nginx:latest", port_to_expose=80, **kwargs):
super(NginxContainer, self).__init__(image, **kwargs)
self.port_to_expose = port_to_expose
self.with_exposed_ports(self.port_to_expose)
4 changes: 2 additions & 2 deletions testcontainers/oracle.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ class OracleDbContainer(DbContainer):
e = sqlalchemy.create_engine(oracle.get_connection_url())
result = e.execute("select 1 from dual")
"""
def __init__(self, image="wnameless/oracle-xe-11g-r2:latest"):
super(OracleDbContainer, self).__init__(image=image)
def __init__(self, image="wnameless/oracle-xe-11g-r2:latest", **kwargs):
super(OracleDbContainer, self).__init__(image=image, **kwargs)
self.container_port = 1521
self.with_exposed_ports(self.container_port)
self.with_env("ORACLE_ALLOW_REMOTE", "true")
Expand Down
5 changes: 3 additions & 2 deletions testcontainers/postgres.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,9 @@ def __init__(self,
port=5432, user=None,
password=None,
dbname=None,
driver="psycopg2"):
super(PostgresContainer, self).__init__(image=image)
driver="psycopg2",
**kwargs):
super(PostgresContainer, self).__init__(image=image, **kwargs)
self.POSTGRES_USER = user or self.POSTGRES_USER
self.POSTGRES_PASSWORD = password or self.POSTGRES_PASSWORD
self.POSTGRES_DB = dbname or self.POSTGRES_DB
Expand Down
3 changes: 2 additions & 1 deletion testcontainers/rabbitmq.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ def __init__(
port: Optional[int] = None,
username: Optional[str] = None,
password: Optional[str] = None,
**kwargs,
) -> None:
"""Initialize the RabbitMQ test container.

Expand All @@ -47,7 +48,7 @@ def __init__(
password (str, optional):
Overwrite the default username which is "guest".
"""
super(RabbitMqContainer, self).__init__(image=image)
super(RabbitMqContainer, self).__init__(image=image, **kwargs)
self.RABBITMQ_NODE_PORT = port or int(self.RABBITMQ_NODE_PORT)
self.RABBITMQ_DEFAULT_USER = username or self.RABBITMQ_DEFAULT_USER
self.RABBITMQ_DEFAULT_PASS = password or self.RABBITMQ_DEFAULT_PASS
Expand Down
4 changes: 2 additions & 2 deletions testcontainers/redis.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@


class RedisContainer(DockerContainer):
def __init__(self, image="redis:latest", port_to_expose=6379, password=None):
super(RedisContainer, self).__init__(image)
def __init__(self, image="redis:latest", port_to_expose=6379, password=None, **kwargs):
super(RedisContainer, self).__init__(image, **kwargs)
self.port_to_expose = port_to_expose
self.password = password
self.with_exposed_ports(self.port_to_expose)
Expand Down
4 changes: 2 additions & 2 deletions testcontainers/selenium.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@ class BrowserWebDriverContainer(DockerContainer):

You can easily change browser by passing :code:`DesiredCapabilities.FIREFOX` instead.
"""
def __init__(self, capabilities, image=None):
def __init__(self, capabilities, image=None, **kwargs):
self.capabilities = capabilities
self.image = image or get_image_name(capabilities)
self.port_to_expose = 4444
self.vnc_port_to_expose = 5900
super(BrowserWebDriverContainer, self).__init__(image=self.image)
super(BrowserWebDriverContainer, self).__init__(image=self.image, **kwargs)
self.with_exposed_ports(self.port_to_expose, self.vnc_port_to_expose)

def _configure(self):
Expand Down
26 changes: 26 additions & 0 deletions tests/test_docker_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from unittest.mock import MagicMock, patch
import docker
from testcontainers.core.docker_client import DockerClient
from testcontainers.core.container import DockerContainer


def test_docker_client_from_env():
test_kwargs = dict(
test_kw="test_value"
)
mock_docker = MagicMock(spec=docker)
with patch("testcontainers.core.docker_client.docker", mock_docker):
DockerClient(**test_kwargs)

mock_docker.from_env.assert_called_with(**test_kwargs)


def test_container_docker_client_kw():
test_kwargs = dict(
test_kw="test_value"
)
mock_docker = MagicMock(spec=docker)
with patch("testcontainers.core.docker_client.docker", mock_docker):
DockerContainer(image="", docker_client_kw=test_kwargs)

mock_docker.from_env.assert_called_with(**test_kwargs)