import assert from 'node:assert/strict' import test from 'node:test' import { classifyCspUserAgentFamily, isSupportedCspReportContentType, normalizeCspBlockedOrigin, normalizeCspDocumentPath, parseCspReportPayload } from '../lib/csp-report.js' test('CSP 보고 URL은 문서 path와 차단 origin까지만 남긴다', () => { const [report] = parseCspReportPayload({ 'csp-report': { 'document-uri': 'https://sori.studio/post/visible?token=secret#private', 'blocked-uri': 'https://cdn.example.com/private/file.js?signature=secret#part', 'effective-directive': 'script-src-elem' } }, 'Mozilla/5.0 Chrome/140.0.0.0 Safari/537.36') assert.deepEqual(report, { policyVersion: 'compat-v1', documentPath: '/post/visible', effectiveDirective: 'script-src-elem', blockedOrigin: 'https://cdn.example.com', userAgentFamily: 'Chrome' }) assert.equal(JSON.stringify(report).includes('secret'), false) assert.equal(JSON.stringify(report).includes('/private/file.js'), false) }) test('CSP 보고 정규화는 실행 토큰과 브라우저 계열만 보존한다', () => { assert.equal(normalizeCspDocumentPath('/settings?email=user@example.com'), '/settings') assert.equal(normalizeCspBlockedOrigin('inline'), 'inline') assert.equal(normalizeCspBlockedOrigin('data:text/javascript,secret'), 'data:') assert.equal(normalizeCspBlockedOrigin(''), 'empty') assert.equal(normalizeCspBlockedOrigin('about:blank'), 'about:') assert.equal(normalizeCspBlockedOrigin('chrome-extension://abcdef/private.html'), 'chrome-extension:') assert.equal(normalizeCspBlockedOrigin('moz-extension://abcdef/private.html'), 'moz-extension:') assert.equal(normalizeCspBlockedOrigin('safari-web-extension://abcdef/private.html'), 'safari-web-extension:') assert.equal(classifyCspUserAgentFamily('Mozilla/5.0 Version/18.0 Safari/605.1.15'), 'Safari') }) test('CSP 수집은 지정된 JSON 호환 미디어 타입만 허용한다', () => { assert.equal(isSupportedCspReportContentType('application/csp-report'), true) assert.equal(isSupportedCspReportContentType('application/reports+json; charset=utf-8'), true) assert.equal(isSupportedCspReportContentType('application/vnd.example+json'), true) assert.equal(isSupportedCspReportContentType('text/plain'), false) })