Files
funplay-cocos-mcp/test/cocos-project-tools.test.js
2026-06-10 20:26:09 -07:00

90 lines
2.3 KiB
JavaScript

'use strict';
const assert = require('node:assert/strict');
const test = require('node:test');
const {
broadcastEditorMessage,
getEditorPreference,
setEditorPreference,
tryEditorRequests,
tryEditorRequestsStatus,
} = require('../lib/tools/cocos-project');
test('tryEditorRequests returns the first successful editor message candidate', async () => {
const calls = [];
global.Editor = {
Message: {
request: async (channel, method, payload) => {
calls.push({ channel, method, payload });
if (method === 'bad') {
throw new Error('nope');
}
return { ok: true };
},
},
};
try {
const result = await tryEditorRequests([
{ channel: 'scene', method: 'bad' },
{ channel: 'scene', method: 'save-scene', args: [{ force: true }] },
]);
assert.equal(result.ok, true);
assert.equal(result.method, 'save-scene');
assert.equal(calls.length, 2);
} finally {
delete global.Editor;
}
});
test('tryEditorRequestsStatus returns an unavailable payload instead of throwing', async () => {
global.Editor = {
Message: {
request: async () => {
throw new Error('missing');
},
},
};
try {
const result = await tryEditorRequestsStatus([{ channel: 'builder', method: 'query-build-status' }]);
assert.equal(result.ok, false);
assert.equal(result.available, false);
assert.equal(result.attempts.length, 1);
} finally {
delete global.Editor;
}
});
test('preference helpers and broadcast use available Editor APIs', () => {
const sent = [];
const store = new Map();
global.Editor = {
Message: {
send(channel, message, payload) {
sent.push({ channel, message, payload });
},
},
Profile: {
getProject(key) {
return store.get(key);
},
setProject(key, value) {
store.set(key, value);
},
},
};
try {
setEditorPreference('project', 'preview.port', 7456);
assert.equal(getEditorPreference('project', 'preview.port'), 7456);
const result = broadcastEditorMessage({ channel: 'scene', message: 'custom-event', payload: { ok: true } });
assert.equal(result.sent, true);
assert.deepEqual(sent[0], { channel: 'scene', message: 'custom-event', payload: { ok: true } });
} finally {
delete global.Editor;
}
});