userver: /home/antonyzhilin/arcadia/taxi/uservices/userver/testsuite/pytest_plugins/pytest_userver/plugins/sql_coverage.py Source File
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
sql_coverage.py
1"""
2Plugin that imports the required fixtures for checking SQL/YQL coverage.
3"""
4
5from typing import Set
6
7import pytest
8
9from . import coverage
10
11_SQL_COVERAGE_TEST_NAME = 'test_sql_coverage'
12
13
14@pytest.fixture
16 """
17 Will be called when the coverage is incomplete.
18 """
19
20 def _on_uncovered(uncovered_statements: Set[str]):
21 msg = f'Uncovered SQL/YQL statements: {uncovered_statements}'
23
24 return _on_uncovered
25
26
28 """
29 Contains data about the current coverage of statements.
30 """
31
32 def __init__(self, files: Set[str]):
33 self.covered_statements: Set[str] = set()
34 self.uncovered_statements: Set[str] = files
35 self.extra_covered_statements: Set[str] = set()
36
37 def cover(self, statement: str) -> None:
38 if statement in self.uncovered_statements:
39 self.covered_statements.add(statement)
40 self.uncovered_statements.remove(statement)
41 elif statement not in self.covered_statements:
42 self.extra_covered_statements.add(statement)
43
44 def validate(self, uncovered_callback: callable) -> None:
46 uncovered_callback(self.uncovered_statements)
47
48
49@pytest.fixture(scope='session')
50def sql_coverage(sql_files):
51 return Coverage(set(sql_files))
52
53
54@pytest.fixture(scope='function', autouse=True)
55async def sql_statement_hook(testpoint, sql_coverage):
56 """
57 Hook that accepts requests from the testpoint.
58 """
59
60 @testpoint('sql_statement')
61 def _hook(request):
62 sql_coverage.cover(request['name'])
63
64 yield _hook
65
66
67@pytest.fixture(scope='function', autouse=True)
68async def yql_statement_hook(testpoint, sql_coverage):
69 """
70 Hook that accepts requests from the testpoint.
71 """
72
73 @testpoint('yql_statement')
74 def _hook(request):
75 sql_coverage.cover(request['name'])
76
77 yield _hook
78
79
80@pytest.hookimpl(hookwrapper=True)
81def pytest_collection_modifyitems(config, items):
82 yield
83 if not items:
84 return
85
86 coverage.collection_modifyitems(_SQL_COVERAGE_TEST_NAME, config, items)