88 lines
2.7 KiB
Python
88 lines
2.7 KiB
Python
|
|
"""Tests for macros_store: record/save/cancel/list/delete + control-phrase filter."""
|
||
|
|
|
||
|
|
|
||
|
|
def test_is_macro_control_filters_record_phrases(isolated_state):
|
||
|
|
m = isolated_state('macros_store', ['_PATH'])
|
||
|
|
assert m._is_control("Запиши макрос работа")
|
||
|
|
assert m._is_control("сохрани макрос")
|
||
|
|
assert m._is_control("запусти макрос работа")
|
||
|
|
assert m._is_control("Удали макрос работа")
|
||
|
|
# Regular commands NOT filtered
|
||
|
|
assert not m._is_control("открой браузер")
|
||
|
|
assert not m._is_control("установи громкость 50")
|
||
|
|
|
||
|
|
|
||
|
|
def test_start_save_round_trip(isolated_state):
|
||
|
|
m = isolated_state('macros_store', ['_PATH'])
|
||
|
|
m.start("test")
|
||
|
|
assert m.is_recording()
|
||
|
|
assert m.recording_name() == 'test'
|
||
|
|
|
||
|
|
m.record_step("открой браузер")
|
||
|
|
m.record_step("режим работа")
|
||
|
|
m.record_step("установи громкость 30")
|
||
|
|
# Control phrase should be filtered
|
||
|
|
m.record_step("запиши макрос новый")
|
||
|
|
|
||
|
|
count = m.save()
|
||
|
|
assert count == 3 # 3 + 1 filtered = 3
|
||
|
|
assert not m.is_recording()
|
||
|
|
|
||
|
|
mac = m.get('test')
|
||
|
|
assert mac is not None
|
||
|
|
assert mac['steps'] == [
|
||
|
|
'открой браузер',
|
||
|
|
'режим работа',
|
||
|
|
'установи громкость 30',
|
||
|
|
]
|
||
|
|
|
||
|
|
|
||
|
|
def test_save_without_recording_raises(isolated_state):
|
||
|
|
import pytest
|
||
|
|
m = isolated_state('macros_store', ['_PATH'])
|
||
|
|
with pytest.raises(RuntimeError):
|
||
|
|
m.save()
|
||
|
|
|
||
|
|
|
||
|
|
def test_save_empty_recording_raises(isolated_state):
|
||
|
|
import pytest
|
||
|
|
m = isolated_state('macros_store', ['_PATH'])
|
||
|
|
m.start("empty")
|
||
|
|
with pytest.raises(RuntimeError):
|
||
|
|
m.save()
|
||
|
|
|
||
|
|
|
||
|
|
def test_cancel_aborts_without_saving(isolated_state):
|
||
|
|
m = isolated_state('macros_store', ['_PATH'])
|
||
|
|
m.start("test")
|
||
|
|
m.record_step("foo")
|
||
|
|
assert m.cancel() is True
|
||
|
|
assert not m.is_recording()
|
||
|
|
assert m.get('test') is None
|
||
|
|
|
||
|
|
|
||
|
|
def test_delete(isolated_state):
|
||
|
|
m = isolated_state('macros_store', ['_PATH'])
|
||
|
|
m.start("test")
|
||
|
|
m.record_step("x")
|
||
|
|
m.save()
|
||
|
|
assert m.delete("test") is True
|
||
|
|
assert m.get('test') is None
|
||
|
|
assert m.delete("test") is False # idempotent
|
||
|
|
|
||
|
|
|
||
|
|
def test_list_names_sorted(isolated_state):
|
||
|
|
m = isolated_state('macros_store', ['_PATH'])
|
||
|
|
for name in ('zeta', 'alpha', 'beta'):
|
||
|
|
m.start(name)
|
||
|
|
m.record_step("step")
|
||
|
|
m.save()
|
||
|
|
assert m.list_names() == ['alpha', 'beta', 'zeta']
|
||
|
|
|
||
|
|
|
||
|
|
def test_replay_unknown_raises(isolated_state):
|
||
|
|
import pytest
|
||
|
|
m = isolated_state('macros_store', ['_PATH'])
|
||
|
|
with pytest.raises(KeyError):
|
||
|
|
m.replay("nonexistent", lambda s: None)
|