Files
subwatcher/services/api/test/scoring.test.ts
wisecolt f1a1f093e6 feat: altyazı otomasyon sistemi MVP'sini ekle
Docker tabanlı mikro servis mimarisi ile altyazı otomasyon sistemi altyapısı kuruldu.

- Core (Node.js): Chokidar dosya izleyici, BullMQ iş kuyrukları, ffprobe medya analizi, MongoDB entegrasyonu ve dosya yazma işlemleri.
- API (Fastify): Mock sağlayıcılar, arşiv güvenliği (zip-slip), altyazı doğrulama, puanlama ve aday seçim motoru.
- UI (React/Vite): İş yönetimi paneli, canlı SSE log akışı, manuel inceleme arayüzü ve sistem ayarları.
- Altyapı: Docker Compose (dev/prod), Redis, Mongo ve çevresel değişken yapılandırmaları.
2026-02-15 23:12:24 +03:00

49 lines
1.3 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { chooseBest, scoreCandidateFile } from '../src/lib/scoring.js';
const candidate: any = {
id: 'c1',
provider: 'opensubtitles',
displayName: 'x',
downloadType: 'archiveZip',
downloadUrl: 'mock://x',
lang: 'tr',
releaseHints: ['1080p', 'x265', 'flux'],
scoreHints: [],
isHI: false,
isForced: false
};
describe('scoring', () => {
it('scores tv season/episode match strongly', () => {
const s = scoreCandidateFile('/tmp/show.S01E02.1080p.srt', 'srt', candidate, {
type: 'tv',
title: 'show',
season: 1,
episode: 2,
release: 'FLUX',
languages: ['tr']
});
expect(s?.score).toBeGreaterThan(100);
});
it('disqualifies wrong episode for tv', () => {
const s = scoreCandidateFile('/tmp/show.S01E03.srt', 'srt', candidate, {
type: 'tv',
title: 'show',
season: 1,
episode: 2,
languages: ['tr']
});
expect(s).toBeNull();
});
it('returns ambiguous when top scores are close', () => {
const d = chooseBest([
{ id: 'a', candidateId: 'a', provider: 'x', filePath: '/a', ext: 'srt', lang: 'tr', score: 90, reasons: [] },
{ id: 'b', candidateId: 'b', provider: 'x', filePath: '/b', ext: 'srt', lang: 'tr', score: 88, reasons: [] }
] as any);
expect(d.status).toBe('AMBIGUOUS');
});
});