Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
f541e53
feat(landing): 랜딩페이지 v2
jiji-hoon96 Apr 15, 2026
18c114e
feat(landing): 랜딩페이지 v2
jiji-hoon96 Apr 15, 2026
89dc8c5
Merge pull request #417 from Nexters/feature/landing-v2
jiji-hoon96 Apr 15, 2026
cc2cb06
feat(landing): QA 1차 반영
jiji-hoon96 Apr 24, 2026
d03b8af
Merge pull request #418 from jiji-hoon96/qa/admin-2
jiji-hoon96 Apr 24, 2026
4773697
feat(landing): QA 2차 반영
jiji-hoon96 Apr 28, 2026
07a0c89
Merge pull request #419 from jiji-hoon96/qa/admin-3
jiji-hoon96 Apr 28, 2026
23e08d7
fix(landing): Problem 타이틀 모든 해상도에서 3줄로 표시
jiji-hoon96 Apr 28, 2026
7a7f24c
feat(landing): Hero 타이틀 진입 애니메이션 추가
jiji-hoon96 Apr 28, 2026
032a4e9
Merge pull request #420 from jiji-hoon96/qa/admin-3
jiji-hoon96 Apr 28, 2026
138133c
chore(admin): vitest 설치
hexdrinker May 1, 2026
d750894
feat(admin): util 함수 테스트 코드 추가
hexdrinker May 1, 2026
a5fbc7d
chore(admin): jsdom 설치
hexdrinker May 1, 2026
30237bb
feat(admin): jsdom을 이용한 util 유닛테스트 추가
hexdrinker May 1, 2026
93d8235
chore(admin): testing-library 패키지 설치
hexdrinker May 2, 2026
6055f50
feat(admin): 유틸 함수 사용처의 통합테스트 추가
hexdrinker May 2, 2026
e42e81f
Merge pull request #421 from Nexters/feat/admin-util-tests-from-develop
hexdrinker May 2, 2026
95f45d7
feat(admin): hook 관련 유닛 테스트 추가
hexdrinker May 2, 2026
adcfb8e
feat(admin): hook 관련 유닛 테스트 추가
hexdrinker May 2, 2026
a56628b
feat(admin): useShareBannerVisibility 통합 테스트 추가
hexdrinker May 2, 2026
68c9c31
fix(admin): usePopupDialog 테스트 파일 안쓰는 코드 제거
hexdrinker May 2, 2026
704a94c
Merge pull request #422 from Nexters/feat/hook-test
hexdrinker May 2, 2026
09ad0fc
fix(landing): QA 3차 반영
jiji-hoon96 May 2, 2026
369b3ab
Merge branch 'develop' of github.com:Nexters/boolti-web into develop
jiji-hoon96 May 2, 2026
8af7c1e
fix(landing): QA 3차 반영
jiji-hoon96 May 2, 2026
c2c84a1
chore: trigger deploy for QA 3차 반영
jiji-hoon96 May 2, 2026
f00b0be
Merge pull request #423 from Nexters/qa/admin-3-deploy
jiji-hoon96 May 2, 2026
e6f17f3
chore(admin): playwright 설치 및 세팅
hexdrinker May 4, 2026
d0ea528
chore(admin): msw 설치
hexdrinker May 4, 2026
ee0d084
chore(admin): msw 설정
hexdrinker May 4, 2026
05c26c8
feat(admin): 홈 화면에서 usePopupDialog 통합 테스트 구현
hexdrinker May 4, 2026
1fbd803
feat(admin): 사전 질문 탭 전환 통합 테스트 구현
hexdrinker May 4, 2026
ab3fdd6
feat(admin): 랜딩 페이지에서 usePopupDialog 통합 테스트 구현
hexdrinker May 4, 2026
e8ec608
feat(admin): 인증 상태 별 라우팅 e2e 테스트 구현
hexdrinker May 4, 2026
063ab5f
feat(admin): 사전 질문 응답 확인 탭 플로우 e2e 테스트 구현
hexdrinker May 4, 2026
d6f3513
feat(admin): 정산 요청 버튼 활성 및 플로우 e2e 테스트 구현
hexdrinker May 4, 2026
661cb67
feat(admin): 라우팅 관련 e2e 테스트 축소
hexdrinker May 4, 2026
73ddf19
feat(admin): 라우팅 분기 통합 테스트로 이관
hexdrinker May 4, 2026
b6d695f
fix(admin): 테스트 용이하도록 PrivateRoute 파일 분리
hexdrinker May 4, 2026
e9bae81
Merge pull request #424 from Nexters/feat/playwright-test
hexdrinker May 4, 2026
255bc6e
feat(admin): 카카오 지도 연결 로직 구현
jiji-hoon96 May 9, 2026
f520433
feat(admin): react daum 로직 제거
jiji-hoon96 May 10, 2026
bbf0585
포스터 우선 로딩 개선
hexdrinker May 11, 2026
72c4e7f
폰트 로딩 개선
hexdrinker May 11, 2026
98e2b51
부가 기능 지연 로딩
hexdrinker May 11, 2026
adbdd5e
지도 로딩 지연
hexdrinker May 11, 2026
7e173d9
포스터 이미지 후보 추가
hexdrinker May 11, 2026
9b2a2c8
Merge pull request #425 from Nexters/fix/optimize-preview
hexdrinker May 11, 2026
b82e9fe
feat(admin): 공연장 검색 UX 및 폼 검증 보강
jiji-hoon96 May 18, 2026
82e0462
Merge pull request #426 from Nexters/feat/venue-search-integration
jiji-hoon96 May 19, 2026
fad39a8
fix(landing): QA 4차 반영
jiji-hoon96 May 26, 2026
299ac9e
Merge pull request #427 from Nexters/feature/landing-qa
jiji-hoon96 May 26, 2026
05b2b4d
fix(landing): QA 최종 반영
jiji-hoon96 May 27, 2026
25528b9
Merge pull request #428 from Nexters/feature/landing-qa-2
jiji-hoon96 May 27, 2026
a4e57cf
feat(image): 랜딩 이미지 변경
jiji-hoon96 Jun 5, 2026
c5d0d19
Merge pull request #429 from Nexters/feature/landing-image
jiji-hoon96 Jun 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,6 @@ server/dist
public/dist

