Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
8d8858d
refactor: 에러 처리 로직 분리
JuHyeong424 Apr 8, 2026
69b0178
refactor: 받아온 영화 리스트가 empty일 때 로직 분리
JuHyeong424 Apr 8, 2026
9a45d8f
refactor: 더보기 클릭시 원하는 데이터로 fetch하는 함수 분리
JuHyeong424 Apr 8, 2026
d917b40
refactor: 더보기 버튼 클릭 시 오류 처리 분리
JuHyeong424 Apr 8, 2026
7a3c081
docs: 영화 상세 정보 업데이트
JuHyeong424 Apr 8, 2026
00009dc
refactor: 영화 li 태그에 class 네임 부여
JuHyeong424 Apr 8, 2026
bf933f3
refactor: 더보기 버튼 생성자 수정
JuHyeong424 Apr 8, 2026
5f0eaa0
refactor: modal 요소 추가
JuHyeong424 Apr 8, 2026
682e829
feat: 모달 뷰 객체 생성
JuHyeong424 Apr 8, 2026
31a17df
feat: 모달 컨트롤러 추가
JuHyeong424 Apr 8, 2026
c48a176
refactor: modal 이벤트 추가
JuHyeong424 Apr 8, 2026
7f658aa
feat: 영화 카드 클릭 시 모달 열기
JuHyeong424 Apr 8, 2026
ce7db89
feat: 영화 상세정보 api 가져오기
JuHyeong424 Apr 8, 2026
eaed4fe
feat: 영화 상세정보 api 호출 에러 파일 생성
JuHyeong424 Apr 8, 2026
6b1be4b
feat: 영화 상세정보 api 타입 설정
JuHyeong424 Apr 8, 2026
c3526f8
feat: 영화 상세정보 api 설정
JuHyeong424 Apr 8, 2026
17d923c
feat: 모달 창 닫기 이벤트
JuHyeong424 Apr 8, 2026
f12c5b2
refactor: 모달 요소 수정
JuHyeong424 Apr 9, 2026
36e5796
feat: 오리지날 이미지 url 추가
JuHyeong424 Apr 9, 2026
92e447d
feat: 영화 상세 모달 렌더링
JuHyeong424 Apr 9, 2026
9d05973
feat: 내 별점 매기기 element 추가
JuHyeong424 Apr 9, 2026
b442d56
style: 내 별점 매기기 스타일 적용
JuHyeong424 Apr 9, 2026
7316134
feat: 내 별점 매기기 image에 data 설정
JuHyeong424 Apr 9, 2026
a8edbdd
style: 내 별점 스타일 설정
JuHyeong424 Apr 9, 2026
20d1c6c
feat: 별점 클릭 시 내 별점 매기기
JuHyeong424 Apr 9, 2026
5b2562d
feat: 현재 영화 모달 아이디 모델 생성
JuHyeong424 Apr 11, 2026
0a79a40
feat: 나의 별점 매기기 뷰 생성
JuHyeong424 Apr 11, 2026
b32c9f1
feat: 클릭한 영화 아이디 전달
JuHyeong424 Apr 11, 2026
97edac8
feat: 영화 모달 정보 타입 설정
JuHyeong424 Apr 11, 2026
4e30d5d
feat: 영화 별점 누르기 이벤트 추가
JuHyeong424 Apr 11, 2026
6fc68a1
refactor: currentMovieModel 네이밍 수정
JuHyeong424 Apr 11, 2026
427ac7e
refactor: html data 값 변경
JuHyeong424 Apr 11, 2026
4388c00
refactor: handleMyStar() 매개 변수 수정
JuHyeong424 Apr 11, 2026
583979b
feat: 나의 별점 local storage 저장 로직
JuHyeong424 Apr 11, 2026
6372874
refactor: 별점 사진 배열 인덱스 수정
JuHyeong424 Apr 11, 2026
cf60130
refactor: 별점 이미지 렌더 로직 수정
JuHyeong424 Apr 11, 2026
005948a
refactor: 사용하지 않은 import 삭제
JuHyeong424 Apr 11, 2026
f0731f6
feat: 임시 로컬 api 파일 생성
JuHyeong424 Apr 11, 2026
bb0af88
refactor: 외부 api와 연결 & 비동기 처리
JuHyeong424 Apr 11, 2026
ed2f501
docs: README update
JuHyeong424 Apr 11, 2026
b354c9f
feat: 오류 발생 시 오류 렌더링
JuHyeong424 Apr 11, 2026
34547ea
style: 로딩 스피너 스타일 추가
JuHyeong424 Apr 11, 2026
4981cfb
feat: 로딩 스피너 기능 추가
JuHyeong424 Apr 11, 2026
2248b05
docs: README update
JuHyeong424 Apr 11, 2026
1c3ef4e
feat: 무한 스크롤 기능 구현
JuHyeong424 Apr 11, 2026
71a596f
refactor: 더보기 기능 삭제
JuHyeong424 Apr 11, 2026
eb3c691
style: 에러 및 빈 결과 섹션 스타일 추가
JuHyeong424 Apr 11, 2026
dd5ed03
refactor: console 삭제
JuHyeong424 Apr 11, 2026
d0fd565
refactor: 에러 및 빈 결과 발생 시 로직 수정
JuHyeong424 Apr 11, 2026
6a37118
refactor: view 렌더링 수정
JuHyeong424 Apr 11, 2026
78f3283
style: 반응형 레이아웃 스타일 추가
JuHyeong424 Apr 11, 2026
3185d90
docs: README update
JuHyeong424 Apr 11, 2026
d1ce73a
refactor: 더보기 테스트 삭제 및 무한 스크롤 테스트 추가
JuHyeong424 Apr 11, 2026
0fde7dc
refactor: 영화 각 리스트에 아이디 데이터 추가
JuHyeong424 Apr 12, 2026
58ff9de
refactor: 영화 평점 출력에 /10 추가
JuHyeong424 Apr 12, 2026
0204c07
test: modal 테스트 추가
JuHyeong424 Apr 12, 2026
59c2981
dcos: README update
JuHyeong424 Apr 12, 2026
f81da0a
refactor: 에로 로직 수정
JuHyeong424 Apr 12, 2026
0908fcf
test: 에러 처리 테스트 추가
JuHyeong424 Apr 12, 2026
bb87b4a
refactor: branch 추가
JuHyeong424 Apr 12, 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
1 change: 1 addition & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ on:
branches:
- main
- step1
- step2
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

