mirror of
https://github.com/lawrencehook/remove-youtube-suggestions.git
synced 2026-07-25 06:54:31 +00:00
182 lines
8.2 KiB
JavaScript
182 lines
8.2 KiB
JavaScript
const { describe, it } = require('node:test');
|
|
const assert = require('node:assert');
|
|
|
|
/**
|
|
* Tests for URL regex patterns used in content-script/main.js
|
|
* These patterns determine which YouTube page type the extension is on.
|
|
*
|
|
* Since the actual content script depends on DOM, we recreate the patterns here
|
|
* to test their correctness independently.
|
|
*/
|
|
|
|
// Recreate the regex patterns from content-script/main.js
|
|
const resultsPageRegex = new RegExp('.*://.*youtube\\.com/results.*', 'i');
|
|
const homepageRegex = new RegExp('.*://(www|m)\\.youtube\\.com(/)?$', 'i');
|
|
const shortsRegex = new RegExp('.*://.*youtube\\.com/shorts.*', 'i');
|
|
const videoRegex = new RegExp('.*://.*youtube\\.com/watch\\?v=.*', 'i');
|
|
const channelRegex = new RegExp('.*://.*youtube\\.com/(@|channel)', 'i');
|
|
const subsRegex = new RegExp(/\/feed\/subscriptions$/, 'i');
|
|
|
|
describe('YouTube URL Pattern Matching', () => {
|
|
describe('resultsPageRegex', () => {
|
|
it('should match search results page', () => {
|
|
assert.strictEqual(resultsPageRegex.test('https://www.youtube.com/results?search_query=test'), true);
|
|
assert.strictEqual(resultsPageRegex.test('https://youtube.com/results?search_query=cats'), true);
|
|
assert.strictEqual(resultsPageRegex.test('http://www.youtube.com/results'), true);
|
|
});
|
|
|
|
it('should not match other pages', () => {
|
|
assert.strictEqual(resultsPageRegex.test('https://www.youtube.com/'), false);
|
|
assert.strictEqual(resultsPageRegex.test('https://www.youtube.com/watch?v=abc'), false);
|
|
assert.strictEqual(resultsPageRegex.test('https://www.youtube.com/shorts/abc'), false);
|
|
});
|
|
|
|
it('should match mobile results page', () => {
|
|
assert.strictEqual(resultsPageRegex.test('https://m.youtube.com/results?search_query=test'), true);
|
|
});
|
|
});
|
|
|
|
describe('homepageRegex', () => {
|
|
it('should match desktop homepage', () => {
|
|
assert.strictEqual(homepageRegex.test('https://www.youtube.com/'), true);
|
|
assert.strictEqual(homepageRegex.test('https://www.youtube.com'), true);
|
|
assert.strictEqual(homepageRegex.test('http://www.youtube.com/'), true);
|
|
});
|
|
|
|
it('should match mobile homepage', () => {
|
|
assert.strictEqual(homepageRegex.test('https://m.youtube.com/'), true);
|
|
assert.strictEqual(homepageRegex.test('https://m.youtube.com'), true);
|
|
});
|
|
|
|
it('should not match other pages', () => {
|
|
assert.strictEqual(homepageRegex.test('https://www.youtube.com/feed/subscriptions'), false);
|
|
assert.strictEqual(homepageRegex.test('https://www.youtube.com/watch?v=abc'), false);
|
|
assert.strictEqual(homepageRegex.test('https://www.youtube.com/results?search_query=test'), false);
|
|
});
|
|
|
|
it('should not match youtube.com without subdomain prefix', () => {
|
|
// The regex requires www or m subdomain
|
|
assert.strictEqual(homepageRegex.test('https://youtube.com/'), false);
|
|
assert.strictEqual(homepageRegex.test('https://youtube.com'), false);
|
|
});
|
|
});
|
|
|
|
describe('shortsRegex', () => {
|
|
it('should match shorts page', () => {
|
|
assert.strictEqual(shortsRegex.test('https://www.youtube.com/shorts/abc123'), true);
|
|
assert.strictEqual(shortsRegex.test('https://youtube.com/shorts/xyz'), true);
|
|
assert.strictEqual(shortsRegex.test('https://m.youtube.com/shorts/video'), true);
|
|
});
|
|
|
|
it('should not match other pages', () => {
|
|
assert.strictEqual(shortsRegex.test('https://www.youtube.com/'), false);
|
|
assert.strictEqual(shortsRegex.test('https://www.youtube.com/watch?v=abc'), false);
|
|
});
|
|
|
|
it('should match shorts in URL path', () => {
|
|
// Even if shorts is part of query string (edge case)
|
|
assert.strictEqual(shortsRegex.test('https://www.youtube.com/shorts'), true);
|
|
});
|
|
});
|
|
|
|
describe('videoRegex', () => {
|
|
it('should match video watch page', () => {
|
|
assert.strictEqual(videoRegex.test('https://www.youtube.com/watch?v=dQw4w9WgXcQ'), true);
|
|
assert.strictEqual(videoRegex.test('https://youtube.com/watch?v=abc123'), true);
|
|
assert.strictEqual(videoRegex.test('https://m.youtube.com/watch?v=xyz'), true);
|
|
});
|
|
|
|
it('should match video with additional parameters', () => {
|
|
assert.strictEqual(videoRegex.test('https://www.youtube.com/watch?v=abc&t=120'), true);
|
|
assert.strictEqual(videoRegex.test('https://www.youtube.com/watch?v=abc&list=PLxyz'), true);
|
|
});
|
|
|
|
it('should not match other pages', () => {
|
|
assert.strictEqual(videoRegex.test('https://www.youtube.com/'), false);
|
|
assert.strictEqual(videoRegex.test('https://www.youtube.com/shorts/abc'), false);
|
|
assert.strictEqual(videoRegex.test('https://www.youtube.com/results?search_query=test'), false);
|
|
});
|
|
|
|
it('should not match watch without v parameter', () => {
|
|
assert.strictEqual(videoRegex.test('https://www.youtube.com/watch'), false);
|
|
assert.strictEqual(videoRegex.test('https://www.youtube.com/watch?list=abc'), false);
|
|
});
|
|
});
|
|
|
|
describe('channelRegex', () => {
|
|
it('should match @ handle channels', () => {
|
|
assert.strictEqual(channelRegex.test('https://www.youtube.com/@username'), true);
|
|
assert.strictEqual(channelRegex.test('https://youtube.com/@channel123'), true);
|
|
assert.strictEqual(channelRegex.test('https://m.youtube.com/@creator'), true);
|
|
});
|
|
|
|
it('should match /channel/ URLs', () => {
|
|
assert.strictEqual(channelRegex.test('https://www.youtube.com/channel/UCxyz123'), true);
|
|
assert.strictEqual(channelRegex.test('https://youtube.com/channel/UC123abc'), true);
|
|
});
|
|
|
|
it('should not match other pages', () => {
|
|
assert.strictEqual(channelRegex.test('https://www.youtube.com/'), false);
|
|
assert.strictEqual(channelRegex.test('https://www.youtube.com/watch?v=abc'), false);
|
|
assert.strictEqual(channelRegex.test('https://www.youtube.com/results?search_query=@user'), false);
|
|
});
|
|
});
|
|
|
|
describe('subsRegex', () => {
|
|
it('should match subscriptions feed', () => {
|
|
assert.strictEqual(subsRegex.test('https://www.youtube.com/feed/subscriptions'), true);
|
|
assert.strictEqual(subsRegex.test('https://youtube.com/feed/subscriptions'), true);
|
|
assert.strictEqual(subsRegex.test('/feed/subscriptions'), true);
|
|
});
|
|
|
|
it('should not match with trailing path', () => {
|
|
assert.strictEqual(subsRegex.test('https://www.youtube.com/feed/subscriptions/more'), false);
|
|
});
|
|
|
|
it('should not match other feeds', () => {
|
|
assert.strictEqual(subsRegex.test('https://www.youtube.com/feed/library'), false);
|
|
assert.strictEqual(subsRegex.test('https://www.youtube.com/feed/history'), false);
|
|
});
|
|
});
|
|
|
|
// Edge cases and potential bugs
|
|
describe('Edge Cases', () => {
|
|
it('should be case insensitive', () => {
|
|
assert.strictEqual(resultsPageRegex.test('HTTPS://WWW.YOUTUBE.COM/RESULTS'), true);
|
|
assert.strictEqual(homepageRegex.test('HTTPS://WWW.YOUTUBE.COM/'), true);
|
|
assert.strictEqual(videoRegex.test('HTTPS://WWW.YOUTUBE.COM/WATCH?V=ABC'), true);
|
|
});
|
|
|
|
it('should not match URLs with ports (regex limitation)', () => {
|
|
// The current regex doesn't handle ports - they would fail to match
|
|
// This is fine since YouTube doesn't use non-standard ports
|
|
assert.strictEqual(videoRegex.test('https://www.youtube.com:443/watch?v=abc'), false);
|
|
});
|
|
|
|
it('should not match youtu.be short URLs (not youtube.com)', () => {
|
|
assert.strictEqual(videoRegex.test('https://youtu.be/abc123'), false);
|
|
assert.strictEqual(homepageRegex.test('https://youtu.be/'), false);
|
|
});
|
|
|
|
it('should not match fakeyoutube.com', () => {
|
|
assert.strictEqual(homepageRegex.test('https://www.fakeyoutube.com/'), false);
|
|
});
|
|
|
|
it('should not match youtube.com.evil.com', () => {
|
|
// The regex checks for youtube.com/ pattern, so evil.com after doesn't match
|
|
assert.strictEqual(videoRegex.test('https://www.youtube.com.evil.com/watch?v=abc'), false);
|
|
});
|
|
|
|
it('homepage should handle www.youtube.com edge cases', () => {
|
|
// No subdomain - should NOT match
|
|
assert.strictEqual(homepageRegex.test('https://youtube.com/'), false);
|
|
|
|
// music subdomain - should NOT match (not www or m)
|
|
assert.strictEqual(homepageRegex.test('https://music.youtube.com/'), false);
|
|
|
|
// tv subdomain - should NOT match
|
|
assert.strictEqual(homepageRegex.test('https://tv.youtube.com/'), false);
|
|
});
|
|
});
|
|
});
|