install-state.gz

.mcp.json
settings.local.json
1,872 changes: 1,834 additions & 38 deletions .pnp.cjs

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions apps/admin/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ dist-ssr
*.njsproj
*.sln
*.sw?
.last-run.json
21 changes: 21 additions & 0 deletions apps/admin/e2e/functional/auth-routing.e2e.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { expect, test } from '@playwright/test';

import { prepareE2EContext } from '../helpers/msw';

test.describe('Auth routing guard', () => {
test.beforeEach(async ({ page }) => {
await prepareE2EContext(page);
});

test('비로그인 + 일반 브라우저는 /home 접근 시 /login으로 이동한다', async ({ page }) => {
await page.addInitScript(() => {
localStorage.removeItem('accessToken');
localStorage.removeItem('refreshToken');
});

await page.goto('/home');
await expect(page).toHaveURL(/\/login$/);
await expect(page.getByRole('heading', { name: '로그인' })).toBeVisible();
await expect(page.getByRole('button', { name: '카카오톡으로 시작하기' })).toBeVisible();
});
});
37 changes: 37 additions & 0 deletions apps/admin/e2e/functional/prequestion-response-flow.e2e.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { expect, test } from '@playwright/test';

import { prepareE2EContext } from '../helpers/msw';

test.describe('Pre-question response flow', () => {
test.beforeEach(async ({ page }) => {
await prepareE2EContext(page);
await page.addInitScript(() => {
localStorage.setItem('accessToken', 'access-token');
localStorage.setItem('refreshToken', 'refresh-token');
});
});

test('응답 확인 탭에서 참여자별 응답/검색 플로우가 동작한다', async ({ page }) => {
await page.goto('/show/1/pre-question');
await expect(page.getByText('응답 확인')).toBeVisible();

await page.getByText('응답 확인').click();
await page.getByRole('button', { name: '참여자별 응답' }).click();

await expect(page.getByText('홍길동', { exact: true })).toBeVisible();
await page.getByPlaceholder('참여자명 검색').fill('홍길동');
await page.waitForTimeout(400);
await expect(page.getByText('홍길동', { exact: true })).toBeVisible();
});

test('검색 결과가 없으면 빈 상태 메시지가 노출된다', async ({ page }) => {
await page.goto('/show/1/pre-question');
await page.getByText('응답 확인').click();
await page.getByRole('button', { name: '참여자별 응답' }).click();

await page.getByPlaceholder('참여자명 검색').fill('없는이름');
await page.waitForTimeout(400);

await expect(page.getByText('검색 결과가 없어요.')).toBeVisible();
});
});
36 changes: 36 additions & 0 deletions apps/admin/e2e/functional/settlement-request-flow.e2e.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { expect, test } from '@playwright/test';