step2 푸시까지 Pages 실배포되면 안정 브랜치 결과물을 덮어쓸 수 있습니다

Line 8로 인해 step2 브랜치 푸시도 deploy 잡을 타며 github-pages 환경에 배포됩니다. 학습/개발 브랜치 산출물이 운영 URL에 올라갈 수 있으니, 배포는 main에서만 실행되도록 제한하는 게 안전합니다.

수정 예시
 jobs:
   build:
+    if: github.ref == 'refs/heads/main'
     runs-on: ubuntu-latest
@@
   deploy:
+    if: github.ref == 'refs/heads/main'
     needs: build
     runs-on: ubuntu-latest
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/deploy.yml at line 8, 현재 워크플로의 push 트리거에 "step2"가 포함되어 있어
학습/개발 브랜치(예: step2) 푸시 시에도 deploy 잡(및 github-pages 배포)이 실행됩니다; deploy 잡의 push
트리거에서 "step2"를 제거하거나 push 조건을 main 브랜치로 한정하도록 수정하세요 (예: on.push.branches에서
"step2" 삭제 또는 jobs.deploy.if / workflow-level 조건을 사용해 github.ref ==
'refs/heads/main'으로 제한). 참조할 식별자: deploy job, on.push.branches 목록, "step2" 브랜치
이름, 그리고 main(또는 refs/heads/main) 조건을 변경하세요.


