From 26663683c859a7e5e8f5b38c6b7f2f5101d71efa Mon Sep 17 00:00:00 2001 From: ohinhyuk <8156217@naver.com> Date: Wed, 22 Oct 2025 00:54:11 +0900 Subject: [PATCH 01/10] =?UTF-8?q?chore:=20e2e=20test=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- {tests => e2e-tests}/auth.setup.ts | 0 {tests => e2e-tests}/reports/report.member.spec.ts | 2 +- playwright.config.ts | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename {tests => e2e-tests}/auth.setup.ts (100%) rename {tests => e2e-tests}/reports/report.member.spec.ts (99%) diff --git a/.gitignore b/.gitignore index cc4df33..a23d889 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,4 @@ node_modules/ playwright/.auth -tests/auth/ \ No newline at end of file +e2e-tests/auth/ \ No newline at end of file diff --git a/tests/auth.setup.ts b/e2e-tests/auth.setup.ts similarity index 100% rename from tests/auth.setup.ts rename to e2e-tests/auth.setup.ts diff --git a/tests/reports/report.member.spec.ts b/e2e-tests/reports/report.member.spec.ts similarity index 99% rename from tests/reports/report.member.spec.ts rename to e2e-tests/reports/report.member.spec.ts index 8937ad5..ac0e43a 100644 --- a/tests/reports/report.member.spec.ts +++ b/e2e-tests/reports/report.member.spec.ts @@ -28,7 +28,7 @@ export function formatMinutesToHoursAndMinutes(totalMinutes: string | number): s return `${hours}시간 ${remainingMinutes}분`; } -test.use({ storageState: 'tests/auth/member.json' }); +test.use({ storageState: 'e2e-tests/auth/member.json' }); test.describe('스터디원 리포트 테스트', () => { // 업로드한 이미지와 실제 올라간 이미지를 구분 못하는 이슈 존재 diff --git a/playwright.config.ts b/playwright.config.ts index 73da6df..32295ca 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -17,7 +17,7 @@ if (!isCI) { * See https://playwright.dev/docs/test-configuration. */ export default defineConfig({ - testDir: './tests', + testDir: './e2e-tests', /* Run tests in files in parallel */ fullyParallel: true, /* Fail the build on CI if you accidentally left test.only in the source code. */ From 899b88edb0ac83e214f23bbedd0e71e423c171c6 Mon Sep 17 00:00:00 2001 From: ohinhyuk <8156217@naver.com> Date: Wed, 22 Oct 2025 00:55:44 +0900 Subject: [PATCH 02/10] =?UTF-8?q?refactor:=20=EC=97=91=EC=85=80=20?= =?UTF-8?q?=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=ED=95=B8=EB=93=A4?= =?UTF-8?q?=EB=9F=AC=20=ED=95=A8=EC=88=98=20(handle=20Excel=20Download)=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81=201)=20=EC=97=91=EC=85=80?= =?UTF-8?q?=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20e2e=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1=202)=20sheetData=20?= =?UTF-8?q?=EC=A7=80=EC=97=AD=20=EB=B3=80=EC=88=98=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?-=20buildSheetData=20=ED=95=A8=EC=88=98=EB=A1=9C=20=EC=B6=94?= =?UTF-8?q?=EC=B6=9C=203)=20wb,=20ws=20=EC=A7=80=EC=97=AD=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=A0=9C=EA=B1=B0=20-=20workbook=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=ED=95=A8=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EC=B6=9C=20-=20=ED=95=A8=EC=88=98=20=EC=9D=B8=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EC=A0=81=EC=9A=A9=204)=20excelDownload=20=EA=B5=AC?= =?UTF-8?q?=EC=B2=B4=EC=A0=81=20=ED=95=A8=EC=88=98=EB=AA=85=20=EC=A7=80?= =?UTF-8?q?=EC=A0=95=205)=20=EA=B3=B5=EC=9A=A9=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- e2e-tests/excel/excel.download.spec.ts | 32 ++++++++++++++++++++++++++ src/pages/Admin/ManageStudent/Page.tsx | 16 ++++++------- src/pages/Admin/ManageStudy/Page.tsx | 24 +++++++++---------- src/utils/excel.ts | 15 ++++++++++++ 4 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 e2e-tests/excel/excel.download.spec.ts create mode 100644 src/utils/excel.ts diff --git a/e2e-tests/excel/excel.download.spec.ts b/e2e-tests/excel/excel.download.spec.ts new file mode 100644 index 0000000..30b2f8c --- /dev/null +++ b/e2e-tests/excel/excel.download.spec.ts @@ -0,0 +1,32 @@ +import test, { expect } from '@playwright/test'; + +test.use({ storageState: 'e2e-tests/auth/admin.json' }); + +test.describe('엑셀 다운로드 테스트', () => { + test('스터디 관리 페이지 (manage-study) 엑셀 다운로드 테스트', async ({ page }) => { + await page.goto('http://localhost:3000/admin/manage-study'); + + const downloadPromise = page.waitForEvent('download'); + await page.getByRole('button', { name: '그룹 활동 목록 엑셀 다운' }).click(); + + const download = await downloadPromise; + + expect(download.suggestedFilename()).toBe('스터디그룹활동.xlsx'); + + const failure = await download.failure(); + expect(failure).toBeNull(); + }); + + test('스터디 신청자 목록 페이지 (manage-student) 엑셀 다운로드 테스트', async ({ page }) => { + await page.goto('http://localhost:3000/admin/manage-student'); + const downloadPromise = page.waitForEvent('download'); + + await page.getByRole('button', { name: '신청자 목록 다운로드' }).click(); + const download = await downloadPromise; + + expect(download.suggestedFilename()).toBe('스터디신청자목록.xlsx'); + + const failure = await download.failure(); + expect(failure).toBeNull(); + }); +}); diff --git a/src/pages/Admin/ManageStudent/Page.tsx b/src/pages/Admin/ManageStudent/Page.tsx index 1dd7041..717feb7 100644 --- a/src/pages/Admin/ManageStudent/Page.tsx +++ b/src/pages/Admin/ManageStudent/Page.tsx @@ -9,6 +9,7 @@ import { useQuery } from 'react-query'; import { StudyApplyUser } from '@/interface/user'; import SpinnerLoading from '@/components/SpinnerLoading'; import { toast } from 'sonner'; +import { buildWorkBook, downloadExcel } from '@/utils/excel'; // Helper function to clean course names const cleanCourseName = (name: string) => name.replace(/\n/g, ' '); @@ -86,8 +87,13 @@ export default function ManageStudentPage() { }, [applicants, searchTerm]); const handleExcelDownload = () => { - if (applicants) { - const sheetData = applicants.map((student) => ({ + const sheetData = buildApplicantsSheetData(); + downloadExcel(buildWorkBook(sheetData), '스터디신청자목록.xlsx'); + + function buildApplicantsSheetData() { + if (!applicants) return []; + + return applicants.map((student) => ({ ID: student.id, Name: student.name, StudentId: student.sid, @@ -96,12 +102,6 @@ export default function ManageStudentPage() { Courses: student.courses.map((subject) => subject.name + `(${subject.prof})`).join(', '), Friends: student.friends.map((friend) => friend.name).join(', '), })); - - const ws = xlsx.utils.json_to_sheet([...sheetData]); - const wb = xlsx.utils.book_new(); - xlsx.utils.book_append_sheet(wb, ws, 'Sheet1'); - - xlsx.writeFile(wb, '스터디신청자목록.xlsx'); } }; diff --git a/src/pages/Admin/ManageStudy/Page.tsx b/src/pages/Admin/ManageStudy/Page.tsx index f13a890..6b65a3b 100644 --- a/src/pages/Admin/ManageStudy/Page.tsx +++ b/src/pages/Admin/ManageStudy/Page.tsx @@ -1,4 +1,3 @@ -import * as xlsx from 'xlsx'; import * as React from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; @@ -6,6 +5,7 @@ import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '@ import { Badge } from '@/components/ui/badge'; import { SearchIcon, DownloadIcon, EyeIcon } from 'lucide-react'; import { readAllGroups } from '@/apis/manager'; +import { buildWorkBook, downloadExcel } from '@/utils/excel'; import { useQuery } from 'react-query'; import SpinnerLoading from '@/components/SpinnerLoading'; import { Link } from 'react-router-dom'; @@ -33,9 +33,14 @@ export default function ManageStudyPage() { }, [activities, searchTerm]); const handleExcelDownload = () => { - if (activities) { - const sheetData = activities.flatMap((group) => - group.members.map((member) => ({ + const sheetData = buildStudySheetData(); + downloadExcel(buildWorkBook(sheetData), '스터디그룹활동.xlsx'); + + function buildStudySheetData() { + if (!activities) return []; + + return activities.flatMap((group) => { + const sheetRow = group.members.map((member) => ({ Group: group.group, MemberID: member.id, MemberName: member.name, @@ -44,15 +49,10 @@ export default function ManageStudyPage() { Subjects: member.courses.map((subject) => subject.name).join(', '), Reports: group.reports, Times: group.times, - })), - ); - const ws = xlsx.utils.json_to_sheet([...sheetData]); - const wb = xlsx.utils.book_new(); - xlsx.utils.book_append_sheet(wb, ws, 'Sheet1'); + })); - xlsx.writeFile(wb, '스터디그룹활동.xlsx'); - } else { - console.log('데이터가 비어있습니다.'); + return sheetRow; + }); } }; diff --git a/src/utils/excel.ts b/src/utils/excel.ts new file mode 100644 index 0000000..b91c57a --- /dev/null +++ b/src/utils/excel.ts @@ -0,0 +1,15 @@ +import * as xlsx from 'xlsx'; + +export function buildWorkBook(sheetData: T[]) { + const wb = xlsx.utils.book_new(); + + const ws = xlsx.utils.json_to_sheet(sheetData); + + xlsx.utils.book_append_sheet(wb, ws); + + return wb; +} + +export function downloadExcel(data: xlsx.WorkBook, filename: string) { + xlsx.writeFile(data, filename); +} From 90ad3a6d4efb2999854264c7efc817aaa9412009 Mon Sep 17 00:00:00 2001 From: ohinhyuk <8156217@naver.com> Date: Wed, 22 Oct 2025 20:44:48 +0900 Subject: [PATCH 03/10] =?UTF-8?q?refactor:=20=EC=97=91=EC=85=80=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- e2e-tests/excel/{excel.download.spec.ts => excelDownload.spec.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename e2e-tests/excel/{excel.download.spec.ts => excelDownload.spec.ts} (100%) diff --git a/e2e-tests/excel/excel.download.spec.ts b/e2e-tests/excel/excelDownload.spec.ts similarity index 100% rename from e2e-tests/excel/excel.download.spec.ts rename to e2e-tests/excel/excelDownload.spec.ts From 7a35d50079005e4a752372347c6b4a72d434da35 Mon Sep 17 00:00:00 2001 From: ohinhyuk <8156217@naver.com> Date: Wed, 22 Oct 2025 20:46:34 +0900 Subject: [PATCH 04/10] =?UTF-8?q?refactor:=20=EC=97=91=EC=85=80=20?= =?UTF-8?q?=EC=9C=A0=ED=8B=B8=20buildWorkBook=20=EB=82=B4=EC=9D=98=20?= =?UTF-8?q?=EC=A7=80=EC=97=AD=EB=B3=80=EC=88=98=EB=AA=85=20=EA=B5=AC?= =?UTF-8?q?=EC=B2=B4=ED=99=94=20-=20wb=20->=20workBook=20-=20ws=20->=20wor?= =?UTF-8?q?kSheet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/excel.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/utils/excel.ts b/src/utils/excel.ts index b91c57a..01ae7bb 100644 --- a/src/utils/excel.ts +++ b/src/utils/excel.ts @@ -1,13 +1,12 @@ import * as xlsx from 'xlsx'; export function buildWorkBook(sheetData: T[]) { - const wb = xlsx.utils.book_new(); + const workBook = xlsx.utils.book_new(); + const workSheet = xlsx.utils.json_to_sheet(sheetData); - const ws = xlsx.utils.json_to_sheet(sheetData); + xlsx.utils.book_append_sheet(workBook, workSheet); - xlsx.utils.book_append_sheet(wb, ws); - - return wb; + return workBook; } export function downloadExcel(data: xlsx.WorkBook, filename: string) { From 68b81ef68e9b41fcbd573d31b212f36ebab3f94c Mon Sep 17 00:00:00 2001 From: ohinhyuk <8156217@naver.com> Date: Wed, 22 Oct 2025 20:48:38 +0900 Subject: [PATCH 05/10] =?UTF-8?q?refactor:=20=EC=97=91=EC=85=80=20?= =?UTF-8?q?=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=B6=94=EC=83=81=ED=99=94=20-=20=EC=97=91=EC=85=80=20?= =?UTF-8?q?=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=EB=AA=85=20=EA=B5=AC?= =?UTF-8?q?=EC=B2=B4=ED=99=94=ED=95=98=EA=B3=A0=20buildWorkBook=EC=9D=84?= =?UTF-8?q?=20=EB=82=B4=EB=B6=80=EC=97=90=20=EC=88=A8=EA=B9=80=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=EC=8D=A8=20=EC=A7=81=EA=B4=80=EC=A0=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Admin/ManageStudent/Page.tsx | 4 ++-- src/pages/Admin/ManageStudy/Page.tsx | 4 ++-- src/utils/excel.ts | 18 ++++++++++-------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/pages/Admin/ManageStudent/Page.tsx b/src/pages/Admin/ManageStudent/Page.tsx index 717feb7..938f9a8 100644 --- a/src/pages/Admin/ManageStudent/Page.tsx +++ b/src/pages/Admin/ManageStudent/Page.tsx @@ -9,7 +9,7 @@ import { useQuery } from 'react-query'; import { StudyApplyUser } from '@/interface/user'; import SpinnerLoading from '@/components/SpinnerLoading'; import { toast } from 'sonner'; -import { buildWorkBook, downloadExcel } from '@/utils/excel'; +import { downloadExcelFromSheetData } from '@/utils/excel'; // Helper function to clean course names const cleanCourseName = (name: string) => name.replace(/\n/g, ' '); @@ -88,7 +88,7 @@ export default function ManageStudentPage() { const handleExcelDownload = () => { const sheetData = buildApplicantsSheetData(); - downloadExcel(buildWorkBook(sheetData), '스터디신청자목록.xlsx'); + downloadExcelFromSheetData(sheetData, '스터디신청자목록.xlsx'); function buildApplicantsSheetData() { if (!applicants) return []; diff --git a/src/pages/Admin/ManageStudy/Page.tsx b/src/pages/Admin/ManageStudy/Page.tsx index 6b65a3b..9d63e28 100644 --- a/src/pages/Admin/ManageStudy/Page.tsx +++ b/src/pages/Admin/ManageStudy/Page.tsx @@ -5,11 +5,11 @@ import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '@ import { Badge } from '@/components/ui/badge'; import { SearchIcon, DownloadIcon, EyeIcon } from 'lucide-react'; import { readAllGroups } from '@/apis/manager'; -import { buildWorkBook, downloadExcel } from '@/utils/excel'; import { useQuery } from 'react-query'; import SpinnerLoading from '@/components/SpinnerLoading'; import { Link } from 'react-router-dom'; import { paths } from '@/const/paths'; +import { downloadExcelFromSheetData } from '@/utils/excel'; export default function ManageStudyPage() { const { data: activities, isLoading } = useQuery(['courses'], readAllGroups, { @@ -34,7 +34,7 @@ export default function ManageStudyPage() { const handleExcelDownload = () => { const sheetData = buildStudySheetData(); - downloadExcel(buildWorkBook(sheetData), '스터디그룹활동.xlsx'); + downloadExcelFromSheetData(sheetData, '스터디그룹활동.xlsx'); function buildStudySheetData() { if (!activities) return []; diff --git a/src/utils/excel.ts b/src/utils/excel.ts index 01ae7bb..65eec80 100644 --- a/src/utils/excel.ts +++ b/src/utils/excel.ts @@ -1,14 +1,16 @@ import * as xlsx from 'xlsx'; -export function buildWorkBook(sheetData: T[]) { - const workBook = xlsx.utils.book_new(); - const workSheet = xlsx.utils.json_to_sheet(sheetData); +export function downloadExcelFromSheetData(sheetData: T[], filename: string) { + const workBook = buildWorkBook(sheetData); + xlsx.writeFile(workBook, filename); - xlsx.utils.book_append_sheet(workBook, workSheet); + function buildWorkBook(sheetData: T[]) { + const workBook = xlsx.utils.book_new(); - return workBook; -} + const workSheet = xlsx.utils.json_to_sheet(sheetData); + + xlsx.utils.book_append_sheet(workBook, workSheet); -export function downloadExcel(data: xlsx.WorkBook, filename: string) { - xlsx.writeFile(data, filename); + return workBook; + } } From bb95559fb00febb0a2703007c38e87bca5cc251d Mon Sep 17 00:00:00 2001 From: ohinhyuk <8156217@naver.com> Date: Wed, 22 Oct 2025 21:07:33 +0900 Subject: [PATCH 06/10] =?UTF-8?q?refactor:=20=EC=97=91=EC=85=80=20?= =?UTF-8?q?=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81=20-=20=ED=95=B4=EB=8B=B9?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=97=86=EC=9D=84=20=EC=8B=9C?= =?UTF-8?q?=20return;=20-=20buildsheetData=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=9D=B8=EB=9D=BC=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Admin/ManageStudent/Page.tsx | 7 +++---- src/pages/Admin/ManageStudy/Page.tsx | 10 +++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/pages/Admin/ManageStudent/Page.tsx b/src/pages/Admin/ManageStudent/Page.tsx index 938f9a8..ca49bc4 100644 --- a/src/pages/Admin/ManageStudent/Page.tsx +++ b/src/pages/Admin/ManageStudent/Page.tsx @@ -87,12 +87,11 @@ export default function ManageStudentPage() { }, [applicants, searchTerm]); const handleExcelDownload = () => { - const sheetData = buildApplicantsSheetData(); - downloadExcelFromSheetData(sheetData, '스터디신청자목록.xlsx'); + if (!applicants) return; - function buildApplicantsSheetData() { - if (!applicants) return []; + downloadExcelFromSheetData(buildApplicantsSheetData(applicants), '스터디신청자목록.xlsx'); + function buildApplicantsSheetData(applicants: StudyApplyUser[]) { return applicants.map((student) => ({ ID: student.id, Name: student.name, diff --git a/src/pages/Admin/ManageStudy/Page.tsx b/src/pages/Admin/ManageStudy/Page.tsx index 9d63e28..3eaf863 100644 --- a/src/pages/Admin/ManageStudy/Page.tsx +++ b/src/pages/Admin/ManageStudy/Page.tsx @@ -10,6 +10,7 @@ import SpinnerLoading from '@/components/SpinnerLoading'; import { Link } from 'react-router-dom'; import { paths } from '@/const/paths'; import { downloadExcelFromSheetData } from '@/utils/excel'; +import { Group } from '@/interface/group'; export default function ManageStudyPage() { const { data: activities, isLoading } = useQuery(['courses'], readAllGroups, { @@ -33,12 +34,11 @@ export default function ManageStudyPage() { }, [activities, searchTerm]); const handleExcelDownload = () => { - const sheetData = buildStudySheetData(); - downloadExcelFromSheetData(sheetData, '스터디그룹활동.xlsx'); + if (!activities) return; - function buildStudySheetData() { - if (!activities) return []; + downloadExcelFromSheetData(buildStudySheetData(activities), '스터디그룹활동.xlsx'); + function buildStudySheetData(activities: Group[]) { return activities.flatMap((group) => { const sheetRow = group.members.map((member) => ({ Group: group.group, @@ -71,7 +71,7 @@ export default function ManageStudyPage() { onChange={(e) => setSearchTerm(e.target.value)} /> - From f9cd5c513be0d0f6ff317facfc497cd55a0edc21 Mon Sep 17 00:00:00 2001 From: ohinhyuk <8156217@naver.com> Date: Sat, 25 Oct 2025 23:16:01 +0900 Subject: [PATCH 07/10] =?UTF-8?q?test:=20=EC=97=91=EC=85=80=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- e2e-tests/excel/excelDownload.spec.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/e2e-tests/excel/excelDownload.spec.ts b/e2e-tests/excel/excelDownload.spec.ts index 30b2f8c..ac904a2 100644 --- a/e2e-tests/excel/excelDownload.spec.ts +++ b/e2e-tests/excel/excelDownload.spec.ts @@ -1,10 +1,11 @@ +import { paths } from '@/const/paths'; import test, { expect } from '@playwright/test'; test.use({ storageState: 'e2e-tests/auth/admin.json' }); test.describe('엑셀 다운로드 테스트', () => { test('스터디 관리 페이지 (manage-study) 엑셀 다운로드 테스트', async ({ page }) => { - await page.goto('http://localhost:3000/admin/manage-study'); + await page.goto(paths.admin.manageStudy); const downloadPromise = page.waitForEvent('download'); await page.getByRole('button', { name: '그룹 활동 목록 엑셀 다운' }).click(); @@ -18,7 +19,7 @@ test.describe('엑셀 다운로드 테스트', () => { }); test('스터디 신청자 목록 페이지 (manage-student) 엑셀 다운로드 테스트', async ({ page }) => { - await page.goto('http://localhost:3000/admin/manage-student'); + await page.goto(paths.admin.manageStudent); const downloadPromise = page.waitForEvent('download'); await page.getByRole('button', { name: '신청자 목록 다운로드' }).click(); From 767dfa8f8233f4111edf1508def284801bf0b93e Mon Sep 17 00:00:00 2001 From: ohinhyuk <8156217@naver.com> Date: Sun, 26 Oct 2025 04:05:57 +0900 Subject: [PATCH 08/10] =?UTF-8?q?chore:=20playwright=20timeout=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- playwright.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/playwright.config.ts b/playwright.config.ts index 32295ca..9e2fedc 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -17,6 +17,7 @@ if (!isCI) { * See https://playwright.dev/docs/test-configuration. */ export default defineConfig({ + timeout: 120_000, testDir: './e2e-tests', /* Run tests in files in parallel */ fullyParallel: true, From c795d3d6436f39810c3d069f7b2539fc850b93fb Mon Sep 17 00:00:00 2001 From: ohinhyuk <8156217@naver.com> Date: Sun, 26 Oct 2025 04:20:16 +0900 Subject: [PATCH 09/10] =?UTF-8?q?test:=20=EB=8B=A4=EC=9A=B4=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=EB=B2=84=ED=8A=BC=20=ED=81=B4=EB=A6=AD=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20Promise=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- e2e-tests/excel/excelDownload.spec.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/e2e-tests/excel/excelDownload.spec.ts b/e2e-tests/excel/excelDownload.spec.ts index ac904a2..3c37237 100644 --- a/e2e-tests/excel/excelDownload.spec.ts +++ b/e2e-tests/excel/excelDownload.spec.ts @@ -7,10 +7,10 @@ test.describe('엑셀 다운로드 테스트', () => { test('스터디 관리 페이지 (manage-study) 엑셀 다운로드 테스트', async ({ page }) => { await page.goto(paths.admin.manageStudy); - const downloadPromise = page.waitForEvent('download'); - await page.getByRole('button', { name: '그룹 활동 목록 엑셀 다운' }).click(); - - const download = await downloadPromise; + const [download] = await Promise.all([ + page.waitForEvent('download'), + page.getByRole('button', { name: '그룹 활동 목록 엑셀 다운' }).click(), + ]); expect(download.suggestedFilename()).toBe('스터디그룹활동.xlsx'); @@ -20,10 +20,10 @@ test.describe('엑셀 다운로드 테스트', () => { test('스터디 신청자 목록 페이지 (manage-student) 엑셀 다운로드 테스트', async ({ page }) => { await page.goto(paths.admin.manageStudent); - const downloadPromise = page.waitForEvent('download'); - - await page.getByRole('button', { name: '신청자 목록 다운로드' }).click(); - const download = await downloadPromise; + const [download] = await Promise.all([ + page.waitForEvent('download'), + page.getByRole('button', { name: '신청자 목록 다운로드' }).click(), + ]); expect(download.suggestedFilename()).toBe('스터디신청자목록.xlsx'); From a46fe103a2ad088c52c89b311598f2248667d17e Mon Sep 17 00:00:00 2001 From: ohinhyuk <8156217@naver.com> Date: Sun, 26 Oct 2025 04:32:07 +0900 Subject: [PATCH 10/10] =?UTF-8?q?test:=20=EC=97=91=EC=85=80=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9D=B4=EB=8F=99=20=ED=9B=84=20=EB=94=9C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- e2e-tests/excel/excelDownload.spec.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/e2e-tests/excel/excelDownload.spec.ts b/e2e-tests/excel/excelDownload.spec.ts index 3c37237..fe18585 100644 --- a/e2e-tests/excel/excelDownload.spec.ts +++ b/e2e-tests/excel/excelDownload.spec.ts @@ -7,6 +7,7 @@ test.describe('엑셀 다운로드 테스트', () => { test('스터디 관리 페이지 (manage-study) 엑셀 다운로드 테스트', async ({ page }) => { await page.goto(paths.admin.manageStudy); + await page.waitForTimeout(3000); const [download] = await Promise.all([ page.waitForEvent('download'), page.getByRole('button', { name: '그룹 활동 목록 엑셀 다운' }).click(), @@ -20,6 +21,8 @@ test.describe('엑셀 다운로드 테스트', () => { test('스터디 신청자 목록 페이지 (manage-student) 엑셀 다운로드 테스트', async ({ page }) => { await page.goto(paths.admin.manageStudent); + await page.waitForTimeout(3000); + const [download] = await Promise.all([ page.waitForEvent('download'), page.getByRole('button', { name: '신청자 목록 다운로드' }).click(),