Files
RedditBot/tests/comment-source-watch.test.ts

65 lines
2.7 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it } from 'vitest';
import Database from 'better-sqlite3';
import { runMigrations } from '../src/database/client.js';
import { CommentSourceWatchRepository } from '../src/database/comment-source-watch-repository.js';
import type { BrowsingThing, RedditPost } from '../src/reddit/api.js';
function post(id: string, createdAtMs: number): RedditPost {
return {
id, name: id, subreddit: 'scene', author: `author-${id}`, title: id,
url: `https://example.test/${id}.jpg`, permalink: `/r/scene/comments/${id}/`, thumbnail: '',
is_self: false, created_utc: createdAtMs / 1_000, over_18: true, spoiler: false,
};
}
function comment(text: string): BrowsingThing {
return {
fullname: 't1_comment', kind: 'comment', subreddit: 'scene', author: 'reader',
permalink: '/r/scene/comments/source/post/comment/', createdAt: 2_000, score: 1,
text, nsfw: true, parentPostId: 'source', distinguished: null, removed: false,
};
}
describe('CommentSourceWatchRepository', () => {
let db: Database.Database;
let repo: CommentSourceWatchRepository;
beforeEach(() => {
db = new Database(':memory:');
runMigrations(db);
repo = new CommentSourceWatchRepository(db);
});
afterEach(() => db.close());
it('durably rotates source posts until their configured watch window expires', () => {
expect(repo.refreshSources([post('older', 1_000), post('newer', 2_000)], 10_000, 3_000))
.toEqual({ added: 2, active: 2, expired: 0 });
expect(repo.nextSource('SCENE', 3_000)?.id).toBe('newer');
repo.markChecked('newer', 3_100);
expect(repo.nextSource('scene', 3_200)?.id).toBe('older');
const restored = new CommentSourceWatchRepository(db);
expect(restored.nextSource('scene', 3_200)?.id).toBe('older');
expect(restored.refreshSources([], 10_000, 12_001)).toEqual({ added: 0, active: 0, expired: 2 });
});
it('reuses unchanged verdicts across restarts and reclassifies edited bodies', () => {
const original = comment('I would love that done to me');
const verdict = {
id: original.fullname, qualifies: true, expressedGender: 'female' as const,
confidence: 0.94, evidence: 'recipient role',
};
repo.recordVerdict(original, verdict, 4_000);
expect(new CommentSourceWatchRepository(db).getVerdict(original)).toEqual({ ...verdict, evidence: '' });
const stored = db.prepare(`
SELECT body_sha256, verdict_json FROM comment_source_comment_observations WHERE comment_id = ?
`).get(original.fullname);
expect(JSON.stringify(stored)).not.toContain(original.text);
expect(JSON.stringify(stored)).not.toContain(verdict.evidence);
expect(repo.getVerdict(comment('Edited: I would really love that done to me'))).toBeNull();
});
});