userver
C++ Async Framework
Loading...
Searching...
No Matches
sql_coverage.py
1
"""
2
Plugin that imports the required fixtures for checking SQL/YQL coverage. See
3
@ref sql_coverage_test_info "SQL coverage tests" for more info.
4
5
@ingroup userver_testsuite_fixtures
6
"""
7
8
import
pytest
9
10
from
.
import
coverage
11
12
_SQL_COVERAGE_TEST_NAME =
'test_sql_coverage'
13
14
15
@pytest.fixture
16
def
on_uncovered
():
17
"""
18
Called when the coverage is incomplete.
19
20
Override this fixture to change the way uncovered statements are reported or to ignore some of the statements
21
from coverage report.
22
23
See @ref sql_coverage_test_info "SQL coverage tests" for more info.
24
25
@ingroup userver_testsuite_fixtures
26
"""
27
28
def
_on_uncovered(uncovered_statements: set[str]):
29
msg = f
'Uncovered SQL/YQL statements: {uncovered_statements}'
30
raise
coverage.UncoveredError
(msg)
31
32
return
_on_uncovered
33
34
35
class
Coverage
:
36
"""
37
Contains data about the current coverage of statements.
38
"""
39
40
def
__init__(self, files: set[str]):
41
self.
covered_statements
: set[str] = set()
42
self.
uncovered_statements
: set[str] = files
43
self.
extra_covered_statements
: set[str] = set()
44
45
def
cover(self, statement: str) ->
None
:
46
if
statement
in
self.
uncovered_statements
:
47
self.
covered_statements
.add(statement)
48
self.
uncovered_statements
.remove(statement)
49
elif
statement
not
in
self.
covered_statements
:
50
self.
extra_covered_statements
.add(statement)
51
52
def
validate(self, uncovered_callback: callable) ->
None
:
53
if
self.
uncovered_statements
:
54
uncovered_callback(self.
uncovered_statements
)
55
56
57
@pytest.fixture(scope='session')
58
def
sql_coverage(sql_files) -> Coverage:
59
"""
60
Returns data about the current coverage of statements.
61
62
See @ref sql_coverage_test_info "SQL coverage tests" for more info.
63
64
@ingroup userver_testsuite_fixtures
65
"""
66
return
Coverage
(set(sql_files))
67
68
69
@pytest.fixture(autouse=True)
70
def
sql_statement_hook
(testpoint, sql_coverage):
71
"""
72
Hook that accepts requests from the testpoint with information on PostgreSQL statements coverage.
73
74
See @ref sql_coverage_test_info "SQL coverage tests" for more info.
75
76
@ingroup userver_testsuite_fixtures
77
"""
78
79
@testpoint('sql_statement')
80
def
_hook(request):
81
sql_coverage.cover(request[
'name'
])
82
83
return
_hook
84
85
86
@pytest.fixture(autouse=True)
87
async def
yql_statement_hook
(testpoint, sql_coverage):
88
"""
89
Hook that accepts requests from the testpoint with information on YDB statements coverage.
90
91
See @ref sql_coverage_test_info "SQL coverage tests" for more info.
92
93
@ingroup userver_testsuite_fixtures
94
"""
95
96
@testpoint('yql_statement')
97
def
_hook(request):
98
sql_coverage.cover(request[
'name'
])
99
100
return
_hook
101
102
103
@pytest.hookimpl(hookwrapper=True)
104
def
pytest_collection_modifyitems(config, items):
105
yield
106
if
not
items:
107
return
108
109
coverage.collection_modifyitems(_SQL_COVERAGE_TEST_NAME, config, items)
testsuite
pytest_plugins
pytest_userver
plugins
sql_coverage.py
Generated on Fri Dec 5 2025 12:23:37 for userver by
Doxygen
1.13.2