permissions:
contents: read
Expand Down
64 changes: 58 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,53 @@
- [x] 영화 목록 api를 호출한다.
- [x] 지금 인기 있는 영화 목록 20개를 보여준다.
- [x] 제일 먼저 있는 영화를 배너로 띄운다.
- [x] 더보기 버튼을 누르면 20개의 영화 목록을 추가로 불러온다.
- [x] 브라우저의 화면 끝에 도달하면 20개의 검색과 관련된 영화 목록을 추가로 불러온다.
- [x] 불러올 영화 목록이 없으면 더보기 버튼이 사라진다.
Comment on lines +10 to 11
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

무한 스크롤 설명과 ‘더보기 버튼’ 서술이 서로 충돌합니다.

체크리스트/시나리오에서 무한 스크롤을 설명하면서 동시에 더보기 버튼 소거를 검증하고 있어, 현재 동작 기준이 문서상 모호합니다. 한 기준으로 통일해 주세요.

Also applies to: 20-21, 135-140

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 10 - 11, The README currently contradicts itself by
describing infinite scroll while also testing removal of a "더보기" (load more)
button; pick one canonical UX (either infinite scroll or a load-more button),
update all related checklist items and scenario descriptions to consistently
reflect that choice, and remove or rewrite the conflicting lines that mention
the opposite behavior (update the entries currently at the spots referenced in
the comment including the occurrences around lines 10-11, 20-21 and 135-140) so
every checklist, scenario, and acceptance criterion consistently states the
chosen behavior.

- [x] 모든 레이아웃을 반응형으로 만든다.

## 검색 시 UI

- [x] 검색어를 입력하고 버튼을 마우스로 누르거나 엔터키를 누른다.
- [x] 검색한 영화 목록 api를 호출한다.
- [x] 해당 검색어에 대한 영화 목록 20개를 보여준다.
- [x] 검색어를 검색 제목에 띄운다.
- [x] 더보기 버튼을 누르면 20개의 검색과 관련된 영화 목록을 추가로 불러온다.
- [x] 브라우저의 화면 끝에 도달하면 20개의 검색과 관련된 영화 목록을 추가로 불러온다.
- [x] 불러올 영화 목록이 없으면 더보기 버튼이 사라진다.
- [x] 검색 결과가 없으면 `검색 결과가 없습니다.` 라는 문구를 띄운다.
- [x] 모든 레이아웃을 반응형으로 만든다.

## 영화 상세 정보 조회
- [x] 영화를 누르면 해당 영화에 대한 상세 정보가 모달로 나타난다.
- [x] 모달에 있는 내용은 영화 썸네일, 제목, 개봉일, 장르, 평균 평점, 별점 매기기, 줄거리이다.
- [x] 닫기 버튼을 누르거나 ESC를 누르면 모달 창을 닫을 수 있다.
- [x] 상세 정보 데이터를 불러올 동안, 로딩 스피너가 돌아간다.
- [x] 모든 레이아웃을 반응형으로 만든다.

## 별점 매기기
- [x] 영화에 대한 별점을 줄 수 있다.
- [x] localstorage에 내가 매긴 별점이 저장된다.
- [x] 새로고침이나 모달 창을 닫아도 내가 매긴 별점이 사라지지 않는다.
- [x] 별점은 총 5개로 구성된다.
- [x] 한 개당 2점이며 1점 단위는 고려하지 않는다.
- [x] 내가 선택한 별점에 따라 점수가 변한다.
- [x] 점수에 따라 나타나는 문구가 달라진다.
- [x] 2점: 최악이예요
- [x] 4점: 별로예요
- [x] 6점: 보통이에요
- [x] 8점: 재미있어요
- [x] 10점: 명작이에요

## 예외 처리