import { prepareE2EContext } from '../helpers/msw';

test.describe('Settlement request flow', () => {
test.beforeEach(async ({ page }) => {
await prepareE2EContext(page);
await page.addInitScript(() => {
localStorage.setItem('accessToken', 'access-token');
localStorage.setItem('refreshToken', 'refresh-token');
});
});

test('동의 체크 전 비활성, 체크 후 활성화되고 요청이 전송된다', async ({ page }) => {
await page.goto('/show/1/settlement');
const submitButton = page.getByRole('button', { name: '정산 요청하기' });
await expect(submitButton).toBeDisabled();

await page.getByText('정산 내역 및 안내사항을 모두 확인하였으며 정산을 요청합니다.').click();
await expect(submitButton).toBeEnabled();
await submitButton.click();

await expect(page.getByText('정산을 요청했습니다')).toBeVisible();
});

test('요청 실패 시 에러 토스트가 노출된다', async ({ page }) => {
await page.goto('/show/1/settlement');
await page.evaluate(() => {
localStorage.setItem('__E2E_SCENARIO__', 'settlement-request-fail');
});
await page.getByText('정산 내역 및 안내사항을 모두 확인하였으며 정산을 요청합니다.').click();
await page.getByRole('button', { name: '정산 요청하기' }).click();

await expect(page.getByText('정산 요청에 실패했습니다. 잠시 후에 다시 시도해주세요.')).toBeVisible();
});
});
12 changes: 12 additions & 0 deletions apps/admin/e2e/helpers/msw.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import type { Page } from '@playwright/test';

export const prepareE2EContext = async (page: Page, scenario: string = 'default') => {
await page.addInitScript((currentScenario) => {
(window as Window & { __ENABLE_E2E_MSW__?: boolean }).__ENABLE_E2E_MSW__ = true;
localStorage.setItem('__E2E_SCENARIO__', currentScenario);
}, scenario);

await page.goto('/');
await page.waitForFunction(() => window.__E2E_MSW_READY__ === true, null, { timeout: 5000 });
await page.reload();
};
20 changes: 17 additions & 3 deletions apps/admin/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives",
"lint:fix": "TIMING=1 eslint . --ext ts,tsx --fix",
"type-check": "tsc --noEmit",
"preview": "vite preview"
"preview": "vite preview",
"test": "vitest run",
"test:watch": "vitest",
"test:e2e:functional": "playwright test -c playwright.config.ts",
"test:e2e:ui": "playwright test -c playwright.config.ts --ui"
},
"dependencies": {
"@boolti/api": "*",
Expand All @@ -35,7 +39,6 @@
"qrcode.react": "^3.1.0",
"quill": "2.0.3",
"react": "^18.2.0",
"react-daum-postcode": "^3.1.3",
"react-dom": "^18.2.0",
"react-dropzone": "^14.2.3",
"react-error-boundary": "^4.1.2",
Expand All @@ -54,12 +57,23 @@
"@boolti/eslint-config": "*",
"@boolti/typescript-config": "*",
"@emotion/babel-plugin": "^11.11.0",
"@playwright/test": "^1.54.1",
"@testing-library/dom": "^10.4.0",
"@testing-library/react": "^16.0.1",
"@types/js-cookie": "^3.0.6",
"@types/navermaps": "^3.7.9",
"@types/react": "^18.2.43",
"@types/react-dom": "^18.2.17",
"@vitejs/plugin-react": "^4.2.1",
"jsdom": "^26.1.0",
"msw": "^2.14.2",
"typescript": "^5.2.2",
"vite": "^5.0.8"
"vite": "^5.0.8",
"vitest": "^2.1.9"
},
"msw": {
"workerDirectory": [
"public"
]
}
}
26 changes: 26 additions & 0 deletions apps/admin/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
testDir: './e2e/functional',
timeout: 30_000,
use: {
baseURL: 'http://127.0.0.1:4173',
trace: 'retain-on-failure',
screenshot: 'only-on-failure',
},
webServer: {
command: 'VITE_E2E_MSW=true VITE_BASE_API_URL=http://127.0.0.1:4173/ yarn workspace admin dev --host 127.0.0.1 --port 4173',
url: 'http://127.0.0.1:4173',
reuseExistingServer: true,
timeout: 120_000,
},
projects: [
{
name: 'desktop',
use: {
...devices['Desktop Chrome'],
viewport: { width: 1280, height: 800 },
},
},
],
});
Loading
Loading