이클립스 방어 횟수 즉시 표시·진동 · Music Shake 영상 재생 중 흔들기 판정 · 결과 공유

This commit is contained in:
Sn-Kinos
2026-10-05 21:39:22 +09:00
parent 65669b969e
commit 17c658b272
30 changed files with 1337 additions and 144 deletions
@@ -519,6 +519,24 @@ describe('검증 활동 집계 규칙 — Quest 완료 1건 · 하루 1회 (Camp
expect(reply.rewarded).toBe(60);
});
it('Music Shake — 곡은 지정 영상 링크로 대조하고 · rewardPop 이 없으면 운영값 musicShake.pop · 판정 미달은 보상 0', async () => {
await db().doc('quests/music-link').set({
type: 'musicShake', totalSegments: 10, dailyLimit: 2,
link: { url: 'https://youtu.be/WMweEpGlu_U', title: 'BTS - Butter' },
});
await db().doc('config/policy').set({ musicShake: { pop: 4 } }, { merge: true });
const shake = (perfect: number, miss: number) => call(fnQuestVerifyMusicShake, {
questId: 'music-link', trackId: 'WMweEpGlu_U', totalSegments: 10,
judgement: { perfect, good: 0, miss, maxCombo: perfect },
});
// 3/10 — 임시 성공 문턱 0.5 미달 → 보상 0, 원장 없음.
expect(await codeOf(() => shake(3, 7))).toBe('E-QST-01');
expect((await db().collection(`users/${UID}/popTransactions`).get()).size).toBe(0);
// 5/10 — 문턱 0.5 충족 · perfect 0.5 < B 문턱 0.6 → C(배수 1) → 4.
const reply = await shake(5, 5);
expect(reply.rewarded).toBe(4);
});
it('Music Shake 는 완주마다 1회 · 방문은 1회', async () => {
await db().doc('quests/music-count').set({ type: 'musicShake', trackId: 't1', totalSegments: 10, dailyLimit: 2 });
const shake = () => call(fnQuestVerifyMusicShake, {