verstak-browser-extension/scripts/test-popup-catalog-fallback.js

72 lines
2.3 KiB
JavaScript

#!/usr/bin/env node
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const vm = require('vm');
class Element {
constructor(text) {
this.value = '';
this.textContent = text || '';
this.className = '';
this.files = [];
this.listeners = {};
}
addEventListener(type, listener) { this.listeners[type] = listener; }
}
const ids = [
'status', 'receiver-state', 'receiver-url', 'receiver-input', 'receiver-token-input',
'language-select', 'file-input', 'pending-count', 'status-dot', 'subtitle',
'receiver-label', 'pending-label', 'url-label', 'file-label', 'receiver-url-label',
'receiver-token-label', 'language-label', 'capture-page', 'capture-file', 'retry',
'save-settings', 'context-menu-hint', 'language-system-option', 'language-en-option',
'language-ru-option',
];
const elements = Object.fromEntries(ids.map((id) => [id, new Element()]));
elements['capture-page'].textContent = 'Send Page';
const browser = {
runtime: {
getURL(relativePath) { return `extension://${relativePath}`; },
sendMessage() {
return Promise.resolve({
settings: { receiverUrl: 'http://127.0.0.1/', receiverToken: '', language: 'system' },
pendingCount: 0,
status: {},
});
},
},
i18n: { getUILanguage() { return 'en-US'; } },
};
const document = {
activeElement: null,
documentElement: { lang: '' },
getElementById(id) { return elements[id]; },
};
const context = vm.createContext({
browser,
document,
navigator: { language: 'en-US' },
console: { warn() {}, error: console.error },
Promise,
fetch() { return Promise.reject(new Error('catalog unavailable')); },
});
context.globalThis = context;
const root = path.resolve(__dirname, '..');
for (const file of ['shared/i18n.js', 'shared/popup/popup.js']) {
vm.runInContext(fs.readFileSync(path.join(root, file), 'utf8'), context, { filename: file });
}
(async () => {
for (let i = 0; i < 16; i += 1) await Promise.resolve();
assert.strictEqual(elements['capture-page'].textContent, 'Send Page');
assert.strictEqual(elements['receiver-state'].textContent, 'Unknown');
assert.strictEqual(document.documentElement.lang, 'en');
console.log('browser extension popup catalog fallback tests passed');
})().catch((error) => {
console.error(error);
process.exit(1);
});