fix: Gateway 화면에서 raw 프로필 ID 노출을 제거한다

불변 profileName은 라우팅과 저장 경계에 유지하고 사용자 출력은 공통 표시명을 사용한다. 기본 인스턴스 suffix를 숨기고 비기본 인스턴스만 사람이 읽을 수 있게 구분한다.
This commit is contained in:
2026-08-24 07:15:25 +00:00
parent 8837e49d62
commit d80ea1bd0e
19 changed files with 421 additions and 127 deletions
@@ -71,6 +71,7 @@ const profile = (runtimeRunning: boolean, resetDefaults?: Record<string, unknown
profileName: 'che:default',
profile: 'che',
instanceKey: 'default',
displayName: '천하서버',
currentScenario: '2',
scenario: '2',
apiPort: 15003,
@@ -200,6 +201,7 @@ const installFixture = async (page: Page, state: FixtureState) => {
profileName: 'che:default',
profile: 'che',
instanceKey: 'default',
displayName: '천하서버',
currentScenario: '2',
meta: { korName: '천하서버' },
},
@@ -639,7 +641,7 @@ test('separates branch and commit semantics and submits a reset from the dedicat
await expect(page.getByText('초기화 작업을 등록했습니다.').first()).toBeVisible();
await expect(page.getByTestId('operations-table')).toContainText('시나리오 초기화');
await expect(page.getByTestId('profile-operation-log-panel')).toBeVisible();
await expect(page.getByTestId('profile-operation-log')).toContainText('che:default 구성 요소를 빌드합니다.');
await expect(page.getByTestId('profile-operation-log')).toContainText('천하서버 구성 요소를 빌드합니다.');
await expect(page.getByTestId('profile-operation-log')).toContainText('시나리오 초기 데이터 생성을 완료했습니다.');
await expect(page.getByTestId('profile-operation-log-status')).toContainText('SUCCEEDED');
const operationTable = page.getByTestId('operations-table');
@@ -652,7 +654,8 @@ test('separates branch and commit semantics and submits a reset from the dedicat
await detailsToggle.click();
await expect(detailsToggle).toHaveAttribute('aria-expanded', 'true');
const operationDetail = operationTable.getByTestId('operation-detail');
await expect(operationDetail).toContainText('che:default');
await expect(operationDetail).toContainText('천하서버');
await expect(operationDetail).not.toContainText('che:default');
await expect(operationDetail).toContainText('0123456789abcdef0123456789abcdef01234567');
await expect(operationDetail).toContainText('admin');
const operationTableGeometry = await page.getByTestId('operations-table').evaluate((table) => {
@@ -807,7 +810,7 @@ test('separates DB-preserving profile deployment from DB reset', async ({ page }
await expect(page.getByText('DB 보존 배포 작업을 등록했습니다.').first()).toBeVisible();
await expect(page.getByTestId('operations-table')).toContainText('버전 업데이트');
await expect(page.getByTestId('profile-operation-log-panel')).toBeVisible();
await expect(page.getByTestId('profile-operation-log')).toContainText('che:default 구성 요소를 빌드합니다.');
await expect(page.getByTestId('profile-operation-log')).toContainText('천하서버 구성 요소를 빌드합니다.');
await expect(page.getByTestId('profile-operation-log')).toContainText('game-frontend build complete');
await expect(page.getByTestId('profile-operation-log-status')).toContainText('SUCCEEDED');
expect(state.requestBodies.some((entry) => entry.operation === 'admin.operations.requestDeploy')).toBe(true);
@@ -834,7 +837,7 @@ test('submits a separately authorized destructive game cancellation on desktop a
await page.goto('admin/servers/che%3Adefault/cancel');
await expect(page).toHaveURL(/\/gateway\/admin\/servers\/che%3Adefault\/cancel$/);
await expect(page.getByRole('heading', { name: 'che:default 게임 취소' })).toBeVisible();
await expect(page.getByRole('heading', { name: '천하서버 게임 취소' })).toBeVisible();
await expect(page.getByRole('link', { name: '게임 취소', exact: true })).toHaveAttribute('aria-current', 'page');
await expect(page.getByRole('link', { name: '시나리오 초기화', exact: true })).toHaveCount(0);
await expect(page.getByTestId('request-game-cancellation')).toBeDisabled();
@@ -843,7 +846,7 @@ test('submits a separately authorized destructive game cancellation on desktop a
await page.getByTestId('cancellation-general-mode').selectOption('RETAIN');
await page.getByTestId('cancellation-retention-percent').fill('35');
await page.getByTestId('cancellation-reason').fill('잘못된 시나리오로 개장함');
await page.getByTestId('cancellation-confirmation').fill('che:default');
await page.getByTestId('cancellation-confirmation').fill('천하서버 게임 취소');
const cancelButton = page.getByTestId('request-game-cancellation');
await expect(cancelButton).toBeEnabled();
await cancelButton.hover();
@@ -1348,10 +1351,11 @@ test('renders the stable server identity without exposing the default suffix as
const navigation = page.getByRole('navigation', { name: '관리자 메뉴' });
const profileLink = navigation.getByRole('link', { name: '천하서버' });
await expect(profileLink).toBeVisible({ timeout: 900 });
await expect(profileLink).toHaveAttribute('title', '서버 ID: che:default');
await expect(profileLink).toHaveAttribute('title', '천하서버 서버 관리');
await expect(navigation).not.toContainText('천하서버 (che:default)');
await expect(navigation.getByRole('link', { name: 'Gateway 릴리스' })).toBeVisible({ timeout: 900 });
await expect(page.getByText('서버 ID: che:default · 인스턴스: default')).toBeVisible();
await expect(page.getByText('서버 ID: che:default · 인스턴스: default')).toHaveCount(0);
await expect(page.getByText('천하서버', { exact: true })).toBeVisible();
await expect(page.getByText('현재 시나리오: 2')).toBeVisible();
await profileLink.focus();
const desktop = await profileLink.evaluate((element) => {