가입 트리거 서울 리전 · 탈퇴 시 업로드 파일 삭제 · 위치 인증 위경도 미저장
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import { getAuth } from 'firebase-admin/auth';
|
||||
import { getFirestore } from 'firebase-admin/firestore';
|
||||
import { getStorage } from 'firebase-admin/storage';
|
||||
|
||||
import { bootAdmin, shutdownAdmin, wipeUser } from './support.js';
|
||||
import { fnAccountWithdraw, fnAuthOnCreate, fnSignupConsent } from '../src/account/account.js';
|
||||
@@ -103,6 +104,18 @@ describe('fnAccountWithdraw', () => {
|
||||
expect((await db().doc(`users/${U}/popTransactions/t1`).get()).exists).toBe(true);
|
||||
await expect(getAuth().getUser(U)).rejects.toBeDefined();
|
||||
});
|
||||
|
||||
it.skipIf(!process.env.STORAGE_EMULATOR_HOST)('본인 전용 Storage 경로는 지우고 라운지 글 사진은 남긴다', async () => {
|
||||
await getAuth().createUser({ uid: U });
|
||||
const bucket = getStorage().bucket();
|
||||
const paths = [`users/${U}/profile/photo`, `questProofs/${U}/q1/1.jpg`, `users/${U}/lounge/aaaaaaaaaaaaaaaaaaaa-0`, 'users/other/profile/photo'];
|
||||
for (const p of paths) await bucket.file(p).save('x');
|
||||
await fnAccountWithdraw.run(as(U, {}));
|
||||
const exists = await Promise.all(paths.map(async (p) => (await bucket.file(p).exists())[0]));
|
||||
expect(exists).toEqual([false, false, true, true]);
|
||||
await bucket.file(paths[2]!).delete();
|
||||
await bucket.file(paths[3]!).delete();
|
||||
});
|
||||
});
|
||||
|
||||
describe('카카오 이메일 · 탈퇴 후 재가입', () => {
|
||||
|
||||
@@ -456,8 +456,9 @@ describe('방문 — S-H-PLACE (fn-quest-verify-place)', () => {
|
||||
const logs = await db().collection(`users/${UID}/activityLogs`).get();
|
||||
expect(only(logs.docs).get('rejectReason')).toBe('E-QST-02');
|
||||
const evidence = only(logs.docs).get('evidence') as
|
||||
{ place: { gps: { mocked: boolean } } };
|
||||
expect(evidence.place.gps.mocked).toBe(true);
|
||||
{ place: { location: { mocked: boolean }; gps?: unknown } };
|
||||
expect(evidence.place.location.mocked).toBe(true);
|
||||
expect(evidence.place.gps).toBeUndefined();
|
||||
});
|
||||
|
||||
it('좌표만으로도 반경 안이면 지급한다 — QR · 사진은 추가 수단(C-03)', async () => {
|
||||
@@ -517,8 +518,9 @@ describe('방문 — S-H-PLACE (fn-quest-verify-place)', () => {
|
||||
const result = await call(fnQuestVerifyPlace, { ...q, qr: 'code-ok' });
|
||||
expect(result.rewarded).toBe(100);
|
||||
const ok = (await db().collection(`users/${UID}/activityLogs`).where('verified', '==', true).get()).docs;
|
||||
const evidence = only(ok).get('evidence') as { place: { gps: unknown; qr: { value: string; ok: boolean } } };
|
||||
expect(evidence.place.gps).toBeDefined();
|
||||
const evidence = only(ok).get('evidence') as { place: { location: { distanceM: number }; qr: { value: string; ok: boolean } } };
|
||||
expect(evidence.place.location.distanceM).toBeGreaterThanOrEqual(0);
|
||||
expect(JSON.stringify(evidence)).not.toMatch(/"(lat|lng)"/);
|
||||
expect(evidence.place.qr).toEqual({ value: 'code-ok', ok: true });
|
||||
// GPS 없이(반경 밖) QR 만으로는 0건.
|
||||
await db().doc('quests/place-quest-qr2').set({ type: 'location', placeId: PLACE, verifyMethods: ['gps', 'qr'] });
|
||||
|
||||
@@ -17,7 +17,7 @@ export function bootAdmin(): App {
|
||||
}
|
||||
const existing = getApps()[0];
|
||||
if (existing) return existing;
|
||||
return initializeApp({ projectId: PROJECT_ID });
|
||||
return initializeApp({ projectId: PROJECT_ID, storageBucket: `${PROJECT_ID}.appspot.com` });
|
||||
}
|
||||
|
||||
export async function shutdownAdmin(): Promise<void> {
|
||||
|
||||
Reference in New Issue
Block a user