mirror of
https://github.com/IliesAllali/parenthese.git
synced 2026-11-11 16:12:14 +00:00
La purge des visites de plus d'un an ne passait qu'a l'ouverture de l'onglet Visites par un administrateur : un arbre jamais consulte gardait tout. Elle passe aussi a l'enregistrement d'une visite, au plus une fois par heure, pour tous les arbres. A la suppression d'un compte, ses visites d'autres arbres gardaient son identifiant dans la cle du visiteur : elles restent comptees, sous une cle anonyme. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
35 lines
1.4 KiB
TypeScript
35 lines
1.4 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest'
|
||
|
||
import { recordTreeVisit, VISIT_RETENTION_DAYS } from '../src/lib/tree-visits'
|
||
|
||
function fakeApp() {
|
||
return {
|
||
prisma: {
|
||
treeVisit: {
|
||
findFirst: vi.fn().mockResolvedValue(null),
|
||
create: vi.fn().mockResolvedValue({ id: 'v' }),
|
||
update: vi.fn(),
|
||
deleteMany: vi.fn().mockResolvedValue({ count: 0 }),
|
||
},
|
||
},
|
||
}
|
||
}
|
||
|
||
const request = { headers: { 'user-agent': 'Mozilla/5.0 (iPhone)' }, ip: '203.0.113.10', log: { warn: vi.fn() } }
|
||
|
||
describe('journal des visites', () => {
|
||
it('efface les visites de plus d’un an à l’enregistrement, au plus une fois par heure', async () => {
|
||
const app = fakeApp()
|
||
const before = Date.now()
|
||
await recordTreeVisit(app as never, request as never, 'tree-1', 'share', null)
|
||
await recordTreeVisit(app as never, request as never, 'tree-2', 'share', null)
|
||
|
||
expect(app.prisma.treeVisit.create).toHaveBeenCalledTimes(2)
|
||
expect(app.prisma.treeVisit.deleteMany).toHaveBeenCalledTimes(1)
|
||
const cutoff = app.prisma.treeVisit.deleteMany.mock.calls[0][0].where.createdAt.lt.getTime()
|
||
// Tous les arbres, pas seulement celui qu'on ouvre : un arbre qu'on ne rouvre plus est purgé aussi
|
||
expect(app.prisma.treeVisit.deleteMany.mock.calls[0][0].where).not.toHaveProperty('treeId')
|
||
expect(before - cutoff).toBeGreaterThanOrEqual(VISIT_RETENTION_DAYS * 24 * 60 * 60 * 1000 - 1000)
|
||
})
|
||
})
|