/** * build-label.spec.js * * Verifies that the {{BUILD_LABEL}} placeholder is correctly substituted in all * four tool dist and website files: * * - No placeholder text leaks through * - The .build-timestamp element is present and visible in the browser * - The label content is either a timestamp ("Built: 20...") or a version ("v...") * - website/ files (when present) always show the version format * * Note: dist/ files may show either format depending on whether the last build * was a dev build (timestamp) or a release build (version). Both are valid. */ import { test, expect } from '@playwright/test'; import * as path from 'path'; import * as fs from 'fs'; const tools = ['archive', 'transmittal', 'classifier', 'browse']; for (const tool of tools) { const distPath = path.resolve(`${tool}/dist/${tool}.html`); const websitePath = path.resolve(`website/${tool}.html`); test.describe(`${tool}: build-label`, () => { test(`dist file: no placeholder text leaks through`, async () => { const html = fs.readFileSync(distPath, 'utf8'); expect(html).not.toContain('{{BUILD_LABEL}}'); expect(html).not.toContain('{{BUILD_TIMESTAMP}}'); }); test(`dist file: .build-timestamp element is visible in browser`, async ({ page }) => { // browse may load Toast UI lazily; wait for full load. const waitUntil = tool === 'browse' ? 'load' : 'domcontentloaded'; await page.goto(`file://${distPath}`, { waitUntil }); const el = page.locator('.build-timestamp'); await expect(el).toBeVisible({ timeout: 10000 }); }); test(`dist file: label is a valid channel or version string`, async () => { const html = fs.readFileSync(distPath, 'utf8'); // Channel labels (alpha/beta) are wrapped in an inner ; // stable version labels are bare text. const match = html.match(/class="build-timestamp">(?:]*>)?([^<]+?)(?:<\/span>)? { if (!fs.existsSync(websitePath)) { test.skip(true, `website/${tool}.html not present — run sh ${tool}/build.sh --release first`); return; } const html = fs.readFileSync(websitePath, 'utf8'); expect(html).not.toContain('{{BUILD_LABEL}}'); expect(html).not.toContain('{{BUILD_TIMESTAMP}}'); expect(html).toMatch(/class="build-timestamp">(?:]*>)?v\d+\.\d+\.\d+( BETA)?(?:<\/span>)?