1
0
forked from icd/rentgen
rentgen/tests/test_verify.mjs
Jacek Wielemborek b1154c4d62 test: add Selenium WebDriver integration tests
- Add Selenium WebDriver for browser extension testing
- Simplify test content script (only essential DOM attributes)
- Rename test-content-script.js → inner-test-content-script.js for clarity
- Add DEBUG_ prefix to test event name (DEBUG_rentgen_test_request)
- Auto-restore manifest.json after tests (git checkout)
- Include tests in run-checks.sh script
- Update Dockerfile to use Selenium instead of Marionette
- Ignore tests directory in web-ext lint

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 11:04:16 +00:00

146 lines
4.7 KiB
JavaScript
Executable File

#!/usr/bin/env node
/**
* test_verify.mjs - Extension badge count verification test using Selenium WebDriver
*
* Verifies Rentgen's core functionality: counting third-party domains.
* Tests two scenarios:
* 1. Site without third-party domains (news.ycombinator.com) → badge = 0
* 2. Site with third-party domains (pudelek.pl) → badge > 0
*/
import { Builder, By, until } from 'selenium-webdriver';
import firefox from 'selenium-webdriver/firefox.js';
import { readFileSync } from 'fs';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const isTTY = process.stdout.isTTY;
function red(text) {
return isTTY ? `\x1b[91m${text}\x1b[0m` : text;
}
async function testBadgeCount() {
let driver = null;
try {
// Load test library
const testLibPath = join(__dirname, 'test-lib.js');
const testLib = readFileSync(testLibPath, 'utf-8');
// Find extension path (project root contains manifest.json and built files in lib/)
const extensionPath = join(__dirname, '..');
console.log(' Launching Firefox with extension...');
// Set up Firefox options
const options = new firefox.Options();
// Set headless mode based on environment
if (process.env.HEADLESS !== 'false') {
options.addArguments('-headless');
}
// Create WebDriver instance
driver = await new Builder()
.forBrowser('firefox')
.setFirefoxOptions(options)
.build();
// Install the extension from the dist directory
// Firefox WebDriver allows installing unpacked extensions
console.log(' Installing extension...');
await driver.installAddon(extensionPath, true); // true = temporary install
const results = {};
// Test 1: Site without third-party domains
console.log(' Testing news.ycombinator.com (expected: 0 third-party domains)...');
await driver.get('https://news.ycombinator.com');
// Wait for page to load
await driver.sleep(5000);
const badgeCountHN = await driver.executeAsyncScript(`
const testLibCode = arguments[0];
const callback = arguments[1];
eval(testLibCode);
testBadgeCount().then(callback).catch(err => callback(null));
`, testLib);
results.hn = badgeCountHN;
console.log(` → Badge count: ${badgeCountHN}`);
// Test 2: Site with third-party domains
console.log(' Testing pudelek.pl (expected: >0 third-party domains)...');
await driver.get('https://pudelek.pl');
// Wait longer for tracking detection
await driver.sleep(10000);
const badgeCountPudelek = await driver.executeAsyncScript(`
const testLibCode = arguments[0];
const callback = arguments[1];
eval(testLibCode);
testBadgeCount().then(callback).catch(err => callback(null));
`, testLib);
results.pudelek = badgeCountPudelek;
console.log(` → Badge count: ${badgeCountPudelek}`);
await driver.quit();
// Verify results
if (badgeCountHN === null || badgeCountPudelek === null) {
return { success: false, error: 'Test timed out or failed to get badge count' };
}
if (badgeCountHN === 0 && badgeCountPudelek > 0) {
return { success: true, results };
} else {
return {
success: false,
error: `Unexpected results: HN=${badgeCountHN} (expected 0), Pudelek=${badgeCountPudelek} (expected >0)`
};
}
} catch (error) {
if (driver) {
await driver.quit();
}
return { success: false, error: error.message };
}
}
async function main() {
console.log('Starting Rentgen badge count verification test...');
console.log('');
const result = await testBadgeCount();
console.log('');
if (!result.success) {
console.log(red(`FAIL: ${result.error}`));
process.exit(1);
}
console.log('PASS: Badge count test succeeded!');
console.log(` - news.ycombinator.com: ${result.results.hn} third-party domains`);
console.log(` - pudelek.pl: ${result.results.pudelek} third-party domains`);
process.exit(0);
}
// Handle signals
process.on('SIGINT', () => process.exit(130));
process.on('SIGTERM', () => process.exit(143));
main().catch(error => {
console.error(red(`ERROR: ${error.message}`));
process.exit(1);
});