import { describe, expect, it } from "vitest"; import { firestore } from "../../src/firebase"; import { adminPointChange } from "../../src/services/adminPointService"; const uid = "admin-point-service-test-user"; describe("adminPointChange", () => { it("reversalOf 없이 지급해도 원장 문서에 undefined 키가 들어가지 않는다", async () => { // 어드민 웹의 일반 지급은 reversalOf 를 보내지 않는다 — undefined 가 Firestore 까지 // 흘러가면 "Cannot use undefined as a Firestore value" 로 지급 전체가 실패한다. const key = `no-reversal-${Date.now()}`; const wallet = await adminPointChange(uid, 100, "credit", key, "테스트 지급", "admin-uid"); expect(wallet?.availableBalance).toBeGreaterThanOrEqual(100); const entry = await firestore.doc(`users/${uid}/pointLedger/${uid}:admin:${key}`).get(); expect(entry.exists).toBe(true); expect(entry.data()).not.toHaveProperty("reversalOf"); expect(entry.data()).toMatchObject({ adminReason: "테스트 지급", adminActor: "admin-uid", amount: 100 }); }); it("reversalOf 를 명시하면 원장에 그대로 기록된다", async () => { const key = `with-reversal-${Date.now()}`; await adminPointChange(uid, 50, "credit", key, "정정 지급", "admin-uid", "prev-tx-id"); const entry = await firestore.doc(`users/${uid}/pointLedger/${uid}:admin:${key}`).get(); expect(entry.data()).toMatchObject({ reversalOf: "prev-tx-id" }); }); });