fix(settings): dispatch name display updates on original loop

This commit is contained in:
pixelpaws
2025-10-16 09:02:35 +08:00
parent 3c0feb23ba
commit 00fade756c
3 changed files with 72 additions and 12 deletions

View File

@@ -1,4 +1,6 @@
import asyncio
import copy
import threading
import json
import os
@@ -110,15 +112,30 @@ def test_model_name_display_setting_notifies_scanners(tmp_path, monkeypatch):
manager = _create_manager_with_settings(tmp_path, monkeypatch, initial)
loop = asyncio.new_event_loop()
thread = threading.Thread(target=loop.run_forever, daemon=True)
thread.start()
class DummyScanner:
def __init__(self):
self.calls = []
self.loop = loop
async def on_model_name_display_changed(self, mode: str) -> None:
self.calls.append(mode)
dummy_scanner = DummyScanner()
dispatched_loops = []
futures = []
original_run_coroutine_threadsafe = asyncio.run_coroutine_threadsafe
def tracking_run_coroutine_threadsafe(coro, target_loop):
dispatched_loops.append(target_loop)
future = original_run_coroutine_threadsafe(coro, target_loop)
futures.append(future)
return future
def fake_get_service_sync(cls, name):
return dummy_scanner if name == "lora_scanner" else None
@@ -127,10 +144,20 @@ def test_model_name_display_setting_notifies_scanners(tmp_path, monkeypatch):
"get_service_sync",
classmethod(fake_get_service_sync),
)
monkeypatch.setattr(asyncio, "run_coroutine_threadsafe", tracking_run_coroutine_threadsafe)
manager.set("model_name_display", "file_name")
try:
manager.set("model_name_display", "file_name")
assert dummy_scanner.calls == ["file_name"]
for future in futures:
future.result(timeout=1)
assert dummy_scanner.calls == ["file_name"]
assert dispatched_loops == [dummy_scanner.loop]
finally:
loop.call_soon_threadsafe(loop.stop)
thread.join(timeout=1)
loop.close()
def test_migrates_legacy_settings_file(tmp_path, monkeypatch):