Files
JasonHoku-ComfyUI-Ultimate-…/tests/js/dragdrop.test.js
T
Jason HokuandClaude Fable 5.1 e88b18a549 fix(dashboard): drag the Revise image onto Load Image / canvas, plus a Send to Load Image button (#22)
Rich dragstart (asset-info JSON, uri-list, plain, DownloadURL; reference not copy), a modal button that
fills the selected/only/new Load Image via the parent bridge, standalone Download image fallback.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:58:31 -08:00

66 lines
3.4 KiB
JavaScript

'use strict';
const test = require('node:test');
const assert = require('node:assert');
const D = require('../../resources/logic_dragdrop.js');
const B = 'http://127.0.0.1:8188/';
const mk = (file, extra) => Object.assign({ id: 1, file: file }, extra || {});
test('uscgImageRef parses a /view URL (webp, nested subfolder)', () => {
const r = D.uscgImageRef(mk('/view?filename=img_1.webp&type=output&subfolder=benchmarks/Sess/images'), B);
assert.strictEqual(r.filename, 'img_1.webp');
assert.strictEqual(r.subfolder, 'benchmarks/Sess/images');
assert.strictEqual(r.type, 'output');
assert.strictEqual(r.mime, 'image/webp');
assert.strictEqual(r.absUrl, B + 'view?filename=img_1.webp&type=output&subfolder=benchmarks/Sess/images');
assert.strictEqual(D.uscgAnnotatedPath(r), 'benchmarks/Sess/images/img_1.webp [output]');
});
test('uscgImageRef: png/jpg mimes, url-encoded names, default type, empty subfolder', () => {
assert.strictEqual(D.uscgImageRef(mk('/view?filename=a.PNG'), B).mime, 'image/png');
assert.strictEqual(D.uscgImageRef(mk('/view?filename=a.jpeg'), B).mime, 'image/jpeg');
const r = D.uscgImageRef(mk('/view?filename=my%20pic%20%281%29.jpg&type=temp&subfolder='), B);
assert.strictEqual(r.filename, 'my pic (1).jpg');
assert.strictEqual(r.type, 'temp');
assert.strictEqual(D.uscgAnnotatedPath(r), 'my pic (1).jpg [temp]');
assert.strictEqual(D.uscgImageRef(mk('/view?filename=a.png'), B).type, 'output');
});
test('uscgImageRef returns null for videos, workflow cards, bad input', () => {
assert.strictEqual(D.uscgImageRef(mk('/view?filename=a.mp4', { media_type: 'video' }), B), null);
assert.strictEqual(D.uscgImageRef(mk('/view?filename=a.webp', { model_type: 'workflow' }), B), null);
assert.strictEqual(D.uscgImageRef(mk('/view?filename=a.mp4'), B), null);
assert.strictEqual(D.uscgImageRef(mk('/view?type=output'), B), null);
assert.strictEqual(D.uscgImageRef(null, B), null);
assert.strictEqual(D.uscgImageRef({}, B), null);
});
function fakeDt() {
const data = {}, added = [];
return { data, added, setData: (k, v) => { data[k] = v; }, items: { add: (f) => added.push(f) } };
}
test('uscgFillDragData sets the four carriers and no File by default', () => {
const ref = D.uscgImageRef(mk('/view?filename=img_1.webp&type=output&subfolder=b/s'), B);
const dt = fakeDt();
D.uscgFillDragData(dt, ref, null);
assert.deepStrictEqual(JSON.parse(dt.data['application/x-comfy-asset-info']),
{ filename: 'img_1.webp', subfolder: 'b/s', type: 'output', display_name: 'img_1.webp' });
assert.strictEqual(dt.data['text/uri-list'], ref.absUrl);
assert.strictEqual(dt.data['text/plain'], ref.absUrl);
assert.strictEqual(dt.data['DownloadURL'], 'image/webp:img_1.webp:' + ref.absUrl);
assert.strictEqual(dt.added.length, 0);
assert.strictEqual(dt.effectAllowed, 'copy');
});
test('uscgFillDragData attaches a File only when one is passed; survives items.add throwing', () => {
const ref = D.uscgImageRef(mk('/view?filename=a.png'), B);
const dt = fakeDt();
D.uscgFillDragData(dt, ref, { name: 'a.png' });
assert.strictEqual(dt.added.length, 1);
const bad = { setData() {}, items: { add() { throw new Error('protected'); } } };
assert.doesNotThrow(() => D.uscgFillDragData(bad, ref, {}));
});
test('upload mode is off by default', () => { assert.strictEqual(D.USCG_DRAG_UPLOAD, false); });