-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathconftest.py
69 lines (54 loc) · 2.13 KB
/
conftest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import re
from typing import Any, Iterator, Optional
import pytest
import cli_ui
class MessageRecorder:
"""Helper class to tests emitted messages"""
def __init__(self) -> None:
cli_ui._MESSAGES = []
self.idx_find_next: int = 0
def start(self) -> None:
"""Start recording messages"""
cli_ui.CONFIG["record"] = True
def stop(self) -> None:
"""Stop recording messages"""
cli_ui.CONFIG["record"] = False
cli_ui._MESSAGES = []
def reset(self) -> None:
"""Reset the list"""
cli_ui._MESSAGES = []
def find(self, pattern: str) -> Optional[str]:
"""Find a message in the list of recorded message
:param pattern: regular expression pattern to use
when looking for recorded message
"""
regexp = re.compile(pattern)
for idx, message in enumerate(cli_ui._MESSAGES):
if re.search(regexp, message):
if isinstance(message, str):
self.idx_find_next = idx + 1
return message
return None
def find_right_after(self, pattern: str) -> Optional[str]:
"""Same as 'find', but only check the message that is right after
the one found last time. if no message was found before, the 1st
message in buffer is checked
:param pattern: regular expression pattern to use
when looking for recorded message
This is particulary usefull when we want to match only consecutive message.
Calling this function can be repeated for further consecutive message match.
"""
if len(cli_ui._MESSAGES) > self.idx_find_next:
regexp = re.compile(pattern)
message = cli_ui._MESSAGES[self.idx_find_next]
if re.search(regexp, message):
if isinstance(message, str):
self.idx_find_next += 1
return message
return None
@pytest.fixture
def message_recorder(request: Any) -> Iterator[MessageRecorder]:
recorder = MessageRecorder()
recorder.start()
yield recorder
recorder.stop()