mirror of
https://github.com/TommyFang2077/dsh-desktop.git
synced 2026-08-17 09:06:36 +08:00
Empty text/plain used to preventDefault before native clipboard read, which discarded HTML-only paste if no image was recovered. Co-authored-by: Cursor <cursoragent@cursor.com>
90 lines
4.2 KiB
Python
90 lines
4.2 KiB
Python
"""Sanity checks for the bundled dsh WebUI plugin (no desktop runtime)."""
|
|
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
class VisionPluginFilesTests(unittest.TestCase):
|
|
def test_client_registers_system_settings_slots(self):
|
|
client = (ROOT / "plugins" / "dsh-desktop-vision" / "client.js").read_text(
|
|
encoding="utf-8"
|
|
)
|
|
self.assertIn("settings.section", client)
|
|
self.assertNotIn("settings.plugins.tab", client)
|
|
self.assertIn("modlens-vision", client)
|
|
host = (ROOT / "plugins" / "dsh-desktop-vision" / "index.js").read_text(
|
|
encoding="utf-8"
|
|
)
|
|
self.assertIn("/dsh-desktop/modlens", host)
|
|
self.assertIn("'OpenAI 兼容'", host)
|
|
self.assertNotIn("Qwen / 自建网关", host)
|
|
self.assertIn("https://api.openai.com/v1", host)
|
|
self.assertIn("https://generativelanguage.googleapis.com", host)
|
|
self.assertIn("https://api.anthropic.com", host)
|
|
self.assertIn("https://platform.openai.com/api-keys", host)
|
|
self.assertIn("https://aistudio.google.com/apikey", host)
|
|
self.assertIn("https://console.anthropic.com/settings/keys", host)
|
|
self.assertIn("获取 API", client)
|
|
self.assertNotIn("qwen-agent", client)
|
|
self.assertIn("example: 'gpt-4o'", host)
|
|
self.assertIn("example: 'gemini-3.6-flash'", host)
|
|
self.assertIn("example: 'claude-haiku-4-5-20251001'", host)
|
|
self.assertIn("example: 'gemini-3.6-flash-low'", host)
|
|
self.assertIn("example: 'haiku'", host)
|
|
|
|
|
|
class ClipboardIngestTests(unittest.TestCase):
|
|
def test_inject_delivers_images_as_paste_not_only_drop(self):
|
|
ingest = (ROOT / "ui" / "inject" / "ingest.js").read_text(encoding="utf-8")
|
|
chrome = (ROOT / "ui" / "inject" / "chrome.js").read_text(encoding="utf-8")
|
|
self.assertIn("window.__dshDesktopIngestFiles", ingest)
|
|
self.assertIn("/modlens/paste", ingest)
|
|
self.assertIn("ClipboardEvent", ingest)
|
|
self.assertIn("navigator.clipboard.read", chrome)
|
|
self.assertIn("read_clipboard_images", chrome)
|
|
self.assertIn("__dshDesktopIngesting", chrome)
|
|
self.assertIn('clipboardText(e, "text/html")', chrome)
|
|
self.assertNotIn(
|
|
'item.kind === "file" && item.getAsFile()',
|
|
chrome,
|
|
)
|
|
self.assertNotIn("steal", chrome)
|
|
self.assertNotIn("|| !String(text).trim()", chrome)
|
|
|
|
|
|
class BundledAttributionTests(unittest.TestCase):
|
|
def test_readme_cites_upstream_plugins(self):
|
|
readme = (ROOT / "README.md").read_text(encoding="utf-8")
|
|
third = (ROOT / "THIRD_PARTY.md").read_text(encoding="utf-8")
|
|
for text in (readme, third):
|
|
self.assertIn("https://github.com/deepseek-ai/deepseek-harness", text)
|
|
self.assertIn("https://github.com/liustack/modlens", text)
|
|
self.assertIn("https://github.com/xiaobright/dsh-anchored-standard", text)
|
|
self.assertIn("https://github.com/agentrq/agentrq", text)
|
|
self.assertIn("0.1.0-rc.6", text)
|
|
self.assertIn("3.16.6", text)
|
|
self.assertIn("0.2.1", text)
|
|
self.assertIn("ffb845c5480adc953392a6db6f8a98ede621174b", text)
|
|
self.assertIn("dsh-desktop-vision", text)
|
|
self.assertIn("dsh-plugin", readme)
|
|
self.assertIn("带上眼睛", readme)
|
|
self.assertIn("+8%", readme)
|
|
self.assertIn("AGENTRQ_VERSION", (ROOT / "Makefile").read_text(encoding="utf-8"))
|
|
self.assertIn("../plugins/agentrq/", (ROOT / "src-tauri" / "tauri.conf.json").read_text(encoding="utf-8"))
|
|
self.assertNotIn("### 6. 零工具锚定式标准预设", readme)
|
|
self.assertTrue((ROOT / "docs" / "licenses" / "modlens.LICENSE").is_file())
|
|
self.assertTrue((ROOT / "docs" / "licenses" / "agentrq.LICENSE").is_file())
|
|
self.assertTrue((ROOT / "plugins" / "agentrq" / "lib" / "index.js").is_file())
|
|
self.assertTrue(
|
|
(ROOT / "docs" / "licenses" / "dsh-anchored-standard.NOTICE").is_file()
|
|
)
|
|
for name in ("splash.png", "session.png", "vision.png", "menu.png"):
|
|
self.assertTrue((ROOT / "docs" / "screenshots" / name).is_file())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|