본문 바로가기
내일배움캠프/축구팀 관리 프로젝트

축구팀 관리 프로젝트 27일차 - 경기 생성 및 결과 테스트 코드 작성

by 코드스니펫 2024. 2. 8.
반응형

축구팀 관리 프로젝트 27일차 - 경기 생성 및 결과 테스트 코드 작성

 

홈팀 경기결과 등록

 

현재 작업중인 포메이션 추천 로직을 위해 축구팀 경기데이터가 필요했습니다. 하지만 기획 및 테이블 구조상 외부에서 자료를 가져오기가 어려웠습니다. 그래서 Jest로 더미데이터를 만들었습니다. 

 

 

Jest로 경기 데이터 만들기

 

 

축구팀 관리 프로젝트 19일차 - jest로 dummy data 생성 중, 사용법

축구팀 관리 프로젝트 19일차 - jest로 dummy data 생성 중, 사용법 jest로 코드 테스트 및 더미 데이터를 만드는 로직을 작성 중입니다. 제목이 만드는 중이라는 건 아직 다 못 만들었다는 뜻입니다.

lemonlog.tistory.com

 

사실 이전에 만들어놓은 jest 코드가 있었습니다. 하지만 이번에 다시 돌려보니 오류가 발생했었습니다. 원인을 찾아보니 팀원 정보 생성할 때 프로필 정보를 저장하는 로직이 있었는데, 그 API를 다른 팀원이 수정했었습니다. 그 변경된 부분이 반영되지 않아서 오류가 발생했었습니다. 

 

이부분 수정하고, 추가로 경기 생성시 날짜 중복이 없도록 조건 추가도 하였습니다. 기존에는 startDate에서 endDate내에 랜덤으로 아무 날짜를 골라 경기를 생성했는데 그렇게 하게되니 하루에 두 세번 경기가 잡히는 문제가 생겼습니다. 이를 방지하고자 하루에 한 경기만 매칭되도록 날짜 중복을 없애는 로직을 만들었습니다.

 

    //5) 경기 생성
    it('/match/book/accept (POST)', async () => {
        const startDate = new Date('2023-01-01T00:00:00.000Z');
        const endDate = new Date('2024-12-31T00:00:00.000Z');

        // API에서 받아온 경기 날짜 목록을 저장할 배열
        let bookedDates = [];

        // 서버 내부 API 호출을 통해 이미 예약된 경기 날짜 가져오기
        try {
            const response = await request(app.getHttpServer())
                .get(`/match/team/${homeTeamId}`)
                .set('Authorization', `Bearer ${accessTokenHome}`);
            bookedDates = response.body.data.map(match => match.date);
        } catch (error) {
            console.error('API 호출 중 에러 발생:', error);
        }

        // 중복되지 않는 날짜 찾기
        let randomDate, onlyDate;
        do {
            randomDate = faker.date.between({from:startDate, to:endDate});
            onlyDate = randomDate.toISOString().split('T')[0];
        } while (bookedDates.includes(onlyDate));

        console.log('선택된 날짜(중복 없음):', onlyDate);

        const registerMatchDto = {
            date: onlyDate,
            time: getRandomTime(),
            homeTeamId,
            awayTeamId,
            fieldId,
            token: `${accessTokenHome}`,
        };

        console.log('registerMatchDto:', registerMatchDto);

        const response = await request(app.getHttpServer())
            .post(`/match/book/accept`)
            .set('Authorization', `Bearer ${accessTokenHome}`)
            .send({
                date: registerMatchDto.date,
                time: registerMatchDto.time,
                homeTeamId: Number(registerMatchDto.homeTeamId),
                awayTeamId: Number(registerMatchDto.awayTeamId),
                fieldId: Number(registerMatchDto.fieldId),
                token: registerMatchDto.token,
            })
            .expect(201);

        const parsedResponse = JSON.parse(response.text);
        matchId = parsedResponse.id;
        console.log('matchId=', matchId);
    });

    afterAll(async () => {
        await app.close();
    });
});

 

아직 완벽하게 동작하지는 못하지만 계속 수정을 거듭할 예정입니다.

 

테스트 코드 동작 화면

 

 

▼ 이전 작업한 기록입니다 ▼

 

 

축구팀 관리 프로젝트 26일차 - 경기장 조회 페이지네이션 적용

축구팀 관리 프로젝트 26일차 - 경기장 조회 페이지네이션 적용 전날 경기장 데이터를 새로 Mysql에 저장하는 작업을 했습니다. 전국 경기장 데이터가 담긴 csv 파일을 파싱해서 Mysql에 넣었는데 데

lemonlog.tistory.com

 

 

축구팀 관리 프로젝트 25일차 - 2월부터 AWS Public IPv4 요금 부과

축구팀 관리 프로젝트 25일차 - 2월부터 AWS Public IPv4 요금 부과 이전에도 EC2 인스턴스 여러개 생성하다가 요금 부과된 경험이 있어서 AWS 서비스 사용에 더 신중해지기 시작했습니다. 그러다가 오

lemonlog.tistory.com