feat: add Win32 inserter backend with clipboard + Ctrl+V

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Vitali Graf
2026-04-08 10:36:38 +02:00
parent b47045ab9b
commit fc96e9a10c
2 changed files with 103 additions and 0 deletions
+42
View File
@@ -60,3 +60,45 @@ class TestWaylandInserter:
await inserter.insert("Test")
assert call_count == 4
class TestWin32Inserter:
@pytest.mark.asyncio
@patch("whisper_local.inserter._win32.keyboard_controller")
@patch("whisper_local.inserter._win32.Win32Inserter._get_clipboard", return_value="alter clipboard")
@patch("whisper_local.inserter._win32.Win32Inserter._set_clipboard")
async def test_insert_text(self, mock_set, mock_get, mock_kb):
from whisper_local.inserter._win32 import Win32Inserter
inserter = Win32Inserter()
await inserter.insert("Hallo Welt")
# Clipboard wurde gesichert
mock_get.assert_called_once()
# Text wurde in Clipboard gesetzt, dann Ctrl+V, dann Restore
assert mock_set.call_count == 2
mock_set.assert_any_call("Hallo Welt")
mock_set.assert_any_call("alter clipboard")
@pytest.mark.asyncio
async def test_insert_empty_does_nothing(self):
from whisper_local.inserter._win32 import Win32Inserter
inserter = Win32Inserter()
await inserter.insert("")
@pytest.mark.asyncio
@patch("whisper_local.inserter._win32.keyboard_controller")
@patch("whisper_local.inserter._win32.Win32Inserter._get_clipboard", return_value="original")
@patch("whisper_local.inserter._win32.Win32Inserter._set_clipboard")
async def test_clipboard_restored_on_error(self, mock_set, mock_get, mock_kb):
from whisper_local.inserter._win32 import Win32Inserter
mock_kb.press.side_effect = OSError("keyboard error")
inserter = Win32Inserter()
with pytest.raises(OSError):
await inserter.insert("Test")
# Clipboard muss trotzdem wiederhergestellt werden
mock_set.assert_called_with("original")