feat: 계정 Web Push 전달 기반과 사건 판정을 추가한다
게임 상태 변경과 같은 트랜잭션에 내구성 outbox를 기록하고 Gateway가 계정 설정과 기기 구독으로 fan-out하도록 한다. 전역 기본값은 비활성으로 유지하며 migration과 회귀 테스트를 함께 추가한다.
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
||||
import { tmpdir } from 'node:os';
|
||||
import path from 'node:path';
|
||||
|
||||
import { afterEach, describe, expect, it } from 'vitest';
|
||||
|
||||
import { resolveGatewayApiConfigFromEnv } from '../src/config.js';
|
||||
|
||||
const requiredEnv = {
|
||||
GAME_TOKEN_SECRET: 'test-game-token-secret',
|
||||
KAKAO_REST_KEY: 'test-kakao-key',
|
||||
KAKAO_REDIRECT_URI: 'https://gateway.test.invalid/gateway/oauth/callback',
|
||||
};
|
||||
|
||||
const tempDirectories: string[] = [];
|
||||
|
||||
afterEach(() => {
|
||||
for (const directory of tempDirectories.splice(0)) rmSync(directory, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
describe('resolveGatewayApiConfigFromEnv web push', () => {
|
||||
it('stays disabled without reading a configured private-key file', () => {
|
||||
const config = resolveGatewayApiConfigFromEnv({
|
||||
...requiredEnv,
|
||||
WEB_PUSH_ENABLED: 'false',
|
||||
WEB_PUSH_VAPID_PRIVATE_KEY_FILE: '/does/not/exist',
|
||||
});
|
||||
|
||||
expect(config.webPushEnabled).toBe(false);
|
||||
expect(config.webPushVapidPrivateKey).toBeUndefined();
|
||||
});
|
||||
|
||||
it('reads the VAPID private key from a file only when enabled', () => {
|
||||
const directory = mkdtempSync(path.join(tmpdir(), 'sammo-web-push-config-'));
|
||||
tempDirectories.push(directory);
|
||||
const privateKeyFile = path.join(directory, 'vapid-private-key');
|
||||
writeFileSync(privateKeyFile, 'test-private-key\n', { mode: 0o600 });
|
||||
|
||||
const config = resolveGatewayApiConfigFromEnv({
|
||||
...requiredEnv,
|
||||
WEB_PUSH_ENABLED: 'true',
|
||||
WEB_PUSH_VAPID_SUBJECT: 'mailto:admin@test.invalid',
|
||||
WEB_PUSH_VAPID_PUBLIC_KEY: 'test-public-key',
|
||||
WEB_PUSH_VAPID_PRIVATE_KEY_FILE: privateKeyFile,
|
||||
});
|
||||
|
||||
expect(config.webPushEnabled).toBe(true);
|
||||
expect(config.webPushVapidPrivateKey).toBe('test-private-key');
|
||||
});
|
||||
|
||||
it('fails closed when activation is incomplete', () => {
|
||||
expect(() =>
|
||||
resolveGatewayApiConfigFromEnv({
|
||||
...requiredEnv,
|
||||
WEB_PUSH_ENABLED: 'true',
|
||||
})
|
||||
).toThrow(/WEB_PUSH_ENABLED requires/u);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user