This repository has no description
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151import test from 'node:test';import assert from 'node:assert/strict';import { readFile } from 'node:fs/promises';import puppeteer from 'puppeteer-core';
const chromePath = process.env.CHROME_PATH || '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome';
async function loadPage(initialFeedWidth = 600) { const browser = await puppeteer.launch({ executablePath: chromePath, headless: true }); const page = await browser.newPage(); const popupHtml = await readFile('extension/chrome/popup/popup.html', 'utf8'); const popupJs = await readFile('extension/chrome/popup/popup.js', 'utf8'); const flagsJs = await readFile('extension/shared/feature-flags.js', 'utf8'); const feedWidthJs = await readFile('extension/shared/feed-width.js', 'utf8');
await page.setContent(popupHtml.replace(/<script[\s\S]*?<\/script>/gi, '').replace(/<link[^>]+>/gi, '')); await page.evaluate((feedWidth) => { const tablist = document.createElement('div'); tablist.setAttribute('role', 'tablist'); document.body.appendChild(tablist);
const feed = document.createElement('div'); feed.setAttribute('style', 'max-width: 600px'); document.body.appendChild(feed);
const stored = { feedWidth }; const storageListeners = []; const runtimeListeners = []; const get = (keys, callback) => { const request = new Promise(resolve => setTimeout(() => { const result = {}; const defaults = typeof keys === 'string' ? { [keys]: undefined } : Array.isArray(keys) ? Object.fromEntries(keys.map(key => [key, undefined])) : keys || stored; for (const [key, fallback] of Object.entries(defaults)) { result[key] = Object.prototype.hasOwnProperty.call(stored, key) ? stored[key] : fallback; } resolve(result); }, 0)); if (callback) request.then(callback); return request; }; window.__bskyplusTestStorage = stored; window.chrome = { runtime: { getManifest: () => ({ version: 'test' }), onMessage: { addListener: listener => runtimeListeners.push(listener) }, sendMessage: () => Promise.resolve() }, storage: { local: { get, set: (values, callback) => { const changes = {}; for (const [key, value] of Object.entries(values)) { changes[key] = { oldValue: stored[key], newValue: value }; stored[key] = value; } storageListeners.forEach(listener => listener(changes, 'local')); if (callback) setTimeout(callback, 0); return Promise.resolve(); } }, onChanged: { addListener: listener => storageListeners.push(listener) } }, tabs: { query: (_query, callback) => callback([{ id: 1 }]), sendMessage: (_id, message, callback) => { let response; runtimeListeners.forEach(listener => listener(message, {}, value => { response = value; })); if (callback) callback(response); return Promise.resolve(response); } } }; }, initialFeedWidth);
await page.addScriptTag({ content: flagsJs }); await page.addScriptTag({ content: popupJs }); await page.addScriptTag({ content: feedWidthJs }); await page.waitForFunction(() => document.getElementById('feedWidthSlider')?.value === String(window.__bskyplusTestStorage.feedWidth)) .catch(async error => { await browser.close(); throw error; }); return { browser, page };}
test('default preset stores 600 while live runtime uses 599', async () => { const { browser, page } = await loadPage(800); try { await page.click('[data-width="600"]'); const state = await page.evaluate(() => ({ stored: window.__bskyplusTestStorage.feedWidth, label: document.getElementById('feedWidthVal').textContent, slider: document.getElementById('feedWidthSlider').value, configured: window.BskyPlusFeedWidth.getConfiguredWidth(), effective: window.BskyPlusFeedWidth.getWidth(), css: document.getElementById('bskyplus-feed-width-style')?.textContent || '', tablist: document.querySelector('[role="tablist"]').style.maxWidth })); assert.equal(state.stored, 600); assert.equal(state.label, '600px (Default)'); assert.equal(state.slider, '600'); assert.equal(state.configured, 600); assert.equal(state.effective, 599); assert.match(state.css, /--bskyplus-feed-width: 599px/); assert.equal(state.tablist, '599px'); } finally { await browser.close(); }});
test('stored default starts at 600 and each live update maps it to 599', async () => { const { browser, page } = await loadPage(600); try { assert.deepEqual(await page.evaluate(() => ({ configured: window.BskyPlusFeedWidth.getConfiguredWidth(), effective: window.BskyPlusFeedWidth.getWidth(), hasStyle: !!document.getElementById('bskyplus-feed-width-style') })), { configured: 600, effective: 600, hasStyle: false });
await page.evaluate(() => { window.chrome.storage.local.set({ feedWidth: 600 }); window.postMessage({ type: 'BSKYPLUS_UPDATE_SETTINGS', settings: { feedWidth: 600 } }, '*'); }); await page.waitForFunction(() => window.BskyPlusFeedWidth.getWidth() === 599); const state = await page.evaluate(() => ({ configured: window.BskyPlusFeedWidth.getConfiguredWidth(), effective: window.BskyPlusFeedWidth.getWidth(), css: document.getElementById('bskyplus-feed-width-style')?.textContent || '' })); assert.equal(state.configured, 600); assert.equal(state.effective, 599); assert.match(state.css, /--bskyplus-feed-width: 599px/);
await page.evaluate(() => { window.BskyPlusFeedWidth.setWidth(600); window.dispatchEvent(new Event('resize')); }); assert.equal(await page.evaluate(() => window.BskyPlusFeedWidth.getWidth()), 599); assert.equal(await page.evaluate(() => window.BskyPlusFeedWidth.getConfiguredWidth()), 600);
await page.evaluate(() => { window.BskyPlusFeedWidth.setWidth(800); window.BskyPlusFeedWidth.setWidth(625); }); assert.equal(await page.evaluate(() => window.BskyPlusFeedWidth.getWidth()), 625); assert.match(await page.$eval('#bskyplus-feed-width-style', el => el.textContent), /--bskyplus-feed-width: 625px/); } finally { await browser.close(); }});