# SPDX-License-Identifier: MIT
# Original by: Marco Dallagiacoma @ 2023 in https://github.com/dallagi/excontainers
# Modified by: Jarl André Hübenthal @ 2023
defmodule Testcontainers.Container.PostgresContainer do
@moduledoc """
Functions to build and interact with PostgreSql containers.
"""
alias Testcontainers.Container
alias Testcontainers.WaitStrategy.CommandWaitStrategy
@postgres_port 5432
@doc """
Builds a PostgreSql container.
Uses PostgreSql 13.1 by default, but a custom image can also be set.
## Options
- `username` sets the username for the user
- `password` sets the password for the user
- `database` sets the name of the database
"""
def new(image \\ "postgres:13.1", opts \\ []) do
username = Keyword.get(opts, :username, "test")
database = Keyword.get(opts, :database, "test")
password = Keyword.get(opts, :password, "test")
Container.new(
image,
exposed_ports: [@postgres_port],
environment: %{
POSTGRES_USER: username,
POSTGRES_PASSWORD: password,
POSTGRES_DB: database
}
)
|> Container.with_waiting_strategy(wait_strategy(username, database))
end
@doc """
Returns the port on the _host machine_ where the MySql container is listening.
"""
def port(%Container{} = container), do: Container.mapped_port(container, @postgres_port)
@doc """
Returns the connection parameters to connect to the database from the _host machine_.
"""
def connection_parameters(%Container{} = container) do
[
hostname: "localhost",
port: port(container),
username: container.environment[:POSTGRES_USER],
password: container.environment[:POSTGRES_PASSWORD],
database: container.environment[:POSTGRES_DB]
]
end
defp wait_strategy(username, database) do
CommandWaitStrategy.new(
["sh", "-c", "pg_isready -U #{username} -d #{database} -h localhost"],
10000
)
end
end