중앙 이전 기록 스키마와 버전 정규화기를 도입하고, 재실행 시 현행 계정 상태를 보존한다. 카카오 인증 뒤 이관 비밀번호를 1회 설정하는 흐름과 비카카오 계정용 안전한 CLI 복구 경로를 추가한다.
25 lines
1.0 KiB
TypeScript
25 lines
1.0 KiB
TypeScript
import type { PoolClient } from 'pg';
|
|
import { describe, expect, it, vi } from 'vitest';
|
|
|
|
import { quoteQualifiedIdentifier, upsertRows } from '../src/db.js';
|
|
|
|
describe('qualified archive identifiers', () => {
|
|
it('quotes a schema-qualified table and still parameterizes values', async () => {
|
|
const query = vi.fn().mockResolvedValue({});
|
|
await upsertRows(
|
|
{ query } as unknown as PoolClient,
|
|
'legacy_archive.general',
|
|
[{ id: 1, data: { ok: true } }],
|
|
['id']
|
|
);
|
|
expect(query).toHaveBeenCalledOnce();
|
|
expect(query.mock.calls[0]?.[0]).toContain('INSERT INTO "legacy_archive"."general"');
|
|
expect(query.mock.calls[0]?.[1]).toEqual([1, JSON.stringify({ ok: true })]);
|
|
});
|
|
|
|
it.each(['legacy_archive.general.extra', 'legacy-archive.general', 'legacy_archive.General', 'public.;drop'])(
|
|
'rejects unsafe qualified identifier %s',
|
|
(value) => expect(() => quoteQualifiedIdentifier(value)).toThrow('Unsafe SQL identifier')
|
|
);
|
|
});
|