- [x] 기본 UI에서 영화 정보를 불러오지 못했다면 `영화 정보를 불러오지 못했습니다. 다시 시도해주세요.` 라는 문구를 띄운다.
- [x] 영화 이미지를 불러오지 못했다면 `No Image` 이미지를 띄운다.
- [x] 검색 시, 영화 정보를 불러오지 못했다면 `영화 검색 결과를 불러오지 못했습니다. 다시 시도해주세요.` 라는 문구를 띄운다.
- [x] 모달 창에 해당하는 영화 상세 정보를 불러오지 못했다면 모달 창 내부에 `영화 상세 정보를 불러오지 못했습니다. 다시 시도해주세요.` 라는 문구를 띄운다.
- [x] 영화 상세 보기 에러 시, 다시 시도하기 버튼을 누르면 해당 영화의 상세 정보 데이터를 다시 불러온다.
- [x] 인기있는 영화 리스트를 불러오지 못했을 시, 다시 시도하기 버튼을 생성한다.
- [x] 검색 영화 리스트를 불러오지 못했을 시, 다시 시도하기 버튼을 생성한다.
- [x] 배너 정보를 불러오지 못했을 시, 다시 시도하기 버튼을 생성한다.
- [x] 다시 시도하기 버튼을 누르면 불러오지 못한 데이터를 다시 불러온다.

## 공통

Expand Down Expand Up @@ -61,18 +90,29 @@
| language | string | 언어 |
| page | number | 페이지 번호 |

### Details

| 항목 | 내용 |
| -------- | ----------------------------------------------------------------- |
| Method | GET |
| Endpoint | /3/movie/movie_id |
| 설명 | 사용자가 클릭한 영화에 대한 상세 정보를 가져오는 API입니다. |
Comment on lines +98 to +99
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Details endpoint의 path parameter 표기를 명확히 해주세요.

/3/movie/movie_id는 리터럴 경로처럼 읽힐 수 있어, 변수 파라미터 표기({movie_id} 등)로 명확히 적는 편이 좋습니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 98 - 99, The README's endpoint path
`/3/movie/movie_id` reads like a literal; change it to use a variable path
parameter such as `/3/movie/{movie_id}` (or `:movie_id` if following your style)
wherever the Endpoint is documented so it's clear this is a path parameter, and
update any accompanying description or examples that reference `movie_id` to
match the new parameter notation.


| Query Parameter | 타입 | 설명 |
| --------------- | ------ | ------------- |
| language | string | 언어 |

### E2E 테스트 시나리오

1. 첫 진입 시점

- api 호출
- 베너
- 리스트 (스켈레톤)
- 더보기 버튼

2. 더보기 클릭
2. 스크롤 아래로 내림

- 더보기를 클릭했을
- 스크롤을 아래로 내렸을
- api 호출
- 리스트 (스켈레톤)

Expand All @@ -92,9 +132,21 @@
- 제목 키워드 포함
- 비어있을 때 문구 출력

5. 검색(더보기 없어지기)
5. 무한 스크롤 작동 안함

- 키워드 입력
- 검색버튼 클릭했을 때
- 검색어로 api 호출
- 마지막 데이터에서 더보기 버튼이 사라지는지 확인

6. 모달 테스트

- 특정 영화를 클릭했을 때 해당 영화에 관한 상세 정보 모달이 열리는지 확인
- 해당 모달 안에 필요한 정보가 들어있는지 확인
- 나의 별점 이미지를 클릭하면 해당되는 평가 문구와 별점이 화면에 나오는지 확인
- 나의 별점이 localStorage에 저장되는지 확인
- 이미 평점이 localStorage에 있을 때, 해당 영화 모달을 열면 저장된 내용이 화면에 반영되는지 확인

7. 예외 테스트

- api 데이터를 불러오지 못했을 때, 다시 시도하기 버튼을 눌러 api를 재호출하는지 테스트
38 changes: 29 additions & 9 deletions cypress/e2e/home.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,23 +27,19 @@ describe("홈 화면 테스트", () => {
cy.verifyMovieItems(results);
});
});

it("더보기 버튼이 있는지 확인", () => {
cy.get(".thumbnail-add-button").should("exist");
});
});

