merge: 최신 main을 메인 시계 상태 변경에 반영한다
This commit is contained in:
@@ -115,6 +115,13 @@ for (const viewport of [
|
||||
await expect(lines.nth(1)).toContainText('<span class="name" onclick=');
|
||||
expect(await page.evaluate(() => (globalThis as Record<string, unknown>).__legacyLogXss)).toBeUndefined();
|
||||
|
||||
const pageFontFamily = await page.locator('body').evaluate((element) => getComputedStyle(element).fontFamily);
|
||||
const historyFontFamily = await page
|
||||
.locator('.status-history')
|
||||
.evaluate((element) => getComputedStyle(element).fontFamily);
|
||||
expect(historyFontFamily).toBe(pageFontFamily);
|
||||
expect(historyFontFamily).toContain('Pretendard');
|
||||
|
||||
const geometry = await lines.evaluateAll((elements) =>
|
||||
elements.map((element) => {
|
||||
const rect = element.getBoundingClientRect();
|
||||
@@ -144,7 +151,7 @@ for (const viewport of [
|
||||
const name = `legacy-log-gateway-${viewport.name}`;
|
||||
await writeFile(
|
||||
resolve(artifactRoot, `${name}.json`),
|
||||
`${JSON.stringify({ viewport, geometry }, null, 2)}\n`,
|
||||
`${JSON.stringify({ viewport, pageFontFamily, historyFontFamily, geometry }, null, 2)}\n`,
|
||||
'utf8'
|
||||
);
|
||||
await page.screenshot({ path: resolve(artifactRoot, `${name}.png`), fullPage: true });
|
||||
|
||||
@@ -362,7 +362,7 @@ const handlePasswordReset = async (): Promise<void> => {
|
||||
border-top: 1px solid #444;
|
||||
padding: 8px 12px;
|
||||
color: #ddd;
|
||||
font-family: 'Times New Roman', serif;
|
||||
font-family: inherit;
|
||||
font-size: 14px;
|
||||
line-height: 1.35;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import { readFile, readdir } from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
import { describe, it } from 'node:test';
|
||||
|
||||
const sourceRoot = path.resolve(import.meta.dirname, '../src');
|
||||
const fontFamilyDeclaration = /font-family\s*:\s*([^;]+);/g;
|
||||
const fontShorthandDeclaration = /(?:^|[\s{])font\s*:\s*([^;]+);/gm;
|
||||
const forcedSerifFamily = /Times New Roman|(?<![\w-])serif(?![\w-])/i;
|
||||
|
||||
const listStyleSources = async () => {
|
||||
const entries = await readdir(sourceRoot, { recursive: true, withFileTypes: true });
|
||||
|
||||
return entries
|
||||
.filter((entry) => entry.isFile() && (entry.name.endsWith('.css') || entry.name.endsWith('.vue')))
|
||||
.map((entry) => path.join(entry.parentPath, entry.name))
|
||||
.sort();
|
||||
};
|
||||
|
||||
describe('gateway content font contract', () => {
|
||||
it('does not force Times New Roman or a generic serif family', async () => {
|
||||
const violations = [];
|
||||
|
||||
for (const file of await listStyleSources()) {
|
||||
const source = await readFile(file, 'utf8');
|
||||
for (const match of source.matchAll(fontFamilyDeclaration)) {
|
||||
const value = match[1]?.trim() ?? '';
|
||||
if (forcedSerifFamily.test(value)) {
|
||||
violations.push(`${path.relative(sourceRoot, file)}: font-family: ${value}`);
|
||||
}
|
||||
}
|
||||
|
||||
for (const match of source.matchAll(fontShorthandDeclaration)) {
|
||||
const value = match[1]?.trim() ?? '';
|
||||
if (forcedSerifFamily.test(value)) {
|
||||
violations.push(`${path.relative(sourceRoot, file)}: font: ${value}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assert.deepEqual(violations, []);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user