aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/assistant/test_files.js
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-16 15:23:35 +0200
committerDanilo M. <danix@danix.xyz>2026-10-16 15:23:35 +0200
commit13a10999f53802858f87883db381842d741eab69 (patch)
tree7354e5d8c3b34a84ddb50a3906c47638d189550c /desktop/assistant/test_files.js
parent6dcf62fbdf2446cf163923d5de0676a6b3ad3019 (diff)
downloadquickshell-13a10999f53802858f87883db381842d741eab69.tar.gz
quickshell-13a10999f53802858f87883db381842d741eab69.zip
feat(assistant): file kinds and dropped URLs
Files.js decides what the card offers for a staged file; the daemon decides what chat accepts, so the text and image lists match its own. Dropped URLs become paths only for file:// ones. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Diffstat (limited to 'desktop/assistant/test_files.js')
-rw-r--r--desktop/assistant/test_files.js40
1 files changed, 40 insertions, 0 deletions
diff --git a/desktop/assistant/test_files.js b/desktop/assistant/test_files.js
new file mode 100644
index 0000000..a15495b
--- /dev/null
+++ b/desktop/assistant/test_files.js
@@ -0,0 +1,40 @@
+// Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Run: node desktop/assistant/test_files.js
+// Files.js is a QML library, so its .pragma line is stripped before node
+// evaluates it.
+
+const fs = require("fs");
+const assert = require("assert");
+
+const src = fs.readFileSync(__dirname + "/Files.js", "utf8")
+ .replace(/^\.pragma library$/m, "");
+const F = new Function(src + "\nreturn { kind, chats, fromUrl, file, name };")();
+
+const cases = {
+ "/a/report.pdf": "pdf", "/a/Report.PDF": "pdf", "/a/x.png": "image", "/a/x.JPEG": "image",
+ "/a/clip.mp4": "video", "/a/c.MKV": "video", "/a/src.tar.gz": "archive", "/a/b.7z": "archive",
+ "/a/main.py": "text", "/a/notes.md": "text", "/a/pkg.SlackBuild": "text",
+ "/a/Makefile": "other", "/a/.bashrc": "other", "/a/x.bin": "other", "/a/dir.d/noext": "other",
+};
+for (const [p, k] of Object.entries(cases)) assert.strictEqual(F.kind(p), k, p);
+
+assert.ok(F.chats("pdf") && F.chats("image") && F.chats("text"));
+assert.ok(!F.chats("video") && !F.chats("archive") && !F.chats("other"));
+
+assert.strictEqual(F.fromUrl("file:///home/you/My%20Docs/caf%C3%A9.pdf"), "/home/you/My Docs/café.pdf");
+assert.strictEqual(F.fromUrl("file:///tmp/a.txt"), "/tmp/a.txt");
+assert.strictEqual(F.fromUrl("https://example.org/a.pdf"), "");
+assert.strictEqual(F.fromUrl("file:///bad%E0%A4%A"), ""); // malformed escape
+assert.deepStrictEqual(F.file("/x/y/a b.pdf"), { path: "/x/y/a b.pdf", name: "a b.pdf", kind: "pdf" });
+
+console.log("ok");