From 905f2204984f749e1be02a5c82926d70a359135e Mon Sep 17 00:00:00 2001 From: solp721 Date: Wed, 13 Aug 2025 03:06:20 +0900 Subject: [PATCH 1/6] =?UTF-8?q?fix=20:=20metadataBase=20URL=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/layout.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/app/layout.tsx b/app/layout.tsx index 7f290d2..14b8884 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -15,6 +15,7 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { + metadataBase: new URL('https://allclass.vercel.app'), title: { default: 'AllClass - 부산소속 대학교 강의정보 플랫폼', template: '%s | AllClass', From f391b96bd24c7d4504219774567e46e0270e01c5 Mon Sep 17 00:00:00 2001 From: solp721 Date: Wed, 13 Aug 2025 03:16:45 +0900 Subject: [PATCH 2/6] =?UTF-8?q?fix=20:=20sitemap=20=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/sitemap.ts | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/app/sitemap.ts b/app/sitemap.ts index f056e08..1be0126 100644 --- a/app/sitemap.ts +++ b/app/sitemap.ts @@ -1,44 +1,24 @@ import { MetadataRoute } from 'next'; import { universityNames } from '@/constants'; -import { getLectureListStatic } from '@/lib/lecture'; -export default async function sitemap(): Promise { - const baseUrl = 'https://all-class.vercel.app'; +export default function sitemap(): MetadataRoute.Sitemap { + const baseUrl = 'https://allclass.vercel.app'; - const staticPages = [ + const staticPages: MetadataRoute.Sitemap = [ { url: baseUrl, lastModified: new Date(), - changeFrequency: 'daily' as const, + changeFrequency: 'daily', priority: 1, }, ]; - const universityPages = universityNames.map((universityName) => ({ + const universityPages: MetadataRoute.Sitemap = universityNames.map((universityName) => ({ url: `${baseUrl}/${encodeURIComponent(universityName)}`, lastModified: new Date(), - changeFrequency: 'daily' as const, + changeFrequency: 'daily', priority: 0.8, })); - const lecturePages: MetadataRoute.Sitemap = []; - - for (const universityName of universityNames) { - try { - const lectures = await getLectureListStatic(universityName); - if (lectures.success && lectures.lectures) { - const pages = lectures.lectures.map((lecture) => ({ - url: `${baseUrl}/${encodeURIComponent(universityName)}/${lecture.lectureId}`, - lastModified: new Date(), - changeFrequency: 'weekly' as const, - priority: 0.7, - })); - lecturePages.push(...pages); - } - } catch (error) { - console.error(`Error generating sitemap for ${universityName}:`, error); - } - } - - return [...staticPages, ...universityPages, ...lecturePages]; + return [...staticPages, ...universityPages]; } From b88bf5bd557702e64db8ff1fa49f30a365dd37db Mon Sep 17 00:00:00 2001 From: solp721 Date: Wed, 13 Aug 2025 18:37:20 +0900 Subject: [PATCH 3/6] =?UTF-8?q?fix=20:=20=ED=99=98=EA=B2=BD=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EB=88=84=EB=9D=BD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 2 ++ cypress/support/commands.ts | 26 ++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 56e500a..8b6b64d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -82,6 +82,8 @@ jobs: NEXT_PUBLIC_API_URL: ${{ secrets.NEXT_PUBLIC_API_URL }} CYPRESS_TEST_USER_ID: ${{ secrets.CYPRESS_TEST_USER_ID }} CYPRESS_TEST_USER_PW: ${{ secrets.CYPRESS_TEST_USER_PW }} + CYPRESS_TEST_USER_NUMBER: ${{ secrets.CYPRESS_TEST_USER_NUMBER }} + CYPRESS_TEST_UNIVERSITY_NAME: ${{ secrets.TEST_UNIVERSITY_NAME }} - name: "========== 🧪 AllClass E2E • END ==========" if: always() diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 1d87680..d2cc633 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -49,17 +49,27 @@ Cypress.Commands.add('uiLogin', (userId?: string, userPw?: string) => { }); Cypress.Commands.add('getMyLectures', () => { + const apiUrl = Cypress.env('NEXT_PUBLIC_API_URL'); + if (!apiUrl) { + throw new Error('NEXT_PUBLIC_API_URL 환경변수가 설정되지 않았습니다'); + } + return cy.request({ method: 'GET', - url: `${Cypress.env('NEXT_PUBLIC_API_URL')}/class/me`, + url: `${apiUrl}/class/me`, qs: { userNumber: Cypress.env('TEST_USER_NUMBER') }, }); }); Cypress.Commands.add('getUniversityLectures', (universityName: string) => { + const apiUrl = Cypress.env('NEXT_PUBLIC_API_URL'); + if (!apiUrl) { + throw new Error('NEXT_PUBLIC_API_URL 환경변수가 설정되지 않았습니다'); + } + return cy.request({ method: 'GET', - url: `${Cypress.env('NEXT_PUBLIC_API_URL')}/class`, + url: `${apiUrl}/class`, qs: { university: universityName }, }); }); @@ -82,7 +92,10 @@ Cypress.Commands.add('getLectureWithReviews', (universityName: string) => { return cy.getUniversityLectures(universityName).then((response) => { const lectures = response.body.data as { lectureName: string; lectureId: number }[]; - // 각 강의를 순차적으로 확인하여 리뷰가 있는 첫 번째 강의 찾기 + if (!lectures || !Array.isArray(lectures) || lectures.length === 0) { + throw new Error('강의 목록을 가져올 수 없습니다'); + } + let currentIndex = 0; const checkNextLecture = (): Cypress.Chainable<{ lectureName: string; lectureId: number }> => { @@ -92,10 +105,15 @@ Cypress.Commands.add('getLectureWithReviews', (universityName: string) => { const lecture = lectures[currentIndex]; + const apiUrl = Cypress.env('NEXT_PUBLIC_API_URL'); + if (!apiUrl) { + throw new Error('NEXT_PUBLIC_API_URL 환경변수가 설정되지 않았습니다'); + } + return cy .request({ method: 'GET', - url: `${Cypress.env('NEXT_PUBLIC_API_URL')}/class`, + url: `${apiUrl}/class`, qs: { university: universityName, lectureId: lecture.lectureId, From a9311d5a8c1a372f6e2f7eabfad8983de0f2df78 Mon Sep 17 00:00:00 2001 From: solp721 Date: Wed, 13 Aug 2025 18:44:00 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat=20:=20cypress=20=EC=A0=84=EC=9A=A9=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 1 + cypress/support/commands.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b6b64d..25bddf5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,6 +80,7 @@ jobs: CI: true NEXT_TELEMETRY_DISABLED: 1 NEXT_PUBLIC_API_URL: ${{ secrets.NEXT_PUBLIC_API_URL }} + CYPRESS_NEXT_PUBLIC_API_URL: ${{ secrets.NEXT_PUBLIC_API_URL }} CYPRESS_TEST_USER_ID: ${{ secrets.CYPRESS_TEST_USER_ID }} CYPRESS_TEST_USER_PW: ${{ secrets.CYPRESS_TEST_USER_PW }} CYPRESS_TEST_USER_NUMBER: ${{ secrets.CYPRESS_TEST_USER_NUMBER }} diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index d2cc633..d86aa79 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -49,7 +49,7 @@ Cypress.Commands.add('uiLogin', (userId?: string, userPw?: string) => { }); Cypress.Commands.add('getMyLectures', () => { - const apiUrl = Cypress.env('NEXT_PUBLIC_API_URL'); + const apiUrl = Cypress.env('NEXT_PUBLIC_API_URL') || Cypress.env('CYPRESS_NEXT_PUBLIC_API_URL'); if (!apiUrl) { throw new Error('NEXT_PUBLIC_API_URL 환경변수가 설정되지 않았습니다'); } @@ -62,7 +62,7 @@ Cypress.Commands.add('getMyLectures', () => { }); Cypress.Commands.add('getUniversityLectures', (universityName: string) => { - const apiUrl = Cypress.env('NEXT_PUBLIC_API_URL'); + const apiUrl = Cypress.env('NEXT_PUBLIC_API_URL') || Cypress.env('CYPRESS_NEXT_PUBLIC_API_URL'); if (!apiUrl) { throw new Error('NEXT_PUBLIC_API_URL 환경변수가 설정되지 않았습니다'); } From 0c7390a4d4b5ab578050dd206da8eacc9b45988f Mon Sep 17 00:00:00 2001 From: solp721 Date: Wed, 13 Aug 2025 18:50:42 +0900 Subject: [PATCH 5/6] =?UTF-8?q?fix=20:=20array=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cypress/support/commands.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index d86aa79..c249bf5 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -92,10 +92,6 @@ Cypress.Commands.add('getLectureWithReviews', (universityName: string) => { return cy.getUniversityLectures(universityName).then((response) => { const lectures = response.body.data as { lectureName: string; lectureId: number }[]; - if (!lectures || !Array.isArray(lectures) || lectures.length === 0) { - throw new Error('강의 목록을 가져올 수 없습니다'); - } - let currentIndex = 0; const checkNextLecture = (): Cypress.Chainable<{ lectureName: string; lectureId: number }> => { @@ -105,7 +101,8 @@ Cypress.Commands.add('getLectureWithReviews', (universityName: string) => { const lecture = lectures[currentIndex]; - const apiUrl = Cypress.env('NEXT_PUBLIC_API_URL'); + const apiUrl = + Cypress.env('NEXT_PUBLIC_API_URL') || Cypress.env('CYPRESS_NEXT_PUBLIC_API_URL'); if (!apiUrl) { throw new Error('NEXT_PUBLIC_API_URL 환경변수가 설정되지 않았습니다'); } From b6218fff844d7691a570283b42f501c59a9a2893 Mon Sep 17 00:00:00 2001 From: solp721 Date: Wed, 13 Aug 2025 19:01:34 +0900 Subject: [PATCH 6/6] =?UTF-8?q?feat=20:=20user=20number=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=EB=B3=80=EC=88=98=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../e2e/tier1-critical/01-auth-and-review.cy.ts | 16 ++++++++++++++++ cypress/support/commands.ts | 7 ++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/cypress/e2e/tier1-critical/01-auth-and-review.cy.ts b/cypress/e2e/tier1-critical/01-auth-and-review.cy.ts index e3a4d6d..004380b 100644 --- a/cypress/e2e/tier1-critical/01-auth-and-review.cy.ts +++ b/cypress/e2e/tier1-critical/01-auth-and-review.cy.ts @@ -11,7 +11,17 @@ describe('사용자는 로그인을하고 자신이 들은 강의에 리뷰를 cy.uiLogin(); cy.getMyLectures().then((response) => { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions expect(response.status).to.eq(200); + + cy.then(() => console.log('getMyLectures response:', response.body)); + + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(response.body.data).to.not.be.null; + + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(response.body.data).to.be.an('array'); + // eslint-disable-next-line @typescript-eslint/no-unused-expressions expect(response.body.data).to.have.length.greaterThan(0); const enrolledLecture = response.body.data[0]; @@ -47,6 +57,12 @@ describe('사용자는 로그인을하고 자신이 들은 강의에 리뷰를 cy.uiLogin(); cy.getMyLectures().then((enrolledResponse) => { + cy.then(() => console.log('getMyLectures response:', enrolledResponse.body)); + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(enrolledResponse.body.data).to.not.be.null; + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(enrolledResponse.body.data).to.be.an('array'); + const enrolledLectures = enrolledResponse.body.data.map( (lecture: { lectureName: string }) => lecture.lectureName ); diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index c249bf5..f96cc52 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -54,10 +54,15 @@ Cypress.Commands.add('getMyLectures', () => { throw new Error('NEXT_PUBLIC_API_URL 환경변수가 설정되지 않았습니다'); } + const userNumber = Cypress.env('TEST_USER_NUMBER') || Cypress.env('CYPRESS_TEST_USER_NUMBER'); + + cy.log(`API URL: ${apiUrl}`); + cy.log(`User Number: ${userNumber}`); + return cy.request({ method: 'GET', url: `${apiUrl}/class/me`, - qs: { userNumber: Cypress.env('TEST_USER_NUMBER') }, + qs: { userNumber }, }); });