Source code for pytest_databases.docker.spanner

from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING

import pytest
from google.api_core.client_options import ClientOptions
from google.auth.credentials import AnonymousCredentials, Credentials
from google.cloud import spanner

from pytest_databases.helpers import get_xdist_worker_num
from pytest_databases.types import ServiceContainer

if TYPE_CHECKING:
    from collections.abc import Generator

    from pytest_databases._service import DockerService


[docs] @pytest.fixture(scope="session") def spanner_image() -> str: return "gcr.io/cloud-spanner-emulator/emulator:latest"
[docs] @dataclass class SpannerService(ServiceContainer): credentials: Credentials project: str database_name: str instance_name: str @property def endpoint(self) -> str: return f"{self.host}:{self.port}" @property def client_options(self) -> ClientOptions: return ClientOptions(api_endpoint=self.endpoint)
[docs] @pytest.fixture(autouse=False, scope="session") def spanner_service(docker_service: DockerService, spanner_image: str) -> Generator[SpannerService, None, None]: with docker_service.run( image=spanner_image, name=f"pytest_databases_spanner_{get_xdist_worker_num() or 0}", container_port=9010, wait_for_log="gRPC server listening at", transient=True, ) as service: yield SpannerService( host=service.host, port=service.port, credentials=AnonymousCredentials(), project="emulator-test-project", instance_name="emulator-test-instance", database_name="emulator-test-database", )
[docs] @pytest.fixture(autouse=False, scope="session") def spanner_connection( spanner_service: SpannerService, ) -> Generator[spanner.Client, None, None]: client = spanner.Client( project=spanner_service.project, credentials=spanner_service.credentials, client_options=spanner_service.client_options, ) try: yield client finally: client.close()