feat: Añadir pruebas unitarias para la gestión de misiones y logros, incluyendo la generación de misiones diarias y la reclamación de recompensas.
This commit is contained in:
103
test/unit/questsAchievements.unit.ts
Normal file
103
test/unit/questsAchievements.unit.ts
Normal file
@@ -0,0 +1,103 @@
|
||||
import { prisma } from "../../src/core/database/prisma";
|
||||
import {
|
||||
generateDailyQuests,
|
||||
updateQuestProgress,
|
||||
claimQuestReward,
|
||||
getPlayerQuests,
|
||||
} from "../../src/game/quests/service";
|
||||
import { seedAchievements } from "../../src/game/achievements/seed";
|
||||
import {
|
||||
checkAchievements,
|
||||
getPlayerAchievements,
|
||||
} from "../../src/game/achievements/service";
|
||||
import {
|
||||
ensureGuildExists,
|
||||
ensureUserExists,
|
||||
} from "../../src/game/core/userService";
|
||||
|
||||
async function resetDb(guildId: string) {
|
||||
// Delete created quests, achievements and progress for a clean test
|
||||
await prisma.questProgress.deleteMany({ where: { guildId } }).catch(() => {});
|
||||
await prisma.quest.deleteMany({ where: { guildId } }).catch(() => {});
|
||||
await prisma.playerAchievement
|
||||
.deleteMany({ where: { guildId } })
|
||||
.catch(() => {});
|
||||
await prisma.achievement.deleteMany({ where: { guildId } }).catch(() => {});
|
||||
}
|
||||
|
||||
async function runTests() {
|
||||
const guildId = "test-guild-1";
|
||||
const userId = "user-test-1";
|
||||
|
||||
// Make sure guild and user exist to satisfy FK constraints
|
||||
await ensureGuildExists(guildId, "Test Guild");
|
||||
await ensureUserExists(userId);
|
||||
|
||||
await resetDb(guildId);
|
||||
|
||||
console.log("Seeding achievements...");
|
||||
await seedAchievements(guildId);
|
||||
const achBefore = await getPlayerAchievements(userId, guildId);
|
||||
console.log("Player achievements before:", achBefore);
|
||||
|
||||
console.log("Generating daily quests...");
|
||||
const count = await generateDailyQuests(guildId);
|
||||
console.log("Daily quests generated:", count);
|
||||
|
||||
const quests = await getPlayerQuests(userId, guildId);
|
||||
console.log(
|
||||
"Player quests after generate:",
|
||||
Object.keys(quests).reduce((acc, k) => acc + (quests as any)[k].length, 0)
|
||||
);
|
||||
|
||||
// Pick a quest from mining if any
|
||||
const daily = quests.daily as any[];
|
||||
if (daily.length > 0) {
|
||||
const q = daily[0].quest;
|
||||
console.log("Testing progress update for quest:", q.key);
|
||||
const updates = await updateQuestProgress(
|
||||
userId,
|
||||
guildId,
|
||||
(q.requirements as any).type,
|
||||
(q.requirements as any).count
|
||||
);
|
||||
console.log(
|
||||
"Quests completed by updateQuestProgress:",
|
||||
updates.map((u) => u.key)
|
||||
);
|
||||
|
||||
// Claim reward
|
||||
const progressRows = await prisma.questProgress.findMany({
|
||||
where: { userId, guildId, questId: q.id },
|
||||
});
|
||||
if (progressRows.length > 0) {
|
||||
const res = await claimQuestReward(userId, guildId, q.id).catch((e) => {
|
||||
console.error("Claim failed", e);
|
||||
return null;
|
||||
});
|
||||
console.log("Claim result:", res);
|
||||
}
|
||||
} else {
|
||||
console.warn("No daily quests found in test run — skipping claim flow");
|
||||
}
|
||||
|
||||
// Trigger achievements check by running checkAchievements with a trigger from seeded achievements
|
||||
console.log("Checking achievements via trigger mine_count");
|
||||
const unlocked = await checkAchievements(userId, guildId, "mine_count");
|
||||
console.log(
|
||||
"Achievements unlocked:",
|
||||
unlocked.map((a) => a.key)
|
||||
);
|
||||
|
||||
const achAfter = await getPlayerAchievements(userId, guildId);
|
||||
console.log("Player achievements after:", achAfter);
|
||||
|
||||
console.log("Tests finished.");
|
||||
}
|
||||
|
||||
runTests()
|
||||
.then(() => process.exit(0))
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user