|
1 | | -import { YouTubeAdDetector } from '../src/detectors/detections/youtube-ad-detection.js'; |
| 1 | +import { YouTubeAdDetector, runYoutubeAdDetection, resetYoutubeAdDetection } from '../src/detectors/detections/youtube-ad-detection.js'; |
2 | 2 |
|
3 | 3 | const minimalConfig = { |
4 | 4 | playerSelectors: ['#movie_player'], |
@@ -151,4 +151,82 @@ describe('YouTubeAdDetector', () => { |
151 | 151 | expect(detector.state.detections.adBlocker.showing).toBe(true); |
152 | 152 | }); |
153 | 153 | }); |
| 154 | + |
| 155 | + describe('runYoutubeAdDetection hostname gating', () => { |
| 156 | + const enabledConfig = { ...minimalConfig, state: 'enabled' }; |
| 157 | + const emptyResult = { detected: false, type: 'youtubeAds', results: [] }; |
| 158 | + let savedWindow; |
| 159 | + let savedDocument; |
| 160 | + |
| 161 | + beforeEach(() => { |
| 162 | + savedWindow = globalThis.window; |
| 163 | + savedDocument = globalThis.document; |
| 164 | + }); |
| 165 | + |
| 166 | + afterEach(() => { |
| 167 | + resetYoutubeAdDetection(); |
| 168 | + globalThis.window = savedWindow; |
| 169 | + globalThis.document = savedDocument; |
| 170 | + }); |
| 171 | + |
| 172 | + function setHostname(name) { |
| 173 | + const mockDoc = { querySelector: () => null, querySelectorAll: () => [], body: null, hidden: false, readyState: 'complete' }; |
| 174 | + globalThis.window = /** @type {any} */ ({ |
| 175 | + location: { hostname: name, search: '' }, |
| 176 | + document: mockDoc, |
| 177 | + navigator: { userActivation: { isActive: false } }, |
| 178 | + addEventListener: () => {}, |
| 179 | + performance: { now: () => 0 }, |
| 180 | + setTimeout: () => {}, |
| 181 | + setInterval: () => {}, |
| 182 | + URLSearchParams, |
| 183 | + }); |
| 184 | + globalThis.document = /** @type {any} */ (mockDoc); |
| 185 | + } |
| 186 | + |
| 187 | + it('rejects other domains', () => { |
| 188 | + setHostname('example.com'); |
| 189 | + expect(runYoutubeAdDetection(enabledConfig)).toEqual(emptyResult); |
| 190 | + }); |
| 191 | + |
| 192 | + it('rejects domains containing youtube as a substring', () => { |
| 193 | + setHostname('notyoutube.com'); |
| 194 | + expect(runYoutubeAdDetection(enabledConfig)).toEqual(emptyResult); |
| 195 | + }); |
| 196 | + |
| 197 | + it('rejects localhost', () => { |
| 198 | + setHostname('localhost'); |
| 199 | + expect(runYoutubeAdDetection(enabledConfig)).toEqual(emptyResult); |
| 200 | + }); |
| 201 | + |
| 202 | + it('allows youtube.com', () => { |
| 203 | + setHostname('youtube.com'); |
| 204 | + const result = runYoutubeAdDetection(enabledConfig); |
| 205 | + expect(result).not.toEqual(emptyResult); |
| 206 | + }); |
| 207 | + |
| 208 | + it('allows www.youtube.com', () => { |
| 209 | + setHostname('www.youtube.com'); |
| 210 | + const result = runYoutubeAdDetection(enabledConfig); |
| 211 | + expect(result).not.toEqual(emptyResult); |
| 212 | + }); |
| 213 | + |
| 214 | + it('allows m.youtube.com', () => { |
| 215 | + setHostname('m.youtube.com'); |
| 216 | + const result = runYoutubeAdDetection(enabledConfig); |
| 217 | + expect(result).not.toEqual(emptyResult); |
| 218 | + }); |
| 219 | + |
| 220 | + it('allows privacy-test-pages.site', () => { |
| 221 | + setHostname('privacy-test-pages.site'); |
| 222 | + const result = runYoutubeAdDetection(enabledConfig); |
| 223 | + expect(result).not.toEqual(emptyResult); |
| 224 | + }); |
| 225 | + |
| 226 | + it('allows subdomains of privacy-test-pages.site', () => { |
| 227 | + setHostname('test.privacy-test-pages.site'); |
| 228 | + const result = runYoutubeAdDetection(enabledConfig); |
| 229 | + expect(result).not.toEqual(emptyResult); |
| 230 | + }); |
| 231 | + }); |
154 | 232 | }); |
0 commit comments