feat: 예약 오픈 일정을 빌드 전에 공개

초기화 예약의 공개 선택을 operation payload에 저장하고 로비에서 준비 단계별로 표시합니다. RESERVED 인계와 STOPPED 무요청 경계를 테스트합니다.
This commit is contained in:
2026-08-23 13:59:31 +00:00
parent 4b97088d69
commit 14ffa76c49
9 changed files with 645 additions and 26 deletions
@@ -604,6 +604,19 @@ test('separates branch and commit semantics and submits a reset from the dedicat
await page.getByTestId('reset-scheduled-at').fill('2030-08-13T09:30');
await page.getByTestId('reset-preopen-at').fill('2030-08-13T10:00');
await page.getByTestId('reset-open-at').fill('2030-08-13T11:00');
const publishSchedule = page.getByTestId('reset-publish-schedule');
await publishSchedule.check();
await page.getByTestId('reset-open-at').focus();
await page.keyboard.press('Tab');
await publishSchedule.focus();
await expect(publishSchedule).toBeFocused();
const publishFocusStyle = await publishSchedule.evaluate((element) => {
const style = getComputedStyle(element);
return { style: style.outlineStyle, width: Number.parseFloat(style.outlineWidth) };
});
expect(publishFocusStyle.style).not.toBe('none');
expect(publishFocusStyle.width).toBeGreaterThanOrEqual(2);
await expect(page.getByText('빌드는 초기화 시작 시각까지 대기합니다.')).toBeVisible();
const scheduledHelp = page.getByTestId('reset-help-scheduled-at');
await scheduledHelp.hover();
await expect(page.getByTestId('reset-help-scheduled-at-tooltip')).toContainText(
@@ -664,6 +677,7 @@ test('separates branch and commit semantics and submits a reset from the dedicat
expect(JSON.stringify(resetRequest?.body)).toContain('0123456789abcdef0123456789abcdef01234567');
expect(JSON.stringify(resetRequest?.body)).toContain('"scenarioId":5');
expect(JSON.stringify(resetRequest?.body)).toContain('"scheduledAt":"2030-08-13T00:30:00.000Z"');
expect(JSON.stringify(resetRequest?.body)).toContain('"publishSchedule":true');
expect(JSON.stringify(resetRequest?.body)).toContain('"preopenAt":"2030-08-13T01:00:00.000Z"');
expect(JSON.stringify(resetRequest?.body)).toContain('"openAt":"2030-08-13T02:00:00.000Z"');
await page.screenshot({ path: testInfo.outputPath('reset-operation-log-desktop.png'), fullPage: true });
@@ -681,6 +695,20 @@ test('separates branch and commit semantics and submits a reset from the dedicat
return children;
});
expect(mobileGeometry[0]!.width).toBeLessThanOrEqual(390);
const mobilePublishGeometry = await publishSchedule.evaluate((element) => {
const label = element.closest('label');
if (!label) throw new Error('expected publish schedule label');
const rect = label.getBoundingClientRect();
return {
left: rect.left,
right: rect.right,
documentWidth: document.documentElement.scrollWidth,
viewportWidth: window.innerWidth,
};
});
expect(mobilePublishGeometry.left).toBeGreaterThanOrEqual(0);
expect(mobilePublishGeometry.right).toBeLessThanOrEqual(mobilePublishGeometry.viewportWidth);
expect(mobilePublishGeometry.documentWidth).toBe(mobilePublishGeometry.viewportWidth);
const mobileTabs = await page
.getByTestId('server-profile-tabs')
.locator('a')