3import clickhouse_driver
6from .
import classes, control, service, utils
9def pytest_addoption(parser):
10 group = parser.getgroup(
'clickhouse')
11 group.addoption(
'--clickhouse')
14 help=
'Disable use of ClickHouse',
19def pytest_configure(config):
20 config.addinivalue_line(
22 'clickhouse: per-test ClickHouse initialization',
26def pytest_service_register(register_service):
27 register_service(
'clickhouse', service.create_clickhouse_service)
34) -> dict[str, clickhouse_driver.Client]:
35 return _clickhouse.get_connections()
39def _clickhouse(clickhouse_local, _clickhouse_service, _clickhouse_state):
40 if not _clickhouse_service:
42 dbcontrol = control.Control(clickhouse_local, _clickhouse_state)
43 dbcontrol.run_migrations()
51 _clickhouse_query_loader,
54 def load_default_queries(dbname):
56 *_clickhouse_query_loader.load(
58 'clickhouse.default_queries',
61 *_clickhouse_query_loader.loaddir(
63 'clickhouse.default_queries',
68 def clickhouse_mark(dbname, *, files=(), directories=(), queries=()):
71 result_queries += _clickhouse_query_loader.load(
72 path,
'mark.clickhouse.files'
74 for path
in directories:
75 result_queries += _clickhouse_query_loader.loaddir(
76 path,
'mark.clickhouse.directories'
79 result_queries.append(
80 control.ClickhouseQuery(
82 source=
'mark.clickhouse.queries',
87 return dbname, result_queries
89 overrides = collections.defaultdict(list)
90 for mark
in request.node.iter_markers(
'clickhouse'):
91 dbname, queries = clickhouse_mark(*mark.args, **mark.kwargs)
92 if dbname
not in clickhouse_local:
93 raise RuntimeError(f
'Unknown clickhouse database {dbname}')
94 overrides[dbname].extend(queries)
96 for alias, dbconfig
in clickhouse_local.items():
97 if alias
in overrides:
98 queries = overrides[alias]
100 queries = load_default_queries(alias)
101 control.apply_queries(
102 _clickhouse_state.get_connection(dbconfig.dbname),
108def _clickhouse_query_loader(get_file_path, get_directory_path):
109 def load_query(path, source):
110 return control.ClickhouseQuery(
111 body=path.read_text(),
118 def load(path, source, missing_ok=False):
119 data = get_file_path(path, missing_ok=missing_ok)
122 return [load_query(data, source)]
125 def loaddir(directory, source, missing_ok=False):
127 directory = get_directory_path(directory, missing_ok=missing_ok)
130 for path
in utils.scan_sql_directory(directory):
131 result.append(load_query(path, source))
137@pytest.fixture(scope='session')
138def clickhouse_disabled(pytestconfig) -> bool:
139 return pytestconfig.option.no_clickhouse
142@pytest.fixture(scope='session')
143def clickhouse_local() -> classes.DatabasesDict:
144 """Use to override databases configuration.
146 @ingroup userver_testsuite_fixtures
147 Part of the [yandex-taxi-testsuite](https://github.com/yandex/yandex-taxi-testsuite/blob/develop/testsuite/databases/clickhouse/pytest_plugin.py#L143)
152@pytest.fixture(scope='session')
153def _clickhouse_service_settings() -> service.ServiceSettings:
154 return service.get_service_settings()
157@pytest.fixture(scope='session')
158def clickhouse_conn_info(_clickhouse_service_settings):
159 return _clickhouse_service_settings.get_connection_info()
163def _clickhouse_service(
164 ensure_service_started,
168 _clickhouse_service_settings,
170 if not clickhouse_local
or clickhouse_disabled:
172 if not pytestconfig.option.clickhouse:
173 ensure_service_started(
175 settings=_clickhouse_service_settings,
180@pytest.fixture(scope='session')
181def _clickhouse_state(pytestconfig, clickhouse_conn_info):
182 return control.DatabasesState(
183 connections=control.ConnectionCache(clickhouse_conn_info),
184 verbose=pytestconfig.option.verbose,