diff --git a/src/lib/score.js b/src/lib/score.js new file mode 100644 index 0000000..1c57bf5 --- /dev/null +++ b/src/lib/score.js @@ -0,0 +1,9 @@ +export function computeScore(views, subscribers) { + if (subscribers === null || subscribers === undefined) return null; + return Math.round((views / Math.max(subscribers, 1)) * 100) / 100; +} + +export function shouldSave({ views, score, vidiqScore }, { threshold, minViews }) { + if (vidiqScore !== null && vidiqScore !== undefined) return true; + return score !== null && score !== undefined && views >= minViews && score >= threshold; +} diff --git a/test/score.test.js b/test/score.test.js new file mode 100644 index 0000000..0a8a226 --- /dev/null +++ b/test/score.test.js @@ -0,0 +1,44 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { computeScore, shouldSave } from '../src/lib/score.js'; + +test('computeScore divides views by subscribers', () => { + assert.equal(computeScore(100000, 20000), 5); + assert.equal(computeScore(2500, 1000), 2.5); +}); + +test('computeScore rounds to two decimals', () => { + assert.equal(computeScore(10000, 3000), 3.33); +}); + +test('computeScore never divides by zero', () => { + assert.equal(computeScore(5000, 0), 5000); +}); + +test('computeScore returns null when subscribers are unknown', () => { + assert.equal(computeScore(5000, null), null); + assert.equal(computeScore(5000, undefined), null); +}); + +const settings = { threshold: 5, minViews: 10000 }; + +test('shouldSave accepts a video exactly at both limits', () => { + assert.equal(shouldSave({ views: 10000, score: 5, vidiqScore: null }, settings), true); +}); + +test('shouldSave rejects a score below the threshold', () => { + assert.equal(shouldSave({ views: 50000, score: 4.99, vidiqScore: null }, settings), false); +}); + +test('shouldSave rejects views below the minimum even with a huge score', () => { + assert.equal(shouldSave({ views: 9999, score: 50, vidiqScore: null }, settings), false); +}); + +test('shouldSave rejects a null score without a VidIQ score', () => { + assert.equal(shouldSave({ views: 500000, score: null, vidiqScore: null }, settings), false); +}); + +test('shouldSave accepts any video that has a VidIQ score', () => { + assert.equal(shouldSave({ views: 100, score: null, vidiqScore: 7.5 }, settings), true); + assert.equal(shouldSave({ views: 100, score: 0.01, vidiqScore: 3 }, settings), true); +});