diff --git a/components/BuilderClientPage.robotsMeta.test.tsx b/components/BuilderClientPage.robotsMeta.test.tsx new file mode 100644 index 0000000..e851703 --- /dev/null +++ b/components/BuilderClientPage.robotsMeta.test.tsx @@ -0,0 +1,49 @@ +import { describe, it, expect, beforeEach } from 'vitest' +import { render, screen, fireEvent, waitFor } from '@testing-library/react' +import { NextIntlClientProvider } from 'next-intl' +import BuilderClientPage from '@/components/BuilderClientPage' + +declare global { + interface Window { __exportPreview?: () => { html: string } } +} + +describe('BuilderClientPage robots meta UI 연동', () => { + beforeEach(() => { + window.__exportPreview = undefined + }) + + it('기본값에서는 robots meta가 존재하지 않는다', async () => { + render( + + + + ) + // Hero 추가(렌더 내용 명확화) + const addHeroBtn = screen.getByTestId('btn-add-hero') + addHeroBtn.click() + + expect(typeof window.__exportPreview).toBe('function') + await waitFor(() => { + const out = window.__exportPreview!() + expect(out.html).not.toContain(' { + render( + + + + ) + const addHeroBtn = screen.getByTestId('btn-add-hero') + addHeroBtn.click() + + const robotsInput = screen.getByLabelText('Robots Meta') as HTMLInputElement + fireEvent.change(robotsInput, { target: { value: 'noindex, nofollow' } }) + + await waitFor(() => { + const out = window.__exportPreview!() + expect(out.html).toContain('('') const [manifestThemeColor, setManifestThemeColor] = useState('') const [robotsDisallow, setRobotsDisallow] = useState('') + const [robotsMeta, setRobotsMeta] = useState('') const [sheetsMode, setSheetsMode] = useState<'auto' | 'include' | 'exclude'>('auto') const [assetPathStrategy, setAssetPathStrategy] = useState<'flat' | 'grouped'>('flat') // Font optimization: allow toggling Google Fonts preconnect links in exported HTML @@ -197,7 +198,7 @@ export default function BuilderClientPage() { w.__exportPreview = () => { try { // Export preview with current optimization options - return exportPage(pageSchema.parse(pageData), { assetManager: buildEffectiveAm(), fontPreconnect, fontPreload, imageLoading, imageDecoding }) + return exportPage(pageSchema.parse(pageData), { assetManager: buildEffectiveAm(), fontPreconnect, fontPreload, imageLoading, imageDecoding, robotsMeta: robotsMeta.trim() || undefined }) } catch { const fixed: Page = { ...pageData, @@ -207,12 +208,12 @@ export default function BuilderClientPage() { spamProtection: pageData.form?.spamProtection ?? { honeypotFieldName: '_hp', minSubmitSeconds: 2 }, }, } - return exportPage(pageSchema.parse(fixed), { assetManager: buildEffectiveAm(), fontPreconnect, fontPreload, imageLoading, imageDecoding }) + return exportPage(pageSchema.parse(fixed), { assetManager: buildEffectiveAm(), fontPreconnect, fontPreload, imageLoading, imageDecoding, robotsMeta: robotsMeta.trim() || undefined }) } } } } catch {} - }, [pageData, am, fontPreconnect, fontPreload, imageLoading, imageDecoding, assetPathStrategy]) + }, [pageData, am, fontPreconnect, fontPreload, imageLoading, imageDecoding, robotsMeta, assetPathStrategy]) const doExport = useCallback(async () => { let valid = pageData as Page @@ -240,8 +241,8 @@ export default function BuilderClientPage() { } return clone } - // Respect font and image optimization toggles when exporting - const exported = exportPage(valid, { assetManager: buildEffectiveAm(), fontPreconnect, fontPreload, imageLoading, imageDecoding }) + // Respect font, image, robots meta optimization toggles when exporting + const exported = exportPage(valid, { assetManager: buildEffectiveAm(), fontPreconnect, fontPreload, imageLoading, imageDecoding, robotsMeta: robotsMeta.trim() || undefined }) try { if (typeof window !== 'undefined') { const w = window as unknown as { __captureExport?: boolean; __lastExport?: { html: string; css: string; js: string } } @@ -288,7 +289,7 @@ export default function BuilderClientPage() { } const zipBytes = await buildZip({ html: exported.html, css: exported.css, js: exported.js, assets, extras }) download('landing.zip', zipBytes) - }, [pageData, am, manifestName, manifestShortName, manifestStartUrl, manifestDisplay, manifestThemeColor, robotsDisallow, sheetsMode, fontPreconnect, fontPreload, imageLoading, imageDecoding, assetPathStrategy]) + }, [pageData, am, manifestName, manifestShortName, manifestStartUrl, manifestDisplay, manifestThemeColor, robotsDisallow, sheetsMode, fontPreconnect, fontPreload, imageLoading, imageDecoding, robotsMeta, assetPathStrategy]) return (
@@ -487,6 +488,17 @@ export default function BuilderClientPage() { placeholder="/private\n/tmp" /> +