Packages
testcontainers
2.4.0
2.4.0
2.3.1
2.3.0
2.2.0
2.1.0
2.1.0-rc1
2.0.0
2.0.0-rc3
2.0.0-rc2
2.0.0-rc
1.14.1
1.14.0
1.13.5
1.13.4
1.13.3
1.13.2
1.13.1
1.13.0
1.12.0
1.11.8
1.11.7
1.11.6
1.11.5
1.11.4
1.11.3
1.11.2
1.11.1
1.11.0
1.10.5
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.0
1.8.4
1.8.3
1.8.2
1.8.1
1.8.0
1.7.0
1.6.0
1.5.1
1.5.0
1.4.2
1.4.1
1.4.0
1.3.1
1.3.0
1.2.11
1.2.10
1.2.9
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.3
1.1.2
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-beta.1
1.0.0-beta
0.9.3
0.9.2
0.9.1
0.9.0
Testcontainers is an Elixir library that supports ExUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.
Current section
Files
Jump to
Current section
Files
lib/container/ministack_container.ex
defmodule Testcontainers.MinistackContainer do
@moduledoc """
Provides functionality for creating and managing Ministack container configurations.
"""
alias Testcontainers.Container
alias Testcontainers.ContainerBuilder
alias Testcontainers.LogWaitStrategy
alias Testcontainers.MinistackContainer
@default_image "ministackorg/ministack"
@default_tag "1.3.42"
@default_image_with_tag "#{@default_image}:#{@default_tag}"
@default_username "111111111111"
@default_password "anything"
@default_s3_port 4566
@default_ui_port 2222
@default_wait_timeout 60_000
@type t :: %__MODULE__{}
@enforce_keys [:image, :username, :password, :wait_timeout]
defstruct [
:image,
:username,
:password,
:wait_timeout,
reuse: false
]
def new,
do: %__MODULE__{
image: @default_image_with_tag,
username: @default_username,
password: @default_password,
wait_timeout: @default_wait_timeout
}
@doc """
Set the reuse flag to reuse the container if it is already running.
"""
def with_reuse(%__MODULE__{} = config, reuse) when is_boolean(reuse) do
%__MODULE__{config | reuse: reuse}
end
def get_username, do: @default_username
def get_password, do: @default_password
def default_ui_port, do: @default_ui_port
def default_s3_port, do: @default_s3_port
@doc """
Retrieves the port mapped by the Docker host for the Ministack container.
"""
def port(%Container{} = container), do: Testcontainers.get_port(container, @default_s3_port)
@doc """
Generates the connection URL for accessing the Ministack service running within the container.
"""
def connection_url(%Container{} = container) do
"http://#{Testcontainers.get_host(container)}:#{port(container)}"
end
@doc """
Generates the connection options for accessing the Ministack service running within the container.
Compatible with what ex_aws expects in `ExAws.request(options)`
"""
def connection_opts(%Container{} = container) do
[
port: MinistackContainer.port(container),
scheme: "http://",
host: Testcontainers.get_host(container),
access_key_id: container.environment[:AWS_ACCESS_KEY_ID],
secret_access_key: container.environment[:AWS_SECRET_ACCESS_KEY]
]
end
defimpl ContainerBuilder do
import Container
@spec build(MinistackContainer.t()) :: Container.t()
@impl true
def build(%MinistackContainer{} = config) do
new(config.image)
|> with_exposed_ports([
MinistackContainer.default_s3_port(),
MinistackContainer.default_ui_port()
])
|> with_environment(:AWS_ACCESS_KEY_ID, config.username)
|> with_environment(:AWS_SECRET_ACCESS_KEY, config.password)
|> with_reuse(config.reuse)
|> with_waiting_strategy(
LogWaitStrategy.new(
~r/.*Ready .* services available on port #{MinistackContainer.default_s3_port()}\./,
config.wait_timeout,
1000
)
)
end
@impl true
def after_start(_config, _container, _conn), do: :ok
end
end