diff --git a/index.html b/index.html index d24b2a88..414f5a71 100644 --- a/index.html +++ b/index.html @@ -32,6 +32,7 @@

ScopeWeave Planner

전체일수 0일 + 프로젝트의 작업 기간(일수) 합계입니다.
@@ -39,10 +40,12 @@

ScopeWeave Planner

계획진척률(누적) 0.00% + 기간(일수) 가중치가 반영된 프로젝트 전체 계획 진척률입니다.
실적진척률(누적) 0.00% + 기간(일수) 가중치가 반영된 프로젝트 전체 실적 진척률입니다.
브라우저 로컬 자동저장 사용 중 diff --git a/tests/e2e/meta-summary-accessibility.spec.js b/tests/e2e/meta-summary-accessibility.spec.js new file mode 100644 index 00000000..768e6d52 --- /dev/null +++ b/tests/e2e/meta-summary-accessibility.spec.js @@ -0,0 +1,38 @@ +import { test, expect } from '@playwright/test'; + +const summaryExplanations = [ + ['summary-total-days-help', '프로젝트의 작업 기간(일수) 합계입니다.'], + ['summary-planned-progress-help', '기간(일수) 가중치가 반영된 프로젝트 전체 계획 진척률입니다.'], + ['summary-actual-progress-help', '기간(일수) 가중치가 반영된 프로젝트 전체 실적 진척률입니다.'] +]; + +test.describe('summary metric explanations', () => { + test('keeps explanations visible without adding static cards to the Tab order', async ({ page }) => { + await page.goto('./'); + + const cards = page.locator('.meta-value-card'); + await expect(cards).toHaveCount(3); + for (let index = 0; index < 3; index += 1) { + await expect(cards.nth(index)).not.toHaveAttribute('tabindex'); + await expect(cards.nth(index)).not.toHaveAttribute('role', 'note'); + } + + for (const [id, text] of summaryExplanations) { + const explanation = page.locator(`#${id}`); + await expect(explanation).toBeVisible(); + await expect(explanation).toHaveText(text); + } + }); + + test('keeps the visible explanations inside the mobile viewport', async ({ page }) => { + await page.setViewportSize({ width: 375, height: 667 }); + await page.goto('./'); + + for (const [id] of summaryExplanations) { + await expect(page.locator(`#${id}`)).toBeVisible(); + } + + const overflow = await page.evaluate(() => document.documentElement.scrollWidth - document.documentElement.clientWidth); + expect(overflow).toBeLessThanOrEqual(1); + }); +});