Skip to content

Commit

Permalink
Merge pull request #242 from STUDIO-EYE/Feat/229-HandlingIssue
Browse files Browse the repository at this point in the history
[Feat/SCRUM-337] handling issue / fix e2e test code
  • Loading branch information
sunminnnnn authored Dec 7, 2024
2 parents eeb09b7 + 8aadd71 commit 6830363
Show file tree
Hide file tree
Showing 8 changed files with 183 additions and 344 deletions.
223 changes: 35 additions & 188 deletions cypress/e2e/System/RecruitmentPage.cy.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import { IContent, IRecruitment, IBenefit, RecruitmentData, BenefitData } from 'cypress/support/recruitmentTypes';
import { RecruitmentData, BenefitData } from 'cypress/support/recruitmentTypes';
import { login } from 'cypress/support/hooks';

let testRecruitmentData: RecruitmentData;
let contentData: IContent[];
let recruitmentData: IRecruitment;

// ------------------------------- 채용 공고 e2e 테스트 ------------------------------- //

Expand Down Expand Up @@ -35,51 +33,24 @@ describe('PA 페이지에서 새로운 채용 공고를 등록하고 PP 화면

it('PP 페이지에서 새롭게 등록된 채용 공고가 정상적으로 표시되는지 확인하고 공고를 클릭하여 새 창에서 원하는 페이지가 표시되는지 확인한다.', () => {
cy.visit('/recruitment');
cy.intercept('GET', '/api/recruitment?page=*').as('getRecruitmentList');

cy.wait('@getRecruitmentList').then((interception) => {
contentData = interception.response?.body?.data?.content || [];
cy.get('[data-cy="recruitment-title"]').should('contain', testRecruitmentData.title);
cy.get('[data-cy="recruitment-status"]').should('contain', '진행');

cy.wrap(contentData).as('recruitmentListData');
cy.log(JSON.stringify(contentData, null, 1));
cy.window().then((win) => {
cy.stub(win, 'open').as('windowOpen');
});

cy.get('@recruitmentListData').then((recruitmentListData) => {
// Cypress 데이터가 배열인지 확인하고 변환
const recruitmentArray = Array.isArray(recruitmentListData) ? recruitmentListData : recruitmentListData.toArray(); // 배열로 변환

recruitmentArray.forEach((item: IContent, index: number) => {
cy.log(`Recruitment item ${index}:`, JSON.stringify(item, null, 1));
});

// 배열에서 'OPEN' 상태를 가진 공고 찾기
const openRecruitment = recruitmentArray.find((item: IContent) => item.status === 'OPEN');

if (!openRecruitment) {
cy.log("현재 '진행'인 채용 공고가 없습니다.");
return; // `OPEN` 상태가 없으면 클릭 테스트를 건너뛰기
}

// `OPEN` 상태 데이터가 있을 경우 테스트 진행
cy.intercept('GET', `/api/recruitment/${openRecruitment.id}`).as('getRecruitmentData');
cy.window().then((win) => {
cy.stub(win, 'open').as('windowOpen');
});

// `OPEN` 상태의 채용 공고 클릭
cy.get(`[data-cy="post-item-${openRecruitment.id}"]`).click();

// API 요청이 성공적으로 호출되는지 확인
cy.wait('@getRecruitmentData').then((interception) => {
recruitmentData = interception.response?.body?.data;
expect(recruitmentData).toBeDefined();
expect(recruitmentData).toHaveProperty('link');
cy.get('[data-cy="recruitment-title"]')
.contains(testRecruitmentData.title)
.should('be.visible')
.parent()
.parent()
.then(($postItem) => {
cy.wrap($postItem).click();

// `window.open` 호출 및 URL 확인
cy.get('@windowOpen').should('be.calledOnce');
cy.get('@windowOpen').should('be.calledWithExactly', recruitmentData.link, '_blank');
cy.get('@windowOpen').should('be.calledOnce').and('be.calledWithExactly', testRecruitmentData.link, '_blank');
});
});
});
});

Expand All @@ -106,30 +77,23 @@ describe('PA 페이지에서 채용 공고를 수정하고 PP 화면에 정상

it('PP 페이지에서 수정된 채용 공고가 정상적으로 표시되는지 확인한다.', () => {
cy.visit('/recruitment');
cy.intercept('GET', '/api/recruitment?page=*').as('getRecruitmentList');

cy.wait('@getRecruitmentList').then((interception) => {
const contentData = interception.response?.body?.data?.content || [];
cy.wrap(contentData).as('recruitmentListData');
cy.log(JSON.stringify(contentData, null, 1));
});

cy.get('@recruitmentListData').then((recruitmentListData) => {
const titleExists = recruitmentListData.some((item) => item.title === '그래픽디자이너 채용 (신입)');
expect(titleExists).to.be.true;
});
cy.get('[data-cy="recruitment-title"]').should('contain', testRecruitmentData.title);
cy.get('[data-cy="recruitment-status"]').should('contain', '마감');
});
});

describe('PA 페이지에서 채용 공고를 삭제하고 PP 화면에 정상적으로 표시되는지 확인한다.', () => {
before(() => {
login();
cy.fixture<RecruitmentData>('Recruitment/recruitment_update_data.json').then((data) => {
testRecruitmentData = data;
});
});

it('채용 공고 관리 페이지에서 채용 공고를 삭제한다.', () => {
cy.visit('/promotion-admin/recruitment/manage');

cy.contains('[data-cy="posted-recruitment-title"]', '그래픽디자이너 채용 (신입)')
cy.contains('[data-cy="posted-recruitment-title"]', testRecruitmentData.title)
.closest('[data-cy="recruitment-list-item"]')
.find('[data-cy="delete-button"]')
.click();
Expand All @@ -138,19 +102,12 @@ describe('PA 페이지에서 채용 공고를 삭제하고 PP 화면에 정상

it('PP 페이지에서 채용 공고가 정상적으로 삭제되었는지 확인한다.', () => {
cy.visit('/recruitment');
cy.intercept('GET', '/api/recruitment?page=*').as('getRecruitmentList');

cy.wait('@getRecruitmentList').then((interception) => {
const contentData = interception.response?.body?.data?.content || [];
cy.wrap(contentData).as('recruitmentListData');
cy.log(JSON.stringify(contentData, null, 1));
});

cy.get('@recruitmentListData').then((recruitmentListData) => {
const titleExists = recruitmentListData.some((item) => item.title === '그래픽디자이너 채용 (신입)');

// '그래픽디자이너 채용 (신입)' 공고가 없는지 확인
expect(titleExists).to.be.false;
cy.get('body').then(($body) => {
if ($body.find('[data-cy="recruitment-title"]').length > 0) {
cy.get('[data-cy="recruitment-title"]').contains(testRecruitmentData.title).should('not.exist');
} else {
cy.log('No recruitment title elements found.');
}
});
});
});
Expand All @@ -160,7 +117,6 @@ describe('PA 페이지에서 채용 공고를 삭제하고 PP 화면에 정상
const testImage = 'cypress/fixtures/Recruitment/bonus.png';
const testImage2 = 'cypress/fixtures/Recruitment/long_service.png';
let testBenefitData: BenefitData;
let benefitData: IBenefit[];

describe('PA 페이지에서 새로운 사내 복지를 등록하고 PP 화면에 정상적으로 표시되는지 확인한다.', () => {
before(() => {
Expand Down Expand Up @@ -190,18 +146,8 @@ describe('PA 페이지에서 새로운 사내 복지를 등록하고 PP 화면

it('PP 페이지에서 새롭게 등록된 사내 복지가 정상적으로 표시되는지 확인한다.', () => {
cy.visit('/recruitment');
cy.intercept('GET', '/api/benefit').as('getBenefitsData');
cy.wait('@getBenefitsData').then((interception) => {
const benefitData = interception.response?.body?.data || [];

cy.wrap(benefitData).as('benefitsData');
cy.log(JSON.stringify(benefitData, null, 1));

cy.get('@benefitsData').then((data) => {
const hasIncentive = data.some((item) => item.title === '테스트 등록 제목');
expect(hasIncentive).to.be.true;
});
});
cy.get('[data-cy="benefit-title"]').should('contain', testBenefitData.title);
cy.get('[data-cy="benefit-content"]').should('contain', testBenefitData.content);
});
});

Expand Down Expand Up @@ -229,18 +175,8 @@ describe('PA 페이지에서 사내 복지를 수정하고 PP 화면에 정상

it('PP 페이지에서 수정된 사내 복지가 정상적으로 표시되는지 확인한다.', () => {
cy.visit('/recruitment');
cy.intercept('GET', '/api/benefit').as('getBenefitsData');
cy.wait('@getBenefitsData').then((interception) => {
const benefitData = interception.response?.body?.data || [];

cy.wrap(benefitData).as('benefitsData');
cy.log(JSON.stringify(benefitData, null, 1));

cy.get('@benefitsData').then((data) => {
const hasIncentive = data.some((item) => item.title === '테스트 수정 제목');
expect(hasIncentive).to.be.true;
});
});
cy.get('[data-cy="benefit-title"]').should('contain', testBenefitData.title);
cy.get('[data-cy="benefit-content"]').should('contain', testBenefitData.content);
});
});

Expand All @@ -260,18 +196,12 @@ describe('PA 페이지에서 사내 복지를 삭제하고 PP 화면에 정상

it('PP 페이지에서 사내 복지가 정상적으로 삭제되었는지 확인한다.', () => {
cy.visit('/recruitment');
cy.intercept('GET', '/api/benefit').as('getBenefitsData');
cy.wait('@getBenefitsData').then((interception) => {
const benefitData = interception.response?.body?.data || [];

cy.wrap(benefitData).as('benefitsData');
cy.log(JSON.stringify(benefitData, null, 1));
});

cy.get('@benefitsData').then((benefitsData) => {
const titleExists = benefitsData.some((item) => item.title === '테스트 수정 제목');

expect(titleExists).to.be.false;
cy.get('body').then(($body) => {
if ($body.find('[data-cy="benefit-title"]').length > 0) {
cy.get('[data-cy="benefit-title"]').contains(testRecruitmentData.title).should('not.exist');
} else {
cy.log('No benefit title elements found.');
}
});
});
});
Expand Down Expand Up @@ -302,87 +232,4 @@ describe('PP recruitment 페이지가 정상적으로 표시되는지 확인한
);
cy.get('@windowOpen').should('be.calledWithExactly', expectedURL, '_blank');
});

it('사용자는 Recruitment Section에서 현재 "예정" 또는 "진행" 또는 "마감" 상태의 채용 공고를 확인할 수 있다.', () => {
cy.intercept('GET', '/api/recruitment?page=*').as('getRecruitmentList');
cy.wait('@getRecruitmentList').then((interception) => {
contentData = interception.response?.body?.data?.content || [];

cy.wrap(contentData).as('recruitmentListData');
cy.log(JSON.stringify(contentData, null, 1));

cy.get('@recruitmentListData').then((data) => {
const preparingCount = data.filter((item) => item.status === 'PREPARING').length;
const openCount = data.filter((item) => item.status === 'OPEN').length;
const closeCount = data.filter((item) => item.status === 'CLOSE').length;

cy.log(`진행 예정 (PREPARING): ${preparingCount}`);
cy.log(`진행중 (OPEN): ${openCount}`);
cy.log(`마감 (CLOSE): ${closeCount}`);

// 기대치 확인 예시 (테스트 검증용)
expect(preparingCount).to.be.a('number');
expect(openCount).to.be.a('number');
expect(closeCount).to.be.a('number');
});
});
});

it('사용자는 "진행" 상태의 채용 공고를 클릭하면 해당 공고 정보를 확인할 수 있는 페이지를 새 창에서 확인할 수 있다.', () => {
cy.intercept('GET', '/api/recruitment?page=*').as('getRecruitmentList');

cy.wait('@getRecruitmentList').then((interception) => {
contentData = interception.response?.body?.data?.content || [];

cy.wrap(contentData).as('recruitmentListData');
cy.log(JSON.stringify(contentData, null, 1));
});

cy.get('@recruitmentListData').then((recruitmentListData) => {
recruitmentListData.forEach((item, index) => {
cy.log(`Recruitment item ${index}:`, JSON.stringify(item, null, 1));
});

const openRecruitment = recruitmentListData.find((item) => item.status === 'OPEN');

if (!openRecruitment) {
cy.log("현재 '진행'인 채용 공고가 없습니다.");
return; // `OPEN` 상태가 없으면 클릭 테스트를 건너뛰기
}

// `OPEN` 상태 데이터가 있을 경우 테스트 진행
cy.intercept('GET', `/api/recruitment/${openRecruitment.id}`).as('getRecruitmentData');
cy.window().then((win) => {
cy.stub(win, 'open').as('windowOpen');
});

// `OPEN` 상태의 채용 공고 클릭
cy.get(`[data-cy="post-item-${openRecruitment.id}"]`).click();

// API 요청이 성공적으로 호출되는지 확인
cy.wait('@getRecruitmentData').then((interception) => {
recruitmentData = interception.response?.body?.data;
expect(recruitmentData).to.have.property('link');

// `window.open` 호출 및 URL 확인
cy.get('@windowOpen').should('be.calledOnce');
cy.get('@windowOpen').should('be.calledWithExactly', recruitmentData.link, '_blank');
});
});
});

it('사용자는 Benefit Section에서 사내 복지를 확인할 수 있다.', () => {
cy.intercept('GET', '/api/benefit').as('getBenefitsData');
cy.wait('@getBenefitsData').then((interception) => {
benefitData = interception.response?.body?.data || [];

cy.wrap(benefitData).as('benefitsData');
cy.log(JSON.stringify(benefitData, null, 1));
cy.get('@benefitsData').then((data) => {
cy.log(`총 사내 복지 수: ${data.length}`);

expect(data.length).to.be.a('number');
});
});
});
});
2 changes: 1 addition & 1 deletion cypress/fixtures/Recruitment/recruitment_submit_data.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"title": "그래픽디자이너 채용 (경력직)",
"link": "https://m.saramin.co.kr/job-search/company-info-view/recruit?csn=cnIrYWJNNm1GRXdyd0dBckJuZXJUUT09&t_ref_content=generic",
"startDate": "2024-11-01",
"deadline": "2024-11-30"
"deadline": "2024-12-31"
}
24 changes: 0 additions & 24 deletions cypress/support/recruitmentTypes.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,3 @@
export type IContent = {
id: number;
status: string;
title: string;
};

export interface IRecruitment {
id: number;
title: string;
startDate: string;
deadline: string;
status: string;
createdAt: string;
link: string;
}

export interface IBenefit {
id: number;
imageUrl: string;
imageFileName: string;
title: string;
content: string;
}

export interface RecruitmentData {
title: string;
link: string;
Expand Down
39 changes: 25 additions & 14 deletions src/components/PromotionAdmin/Request/UserInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import React, { useState } from 'react';
import styled from 'styled-components';

interface UserInfoProps {
clickedRequest: IRequestData;
}
const UserInfo: React.FC<UserInfoProps> = ({ clickedRequest }) => {
clickedRequest: IRequestData;
}

const UserInfo: React.FC<UserInfoProps> = ({ clickedRequest }) => {
const [userInfoExpanded, setUserInfoExpanded] = useState(false);

const toggleUserInfoExpansion = () => {
Expand Down Expand Up @@ -44,15 +44,26 @@ interface UserInfoProps {
<UserInfoData>
<ul>
{clickedRequest?.fileUrlList.map((url: string, index: number) => {
const fileName = url.split('amazonaws.com/')[1];
return (
<li key={index}>
-{' '}
<Link href={url} target='_blank' rel='noopener noreferrer'>
{fileName}
</Link>
</li>
);
try {
const decodedUrl = decodeURIComponent(url);
const fileName = decodedUrl.split('amazonaws.com/')[1];

return (
<li key={index}>
-{' '}
<Link href={decodedUrl} target='_blank' rel='noopener noreferrer'>
{fileName}
</Link>
</li>
);
} catch (error) {
console.error('Invalid URL or decoding error:', url);
return (
<li key={index}>
- <span>파일명 표시 오류</span>
</li>
);
}
})}
</ul>
</UserInfoData>
Expand All @@ -69,7 +80,7 @@ const UserInfoWrapper = styled.div`
`;

const UserInfoTitle = styled.div`
width: fit-content;
width: fit-content;
cursor: pointer;
color: gray;
font-weight: bold;
Expand Down
Loading

0 comments on commit 6830363

Please sign in to comment.