merge: 최신 로컬 main을 정보 화면 버튼 통일에 재통합

This commit is contained in:
2026-08-21 17:39:08 +00:00
19 changed files with 211 additions and 183 deletions
+9 -3
View File
@@ -299,12 +299,16 @@ test('resource auction preserves the legacy desktop structure, geometry, and int
const bidInput = page.getByRole('spinbutton', { name: '1번 경매 입찰가' });
await bidInput.fill('800');
await page.getByRole('button', { name: '입찰', exact: true }).click();
await expect(page.getByRole('alert')).toContainText('금이 부족합니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="error"]')).toContainText(
'금이 부족합니다.'
);
await page.screenshot({ path: 'test-results/auction/resource-desktop-error.png', fullPage: true });
expect(state.resourceBidCount).toBe(0);
await page.getByRole('button', { name: '입찰', exact: true }).click();
await expect(page.getByRole('status')).toContainText('입찰했습니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="success"]')).toContainText(
'입찰했습니다.'
);
expect(state.resourceBidCount).toBe(1);
await firstRow.hover();
@@ -370,7 +374,9 @@ test('unique auction separates ongoing and finished lists and auto-loads the leg
await dialog.accept();
});
await page.getByRole('button', { name: '입찰', exact: true }).click();
await expect(page.getByRole('status')).toContainText('입찰이 완료되었습니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="success"]')).toContainText(
'입찰이 완료되었습니다.'
);
expect(state.uniqueBidCount).toBe(1);
await page.screenshot({ path: 'test-results/auction/unique-desktop.png', fullPage: true });
});
+6 -2
View File
@@ -598,11 +598,15 @@ test('finance enforces edit permissions and preserves the old value across an AP
const input = page.getByRole('spinbutton', { name: '세율' });
await input.fill('25');
await page.locator('.policy-cell').filter({ hasText: '세율' }).getByRole('button', { name: '변경' }).click();
await expect(page.getByRole('alert')).toContainText('세율을 변경할 수 없습니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="error"]')).toContainText(
'세율을 변경할 수 없습니다.'
);
await expect(input).toHaveValue('20');
await input.fill('25');
await page.locator('.policy-cell').filter({ hasText: '세율' }).getByRole('button', { name: '변경' }).click();
await expect(page.getByRole('status')).toContainText('세율을 변경했습니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="success"]')).toContainText(
'세율을 변경했습니다.'
);
expect(state.rate).toBe(25);
const readOnly = await page.context().newPage();
+3 -1
View File
@@ -282,7 +282,9 @@ test('desktop geometry, typography, textures, drag, focus, tooltip, and successf
await goldInput.fill('12345');
page.once('dialog', (dialog) => dialog.accept());
await page.locator('#container > .control_bar').getByRole('button', { name: '설정' }).click();
await expect(page.getByRole('status')).toContainText('NPC 정책이 반영되었습니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="success"]')).toContainText(
'NPC 정책이 반영되었습니다.'
);
expect(state.mutations).toContain('npc.setNationPolicy');
await screenshot(page, 'core-npc-policy-desktop.png');
});
@@ -372,7 +372,9 @@ test('join refresh shows the assigned preliminary group immediately with accessi
await expect(page.getByLabel('토너먼트 대진표')).toHaveCount(0);
await join.click();
await expect(page.getByRole('status')).toHaveText('참가 신청이 반영되었습니다. 六조에 배정되었습니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="success"]')).toContainText(
'참가 신청이 반영되었습니다. 六조에 배정되었습니다.'
);
await expect(join).toBeDisabled();
const preliminaryTabs = page.getByRole('tablist', { name: '예선 조 선택' });
await expect(preliminaryTabs.getByRole('tab').nth(5)).toHaveAttribute('aria-selected', 'true');
@@ -413,7 +415,9 @@ test('desktop join scrolls the assigned preliminary group into view without futu
await expect(page.getByLabel('토너먼트 대진표')).toHaveCount(0);
await page.getByRole('button', { name: '참가' }).click();
await expect(page.getByRole('status')).toHaveText('참가 신청이 반영되었습니다. 八조에 배정되었습니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="success"]')).toContainText(
'참가 신청이 반영되었습니다. 八조에 배정되었습니다.'
);
const assignedGroup = page.locator('[data-preliminary-group="7"]');
await expect(assignedGroup.locator('.general-identity', { hasText: names[0] })).toBeVisible();
const bounds = await assignedGroup.boundingBox();
@@ -612,7 +616,9 @@ test('mobile betting rankings use tabs and keep dedicated icons beside general n
);
await dialog.getByRole('button', { name: '베팅 등록' }).click();
await expect(dialog).not.toBeVisible();
await expect(page.getByRole('status')).toHaveText('베팅이 등록되었습니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="success"]')).toContainText(
'베팅이 등록되었습니다.'
);
expect(placedBets).toEqual([{ targetId: 1, amount: 50 }]);
await expect(page.getByRole('tablist', { name: '토너먼트 랭킹 종목 선택' })).toBeVisible();
+12 -4
View File
@@ -387,12 +387,16 @@ test('shows API failure then creates a troop successfully', async ({ page }) =>
const input = page.getByRole('textbox', { name: '부대명' });
await input.fill('실패대');
await page.getByRole('button', { name: '부대 창설', exact: true }).click();
await expect(page.getByRole('alert')).toContainText('부대 이름이 없습니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="error"]')).toContainText(
'부대 이름이 없습니다.'
);
expect(state.me.troopId).toBe(0);
await input.fill('신규대');
await page.getByRole('button', { name: '부대 창설', exact: true }).click();
await expect(page.getByRole('status')).toContainText('신규대 부대가 생성되었습니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="success"]')).toContainText(
'신규대 부대가 생성되었습니다.'
);
await expect(page.locator('.troopInfo').filter({ hasText: '신규대' })).toBeVisible();
await expect(input).toBeHidden();
});
@@ -410,13 +414,17 @@ test('renames and kicks through confirm dialogs, then refreshes state', async ({
await page.getByRole('button', { name: '부대명 변경...' }).first().click();
await page.getByRole('textbox', { name: '새 부대명' }).fill('백마의종');
await page.getByRole('button', { name: '변경', exact: true }).click();
await expect(page.getByRole('status')).toContainText('부대명을 변경했습니다.');
await expect(page.locator('[data-testid="game-toast"][data-feedback-kind="success"]')).toContainText(
'부대명을 변경했습니다.'
);
await expect(page.locator('.troopInfo').filter({ hasText: '백마의종' })).toBeVisible();
await page.getByRole('button', { name: '부대원 추방...' }).click();
await page.getByRole('combobox', { name: '추방할 부대원' }).selectOption('3');
await page.getByRole('button', { name: '추방', exact: true }).click();
await expect(page.getByRole('status')).toContainText('조운을 추방했습니다.');
await expect(
page.locator('[data-testid="game-toast"][data-feedback-kind="success"]').filter({ hasText: '조운' })
).toContainText('조운을 추방했습니다.');
await expect(page.locator('.troopMembers').first()).not.toContainText('조운');
});