Files
OpenScript/tests/parser.test.js

67 lines
2.3 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { parseMeta, normalizeMatch, getBoilerplate } from '../src/utils/parser.js';
import { wrapScriptCode } from '../src/utils/userScripts.js';
test('parseMeta extracts standard Tampermonkey metadata', () => {
const sample = `
// ==UserScript==
// @name Test Script
// @version 2.1.0
// @description Sample description
// @author Alice
// @match https://gemini.google.com/*
// @match https://example.com/*
// @run-at document-start
// @grant none
// ==/UserScript==
console.log('hello');
`;
const meta = parseMeta(sample);
assert.equal(meta.name, 'Test Script');
assert.equal(meta.version, '2.1.0');
assert.equal(meta.description, 'Sample description');
assert.equal(meta.author, 'Alice');
assert.deepEqual(meta.matches, ['https://gemini.google.com/*', 'https://example.com/*']);
assert.equal(meta.runAt, 'document_start');
});
test('parseMeta falls back to defaults when fields are missing', () => {
const sample = `
// ==UserScript==
// ==/UserScript==
`;
const meta = parseMeta(sample);
assert.equal(meta.name, 'Untitled Script');
assert.equal(meta.version, '1.0.0');
assert.deepEqual(meta.matches, ['*://*/*']);
assert.equal(meta.runAt, 'document_idle');
});
test('normalizeMatch formats URL patterns for Chrome userScripts API', () => {
assert.equal(normalizeMatch('https://example.com'), 'https://example.com/*');
assert.equal(normalizeMatch('example.com/*'), '*://example.com/*');
assert.equal(normalizeMatch('*://*/*'), '*://*/*');
});
test('wrapScriptCode injects OpenScript.env and GM_getValue polyfill', () => {
const code = 'console.log(env.API_KEY, GM_getValue("API_KEY"));';
const wrapped = wrapScriptCode(code, { API_KEY: 'secret123' });
assert.ok(wrapped.includes('OpenScript'));
assert.ok(wrapped.includes('"API_KEY":"secret123"'));
assert.ok(wrapped.includes('globalThis.OpenScript'));
assert.ok(wrapped.includes('GM_getValue'));
assert.ok(wrapped.includes(code));
});
test('getBoilerplate produces valid Tampermonkey template without namespace', () => {
const template = getBoilerplate('My Script');
assert.ok(template.includes('// @name My Script'));
assert.ok(!template.includes('@namespace'));
const parsed = parseMeta(template);
assert.equal(parsed.name, 'My Script');
});