userver: /data/code/userver/testsuite/pytest_plugins/pytest_userver/plugins/sql_coverage.py Source File
Loading...
Searching...
No Matches
sql_coverage.py
1"""
2Plugin 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
8import pytest
9
10from . import coverage
11
12_SQL_COVERAGE_TEST_NAME = 'test_sql_coverage'
13
14
15@pytest.fixture
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}'
31
32 return _on_uncovered
33
34
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:
54 uncovered_callback(self.uncovered_statements)
55
56
57@pytest.fixture(scope='session')
58def 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)
70def 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)
87async 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)
104def pytest_collection_modifyitems(config, items):
105 yield
106 if not items:
107 return
108
109 coverage.collection_modifyitems(_SQL_COVERAGE_TEST_NAME, config, items)