describe("더보기 버튼 테스트", () => {
describe("무한 스크롤 테스트", () => {
beforeEach(() => {
cy.mockPopularMovies(1);
cy.mockPopularMovies(2);

cy.visit("/");
});

it("버튼 클릭 시 API 호출 확인", () => {
cy.get(".thumbnail-add-button").click();

it("스크롤 시 API 호출 확인", () => {
cy.wait("@getPopularMoviesPage1");
cy.get(".thumbnail-list li:last-child").scrollIntoView();
cy.wait("@getPopularMoviesPage2").its("response.body.results").should("be.an", "array");
});

Expand All @@ -56,7 +52,7 @@ describe("더보기 버튼 테스트", () => {
page1Results = results1;
});

cy.get(".thumbnail-add-button").click();
cy.get(".thumbnail-list li:last-child").scrollIntoView();

cy.wait("@getPopularMoviesPage2")
.its("response.body.results")
Expand All @@ -66,3 +62,27 @@ describe("더보기 버튼 테스트", () => {
});
});
});

describe("데이터 로딩 시 에러 화면을 띄우고, 다시 시도하기 버튼으로 복구", () => {
beforeEach(() => {
cy.getPopularNetworkError();
cy.visit("/");
cy.wait("@getPopularNetworkError");
});

it("데이터 로딩 시 에러 화면을 띄우고, 다시 시도하기 버튼으로 복구하는 테스트", () => {
cy.get(".error-thumbnail-container").should("not.have.class", "hidden");
cy.get(".thumbnail-retry-button").should("be.visible");

cy.mockPopularMovies(1);

cy.get(".thumbnail-retry-button").click();
cy.wait("@getPopularMoviesPage1")
.its("response.body.results")
.then((results) => {
cy.verifyMovieItems(results);
});

cy.get(".error-thumbnail-container").should("have.class", "hidden");
});
});
171 changes: 171 additions & 0 deletions cypress/e2e/modal.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
describe("영화 모달 테스트", () => {
beforeEach(() => {
cy.mockPopularMovies(1);
cy.getMovieDetail(83533);
cy.visit("/");
});

it("인기 있는 영화 목록이 호출이 되는지 테스트한다.", () => {
cy.wait("@getPopularMoviesPage1").its("response.body.results").should("be.an", "array");
});

it("영화 id가 83533인 영화를 클릭했을 때, 해당 영화의 상세 정보를 불러오는지 테스트한다.", () => {
cy.wait("@getPopularMoviesPage1");
cy.get(`[data-movie-id=83533]`).click();
cy.wait("@getMovieDetail83533");
cy.get(".modal").should("exist");
});

it("모달 안에 제목, 별점, 내용이 있는지 확인하는 테스트", () => {
cy.wait("@getPopularMoviesPage1");
cy.get(`[data-movie-id=83533]`).click();
cy.get(".modal").should("exist");
cy.wait("@getMovieDetail83533")
.its("response.body")
.then((movieDetail) => {
cy.get(".modal-description-title").should("contain", movieDetail.title);
cy.get("#modal-description-year").should("contain", movieDetail.release_date.split("-")[0]);
cy.get("#modal-description-genre").should("contain", movieDetail.genres.map((item: {id: Number, name: string}) => item.name).join(", "));
cy.get("#modal-rate-number").should("contain", movieDetail.vote_average.toFixed(1));
cy.get("#modal-detail-description").should("contain", movieDetail.overview);
});
});

it ("모달 창의 닫기 버튼을 눌렀을 때 닫히는지 테스트", () => {
cy.wait("@getPopularMoviesPage1");
cy.get(`[data-movie-id=83533]`).click();
cy.get(".modal").should("exist");
cy.wait("@getMovieDetail83533")
cy.get(".close-modal").click();
cy.get(".modal-background").should("not.be.visible");
});

it ("모달 창의 ESC를 눌렀을 때 닫히는지 테스트", () => {
cy.wait("@getPopularMoviesPage1");
cy.get(`[data-movie-id=83533]`).click();
cy.get(".modal").should("exist");
cy.wait("@getMovieDetail83533")
cy.get("body").type('{esc}');
cy.get(".modal-background").should("not.be.visible");
});
});

describe("나의 평점 테스트", () => {
beforeEach(() => {
cy.mockPopularMovies(1);
cy.getMovieDetail(83533);
cy.visit("/");
});

it("별 이미지를 클릭한만큼 나의 평점 설정 가능 테스트", () => {
cy.wait("@getPopularMoviesPage1");
cy.get(`[data-movie-id=83533]`).click();
cy.wait("@getMovieDetail83533");
cy.get(".modal").should("exist");
const evaluation: Record<number, string> = {
0: "나의 별점을 눌러보세요.",
1: "최악이예요",
2: "별로예요",
3: "보통이에요",
4: "재미있어요",
5: "명작이에요",
};
for (let i = 1; i <= 5; i++) {
cy.get(`#my-star-image-${i}`).click();
cy.get("#my-star-evaluation").should("contain", evaluation[i])
cy.get("#my-star-score").should("contain", `${i * 2} / 10`);

for (let j = 1; j <= 5; j++) {
if (j <= i) {
cy.get(`#my-star-image-${j}`)
.should("have.attr", "src")
.and("include", "star_filled.png")
} else {
cy.get(`#my-star-image-${j}`)
.should("have.attr", "src")
.and("include", "star_empty.png")
}
};
};
});

it("별 이미지를 클릭한만큼 나의 평점이 localstorage에 저장되는지 테스트", () => {
cy.wait("@getPopularMoviesPage1");
cy.get(`[data-movie-id=83533]`).click();
cy.wait("@getMovieDetail83533");
cy.get(".modal").should("exist");
const evaluation: Record<number, string> = {
0: "나의 별점을 눌러보세요.",
1: "최악이예요",
2: "별로예요",
3: "보통이에요",
4: "재미있어요",
5: "명작이에요",
};
for (let i = 1; i <= 5; i++) {
cy.get(`#my-star-image-${i}`).click();
cy.get("#my-star-evaluation").should("contain", evaluation[i])
cy.get("#my-star-score").should("contain", `${i * 2} / 10`);
cy.window().its("localStorage").invoke("getItem", 83533).should("eq", `${i * 2}`);

for (let j = 1; j <= 5; j++) {
if (j <= i) {
cy.get(`#my-star-image-${j}`)
.should("have.attr", "src")
.and("include", "star_filled.png")
} else {
cy.get(`#my-star-image-${j}`)
.should("have.attr", "src")
.and("include", "star_empty.png")
}
};
};
});

it("local storage에 이미 평점이 있다면, 모달을 열었을 때 해당 평점이 화면에 반영되는 테스트", () => {
cy.visit("/", {
onBeforeLoad(win) {
win.localStorage.setItem("83533", "10");
},
});

cy.wait("@getPopularMoviesPage1");
cy.get(`[data-movie-id=83533]`).click();
cy.wait("@getMovieDetail83533");

cy.get("#my-star-evaluation").should("contain", "명작이에요");
cy.get("#my-star-score").should("contain", "10 / 10");
cy.get(`#my-star-image-5`).should("have.attr", "src").and("include", "star_filled.png");
});
});

describe("데이터 로딩 시 에러 화면을 띄우고, 다시 시도하기 버튼으로 복구하는 테스트", () => {
beforeEach(() => {
cy.mockPopularMovies(1);
cy.getMovieDetailNetworkError(83533);
cy.visit("/");
cy.wait("@getPopularMoviesPage1");
cy.get(`[data-movie-id=83533]`).click();
cy.wait("@getMovieDetailNetworkError");
});

it("데이터 로딩 시 에러 화면을 띄우고, 다시 시도하기 버튼으로 복구하는 테스트", () => {
cy.get(".modal-error-container").should("not.have.class", "hidden");
cy.get(".retry-button").should("be.visible");

cy.getMovieDetail(83533);
cy.get(".retry-button").click();

cy.wait("@getMovieDetail83533")
.its("response.body")
.then((movieDetail) => {
cy.get(".modal-description-title").should("contain", movieDetail.title);
cy.get("#modal-description-year").should("contain", movieDetail.release_date.split("-")[0]);
cy.get("#modal-description-genre").should("contain", movieDetail.genres.map((item: {id: Number, name: string}) => item.name).join(", "));
cy.get("#modal-rate-number").should("contain", movieDetail.vote_average.toFixed(1));
cy.get("#modal-detail-description").should("contain", movieDetail.overview);
});

cy.get(".modal-error-container").should("have.class", "hidden");
});
});
Loading