From 060d57639e4da1270099bff164be0e1fdc4fedcc Mon Sep 17 00:00:00 2001 From: nipunrajk Date: Wed, 2 Sep 2026 22:22:35 +0530 Subject: [PATCH] test(navigation): tighten BASE_URL assertions per code review --- src/tests/navigation-base-url.test.ts | 113 ++++++++++++-------------- 1 file changed, 54 insertions(+), 59 deletions(-) diff --git a/src/tests/navigation-base-url.test.ts b/src/tests/navigation-base-url.test.ts index 282e3559..f41c61c2 100644 --- a/src/tests/navigation-base-url.test.ts +++ b/src/tests/navigation-base-url.test.ts @@ -7,89 +7,84 @@ describe('Navigation BASE_URL Consistency', () => { const pagesDir = path.resolve(__dirname, '../pages'); const rootDir = path.resolve(__dirname, '../../'); - it('ensures no tool logic files hardcode root "/" or relative paths for navigation', () => { + it('ensures tool navigation assignments strictly use import.meta.env.BASE_URL', () => { const files = fs .readdirSync(logicDir) - .filter((file) => file.endsWith('.ts') || file.endsWith('.js')); + .filter( + (file) => + (file.endsWith('.ts') || file.endsWith('.js')) && + file !== 'shortcuts.ts' + ); - const offendingFiles: string[] = []; + const nonCompliantAssignments: Array<{ file: string; target: string }> = []; for (const file of files) { const content = fs.readFileSync(path.join(logicDir, file), 'utf-8'); + const assignments = content.matchAll( + /window\.location\.href\s*=\s*([^;\n]+)/g + ); - // Check for hardcoded root redirects or relative path escapes - if ( - /window\.location\.href\s*=\s*['"`]\/['"`]/.test(content) || - /window\.location\.href\s*=\s*['"`]\.\.\//.test(content) - ) { - offendingFiles.push(file); + for (const match of assignments) { + const target = match[1].trim(); + if (!target.includes('import.meta.env.BASE_URL')) { + nonCompliantAssignments.push({ file, target }); + } } } expect( - offendingFiles, - `The following files hardcode root or relative navigation instead of import.meta.env.BASE_URL: ${offendingFiles.join( - ', ' + nonCompliantAssignments, + `The following files assign window.location.href without import.meta.env.BASE_URL: ${JSON.stringify( + nonCompliantAssignments, + null, + 2 )}` ).toEqual([]); }); - it('ensures tool logic files with back-to-tools button use import.meta.env.BASE_URL', () => { - const files = fs - .readdirSync(logicDir) - .filter((file) => file.endsWith('.ts') || file.endsWith('.js')); + it('ensures each affected back-button handler assigns import.meta.env.BASE_URL', () => { + const affectedFiles = [ + 'deskew-pdf-page.ts', + 'markdown-to-pdf-page.ts', + 'remove-annotations-page.ts', + 'form-filler-page.ts', + 'remove-blank-pages-page.ts', + ]; - const filesMissingBaseUrl: string[] = []; - - for (const file of files) { + for (const file of affectedFiles) { const content = fs.readFileSync(path.join(logicDir, file), 'utf-8'); - - // If the file handles 'back-to-tools' click navigation - if ( - content.includes('back-to-tools') && - content.includes('window.location.href') && - !content.includes('import.meta.env.BASE_URL') - ) { - filesMissingBaseUrl.push(file); - } + expect( + content, + `${file} must assign window.location.href to import.meta.env.BASE_URL` + ).toMatch(/window\.location\.href\s*=\s*import\.meta\.env\.BASE_URL/); } - - expect( - filesMissingBaseUrl, - `The following files handle back-to-tools navigation without import.meta.env.BASE_URL: ${filesMissingBaseUrl.join( - ', ' - )}` - ).toEqual([]); }); - it('ensures HTML templates do not hardcode href="/" for brand links', () => { - const htmlFiles = fs - .readdirSync(pagesDir) - .filter((file) => file.endsWith('.html')) - .map((file) => path.join(pagesDir, file)); + it('ensures brand anchor in standalone templates asserts href="{{baseUrl}}"', () => { + const standaloneTemplates = [ + path.join(pagesDir, 'pdf-multi-tool.html'), + path.join(rootDir, 'simple-index.html'), + path.join(rootDir, 'src/partials/navbar-simple.html'), + ]; - const simpleIndex = path.join(rootDir, 'simple-index.html'); - if (fs.existsSync(simpleIndex)) { - htmlFiles.push(simpleIndex); - } + for (const filePath of standaloneTemplates) { + if (!fs.existsSync(filePath)) continue; - const offendingFiles: string[] = []; - - for (const filePath of htmlFiles) { const content = fs.readFileSync(filePath, 'utf-8'); + const brandAnchorMatch = content.match( + /]*href=["']([^"']*)["'][^>]*>[\s\S]*?(?:{{#if\s+brandName}}|BentoPDF)/i + ); - // Brand link / logo anchor should not be hardcoded to href="/" - // e.g. should be - if (/]*href=["']\/["'][^>]*>.*BentoPDF/i.test(content)) { - offendingFiles.push(path.basename(filePath)); - } + expect( + brandAnchorMatch, + `Could not locate brand anchor in ${path.basename(filePath)}` + ).not.toBeNull(); + + const href = brandAnchorMatch?.[1]; + expect( + href, + `Expected ${path.basename(filePath)} brand anchor href to be "{{baseUrl}}" but got "${href}"` + ).toBe('{{baseUrl}}'); } - - expect( - offendingFiles, - `The following HTML templates hardcode href="/" for the brand link: ${offendingFiles.join( - ', ' - )}` - ).toEqual([]); }); });