import { describe, it, expect } from 'vitest'; import { resolveFaviconBase } from '../../utils/favicon-base'; /** * Regression test for the sub-path deployment 404 bug. * * Bug (filed by user, 2026-08-01): deployments at sub-paths * (e.g. `/cie-eilv/`) saw console 404s for `favicon-32x32.png`, * `favicon-16x16.png`, `favicon-48x48.png` because the emitted * `` pointed at the ROOT (`/favicon-32x32.png`) instead * of the deployment sub-path (`/cie-eilv/favicon-32x32.png`). * * Root cause: `Default.astro` hardcoded `const faviconBase = '/'`. * Fix: cascade through configuration sources to find the right prefix. */ describe('resolveFaviconBase', () => { it('returns / when nothing is configured (root deployment)', () => { expect(resolveFaviconBase({})).toBe('/'); }); it('returns / when all candidates are empty', () => { expect(resolveFaviconBase({ brandingFaviconBasePath: '', siteConfigBasePath: '', astroBaseUrl: '', })).toBe('/'); }); it('uses branding.favicon.base_path when set (highest priority)', () => { expect(resolveFaviconBase({ brandingFaviconBasePath: '/my-brand/', siteConfigBasePath: '/should-be-ignored/', astroBaseUrl: '/should-be-ignored/', })).toBe('/my-brand/'); }); it('uses siteConfig.basePath when branding.favicon.base_path is absent', () => { expect(resolveFaviconBase({ siteConfigBasePath: '/cie-eilv/', astroBaseUrl: '/', })).toBe('/cie-eilv/'); }); it('uses import.meta.env.BASE_URL when siteConfig.basePath is absent', () => { expect(resolveFaviconBase({ astroBaseUrl: '/vocab/', })).toBe('/vocab/'); }); /** * THE LOAD-BEARING REGRESSION TEST. * * Reproduction of the bug: cie-eilv is deployed at /cie-eilv/, but * the live site emitted . The fix * must produce /cie-eilv/favicon-32x32.png. */ it('regression: resolves /cie-eilv/ when that is the configured basePath', () => { const base = resolveFaviconBase({ siteConfigBasePath: '/cie-eilv/', astroBaseUrl: '/', }); expect(base).toBe('/cie-eilv/'); // Pin the full URL construction so a future regression that breaks // the trailing slash also fails this test. expect(`${base}favicon-32x32.png`).toBe('/cie-eilv/favicon-32x32.png'); expect(`${base}favicon-16x16.png`).toBe('/cie-eilv/favicon-16x16.png'); expect(`${base}favicon-48x48.png`).toBe('/cie-eilv/favicon-48x48.png'); }); it('appends trailing slash if consumer omitted it', () => { expect(resolveFaviconBase({ siteConfigBasePath: '/cie-eilv', // no trailing slash })).toBe('/cie-eilv/'); }); it('does not double-slash if consumer includes trailing slash', () => { expect(resolveFaviconBase({ siteConfigBasePath: '/cie-eilv/', })).toBe('/cie-eilv/'); }); it('handles deep sub-path deployments', () => { expect(resolveFaviconBase({ siteConfigBasePath: '/vocab/iala/', })).toBe('/vocab/iala/'); expect(`${resolveFaviconBase({ siteConfigBasePath: '/vocab/iala/' })}favicon.ico`) .toBe('/vocab/iala/favicon.ico'); }); });