v1.12.29 접속자 요약과 회원 작성 이력 및 댓글 표시 정리

This commit is contained in:
2026-10-21 18:17:03 +09:00
parent 184a971863
commit 51d5de148f
15 changed files with 114 additions and 47 deletions

View File

@@ -401,6 +401,33 @@ test('CSP 수집은 IP 해시 기준 분당 요청 상한을 적용한다', asyn
expect(Number(limitedResponse.headers()['retry-after'])).toBeGreaterThan(0)
})
test('실시간 접속 요약은 표시 제한 밖의 활성 탭까지 집계하고 만료 탭을 제외한다', async ({ request: anonymousApi }) => {
expect((await anonymousApi.get('/admin/api/analytics/realtime')).status()).toBe(401)
try {
await database`
INSERT INTO analytics_active_sessions (session_hash, path, ip_address)
SELECT 'realtime-api-test-' || value, '/post/shared', '198.51.100.' || value
FROM generate_series(1, 21) AS value
`
await database`
INSERT INTO analytics_active_sessions (session_hash, path, ip_address, last_seen_at)
VALUES
('realtime-api-test-extra-1', '/post/shared', '198.51.100.1', now()),
('realtime-api-test-extra-2', '/post/another', '198.51.100.1', now()),
('realtime-api-test-expired', '/post/expired', '198.51.100.99', now() - interval '2 minutes')
`
const response = await adminApi.get('/admin/api/analytics/realtime?limit=20')
expect(response.status()).toBe(200)
const result = await response.json()
expect(result.summary).toMatchObject({ onlineNow: 21, anonymousNow: 21, loggedInNow: 0, openPageCount: 23 })
expect(result.sessions).toHaveLength(20)
expect(result.sessions.find((session) => session.ipAddress === '198.51.100.1')).toMatchObject({ pageCount: 3 })
expect(result.sessions.some((session) => session.ipAddress === '198.51.100.99')).toBe(false)
} finally {
await database`DELETE FROM analytics_active_sessions WHERE session_hash LIKE 'realtime-api-test-%'`
}
})
test('미디어 카탈로그 reconcile과 DB 목록 계약 및 fallback을 유지한다', async () => {
const uploadRoot = process.env.SORI_TEST_UPLOAD_ROOT
const mediaDirectory = join(uploadRoot, 'posts', 'catalog-api-test')