46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import { describe, it } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { emitGamificationEvent } from "../../../src/lib/gamification/events";
|
|
import { getDbInstance } from "../../../src/lib/db/core";
|
|
|
|
describe("Gamification Events", () => {
|
|
it("does not throw for valid event", async () => {
|
|
await assert.doesNotReject(emitGamificationEvent({ apiKeyId: "test-user", action: "request" }));
|
|
});
|
|
|
|
it("does not throw for missing apiKeyId", async () => {
|
|
await assert.doesNotReject(emitGamificationEvent({ apiKeyId: "", action: "request" }));
|
|
});
|
|
|
|
it("does not throw for unknown action", async () => {
|
|
await assert.doesNotReject(
|
|
emitGamificationEvent({ apiKeyId: "test-user", action: "unknown" as any })
|
|
);
|
|
});
|
|
|
|
it("checkActionCountBadges counts actions correctly via SQL", async () => {
|
|
// Verifies the SELECT fix — before fix, missing SELECT caused silent SQL error
|
|
const db = getDbInstance();
|
|
|
|
const testKey = `test-badge-${Date.now()}`;
|
|
for (let i = 0; i < 5; i++) {
|
|
db.prepare("INSERT INTO xp_audit_log (api_key_id, action, xp_earned) VALUES (?, ?, ?)").run(
|
|
testKey,
|
|
"request",
|
|
1
|
|
);
|
|
}
|
|
|
|
// Verify the SELECT query works (was broken before fix)
|
|
const row = db
|
|
.prepare(
|
|
"SELECT COALESCE(COUNT(*), 0) AS count FROM xp_audit_log WHERE api_key_id = ? AND action = ?"
|
|
)
|
|
.get(testKey, "request") as { count: number };
|
|
assert.equal(row.count, 5);
|
|
|
|
// Cleanup
|
|
db.prepare("DELETE FROM xp_audit_log WHERE api_key_id = ?").run(testKey);
|
|
});
|
|
});
|