Files
2025-06-08 20:21:37 +09:00

103 lines
4.2 KiB
JavaScript

const { expect } = require('chai');
const sinon = require('sinon');
const proxyquire = require('proxyquire');
const fs = require('fs').promises;
// models의 각 모델을 미리 stub
const mockModels = {
EventScore: { findAll: sinon.stub() },
Member: { findByPk: sinon.stub() },
Club: { findByPk: sinon.stub() }
};
// proxyquire로 averageService를 models stub과 함께 불러오기
let averageService;
// averageService를 require (이 시점에 models가 이미 stub됨)
describe('averageService', () => {
let sandbox;
let freshAverageService;
beforeEach(() => {
sandbox = sinon.createSandbox();
mockModels.EventScore.findAll.reset();
mockModels.Member.findByPk.reset();
mockModels.Club.findByPk.reset();
freshAverageService = proxyquire.noCallThru().load('../../services/averageService', {
'../models': mockModels
});
});
afterEach(() => {
sandbox.restore();
});
describe('calculateMemberAverage', () => {
it('점수가 없을 경우 기본값 0을 반환해야 함', async () => {
sandbox.stub(fs, 'mkdir').resolves();
sandbox.stub(fs, 'writeFile').resolves();
sandbox.stub(fs, 'readFile').rejects({ code: 'ENOENT' });
mockModels.EventScore.findAll.resolves([]);
sandbox.stub(freshAverageService, 'getFromCache').resolves(null);
sandbox.stub(freshAverageService, 'setToCache').resolves(true);
sandbox.stub(freshAverageService, 'invalidateCache').resolves(true);
const startDate = new Date('2023-01-01');
const endDate = new Date('2023-12-31');
const result = await freshAverageService.calculateMemberAverage(1, startDate, endDate);
expect(result).to.deep.equal({ average: 0, games: 0, totalScore: 0 });
expect(mockModels.EventScore.findAll.called).to.be.true;
});
it('점수가 있을 경우 올바른 평균을 계산해야 함', async () => {
sandbox.stub(fs, 'mkdir').resolves();
sandbox.stub(fs, 'writeFile').resolves();
sandbox.stub(fs, 'readFile').rejects({ code: 'ENOENT' });
mockModels.EventScore.findAll.resolves([
{ score: 180 }, { score: 200 }, { score: 220 }
]);
sandbox.stub(freshAverageService, 'getFromCache').resolves(null);
sandbox.stub(freshAverageService, 'setToCache').resolves(true);
sandbox.stub(freshAverageService, 'invalidateCache').resolves(true);
const startDate = new Date('2023-01-01');
const endDate = new Date('2023-12-31');
const result = await freshAverageService.calculateMemberAverage(1, startDate, endDate);
expect(result).to.deep.equal({ average: 200, games: 3, totalScore: 600 });
expect(mockModels.EventScore.findAll.called).to.be.true;
});
});
describe('calculateMemberAverageByClubSetting', () => {
it('클럽 설정에 따라 올바른 기간으로 평균을 계산해야 함', async () => {
sandbox.stub(fs, 'mkdir').resolves();
sandbox.stub(fs, 'writeFile').resolves();
sandbox.stub(fs, 'readFile').rejects({ code: 'ENOENT' });
const calculateStub = sandbox.stub().resolves({
average: 185, games: 10, totalScore: 1850
});
mockModels.Member.findByPk.resolves({ id: 1, name: '테스트 회원' });
mockModels.Club.findByPk.resolves({ id: 1, name: '테스트 클럽', averageCalculationPeriod: '최근 3개월' });
const result = await freshAverageService.calculateMemberAverageByClubSetting(1, 1, {
...freshAverageService,
calculateMemberAverage: calculateStub
});
expect(result).to.deep.equal({ average: 185, games: 10, totalScore: 1850 });
expect(mockModels.Member.findByPk.called).to.be.true;
expect(mockModels.Club.findByPk.called).to.be.true;
expect(calculateStub.called).to.be.true;
});
});
describe('invalidateMemberAverageCache', () => {
it('회원 ID에 해당하는 캐시를 무효화해야 함', async () => {
const invalidateCacheStub = sandbox.stub().resolves(true);
const result = await freshAverageService.invalidateMemberAverageCache(1, {
...freshAverageService,
invalidateCache: invalidateCacheStub
});
expect(invalidateCacheStub.calledWith('average:1')).to.be.true;
expect(result).to.be.true;
});
});
});