"""Synthetic key-state checks; never reads a keyboard or records audio.""" from unittest.mock import Mock, patch import push_to_talk as ptt down = [ptt.key.KEY_LEFTMETA, ptt.key.KEY_D] def check(states, expected, error=None): device = Mock() device.active_keys.side_effect = states device.read_loop.return_value = iter([object(), object()]) if error: device.read_loop.side_effect = error with ( patch.object(ptt, "list_devices", return_value=["keyboard"]), patch.object(ptt, "InputDevice", return_value=device), patch.object(ptt.signal, "signal"), patch.object(ptt.subprocess, "run") as run, ): try: ptt.main("handy") except (OSError, KeyboardInterrupt): assert error is not None assert [call.args[0][1] for call in run.call_args_list] == expected device.close.assert_called_once() check([[]], []) # Released before the listener starts: do not record. check([down, []], ["--toggle-transcription", "--toggle-transcription"]) check([down, down, down, [ptt.key.KEY_D]], ["--toggle-transcription"] * 2) check([down, down], ["--toggle-transcription", "--cancel"], OSError("unplugged")) check([down, down], ["--toggle-transcription", "--cancel"], KeyboardInterrupt()) assert ptt.held([ptt.key.KEY_RIGHTMETA, ptt.key.KEY_D]) assert not ptt.held([ptt.key.KEY_LEFTMETA]) print("Push-to-talk release, repeat, disconnect and cancellation checks passed")