mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-07-30 06:32:04 +08:00
110 lines
3.6 KiB
Python
110 lines
3.6 KiB
Python
import dataclasses
|
|
|
|
import psycopg2
|
|
import pytest
|
|
from testcontainers.core.container import Network
|
|
from testcontainers.postgres import PostgresContainer
|
|
|
|
from fixtures import types
|
|
|
|
|
|
@pytest.fixture(name="postgres", scope="package")
|
|
def postgres(
|
|
network: Network, request: pytest.FixtureRequest, pytestconfig: pytest.Config
|
|
) -> types.TestContainerSQL:
|
|
"""
|
|
Package-scoped fixture for PostgreSQL TestContainer.
|
|
"""
|
|
dev = request.config.getoption("--dev")
|
|
if dev:
|
|
container = pytestconfig.cache.get("postgres.container", None)
|
|
env = pytestconfig.cache.get("postgres.env", None)
|
|
|
|
if container and env:
|
|
assert isinstance(container, dict)
|
|
assert isinstance(env, dict)
|
|
|
|
test_container = types.TestContainerDocker(
|
|
host_config=types.TestContainerUrlConfig(
|
|
container["host_config"]["scheme"],
|
|
container["host_config"]["address"],
|
|
container["host_config"]["port"],
|
|
),
|
|
container_config=types.TestContainerUrlConfig(
|
|
container["container_config"]["scheme"],
|
|
container["container_config"]["address"],
|
|
container["container_config"]["port"],
|
|
),
|
|
)
|
|
|
|
return types.TestContainerSQL(
|
|
container=test_container,
|
|
conn=psycopg2.connect(
|
|
dbname=env["SIGNOZ_SQLSTORE_POSTGRES_DBNAME"],
|
|
user=env["SIGNOZ_SQLSTORE_POSTGRES_USER"],
|
|
password=env["SIGNOZ_SQLSTORE_POSTGRES_PASSWORD"],
|
|
host=test_container.host_config.address,
|
|
port=test_container.host_config.port,
|
|
),
|
|
env=env,
|
|
)
|
|
|
|
version = request.config.getoption("--postgres-version")
|
|
|
|
container = PostgresContainer(
|
|
image=f"postgres:{version}",
|
|
port=5432,
|
|
username="signoz",
|
|
password="password",
|
|
dbname="signoz",
|
|
driver="psycopg2",
|
|
network=network.id,
|
|
)
|
|
container.start()
|
|
|
|
connection = psycopg2.connect(
|
|
dbname=container.dbname,
|
|
user=container.username,
|
|
password=container.password,
|
|
host=container.get_container_host_ip(),
|
|
port=container.get_exposed_port(5432),
|
|
)
|
|
|
|
def stop():
|
|
if dev:
|
|
return
|
|
|
|
connection.close()
|
|
container.stop(delete_volume=True)
|
|
|
|
request.addfinalizer(stop)
|
|
|
|
cached_postgres = types.TestContainerSQL(
|
|
container=types.TestContainerDocker(
|
|
host_config=types.TestContainerUrlConfig(
|
|
"postgresql",
|
|
container.get_container_host_ip(),
|
|
container.get_exposed_port(5432),
|
|
),
|
|
container_config=types.TestContainerUrlConfig(
|
|
"postgresql", container.get_wrapped_container().name, 5432
|
|
),
|
|
),
|
|
conn=connection,
|
|
env={
|
|
"SIGNOZ_SQLSTORE_PROVIDER": "postgres",
|
|
"SIGNOZ_SQLSTORE_POSTGRES_DSN": f"postgresql://{container.username}:{container.password}@{container.get_wrapped_container().name}:{5432}/{container.dbname}", # pylint: disable=line-too-long
|
|
"SIGNOZ_SQLSTORE_POSTGRES_DBNAME": container.dbname,
|
|
"SIGNOZ_SQLSTORE_POSTGRES_USER": container.username,
|
|
"SIGNOZ_SQLSTORE_POSTGRES_PASSWORD": container.password,
|
|
},
|
|
)
|
|
|
|
if dev:
|
|
pytestconfig.cache.set(
|
|
"postgres.container", dataclasses.asdict(cached_postgres.container)
|
|
)
|
|
pytestconfig.cache.set("postgres.env", cached_postgres.env)
|
|
|
|
return cached_postgres
|