Files
ytplayer/frontend/server-backfill.test.js
2026-10-03 17:56:01 +08:00

27 lines
2.1 KiB
JavaScript

const test = require('node:test');
const assert = require('node:assert/strict');
const { createReporter } = require('./server-backfill.js');
const meta={id:'0gfX0dFLaBc',title:'Because You are God',artist:'Cathedral of Praise Worship',duration:240,thumbnail:'blob:device-art'};
test('first playback reports known metadata once per video per session',()=>{
const requests=[];const reporter=createReporter({fetch:(url,options)=>{requests.push({url,options});return Promise.resolve({ok:true});}});
reporter.report(meta);reporter.report(meta);reporter.report({...meta,id:'bbbbbbbbbbb'});
assert.equal(requests.length,2);assert.equal(requests[0].url,'/api/media/0gfX0dFLaBc/meta');
const card=JSON.parse(requests[0].options.body);assert.equal(card.channel,meta.artist);assert.equal(card.duration,240);assert.equal(card.thumbnail,undefined);
assert.equal(requests[0].options.method,'POST');
});
test('offline plays defer until online and repeated events do not multiply reports',()=>{
let online=false;const requests=[];const reporter=createReporter({online:()=>online,fetch:(...args)=>{requests.push(args);return Promise.resolve();}});
reporter.report(meta);reporter.report(meta);reporter.flush();assert.equal(requests.length,0);
online=true;reporter.flush();reporter.flush();reporter.report(meta);assert.equal(requests.length,1);
});
test('uploads, edits, unknown titles and disabled native shells never report',()=>{
const requests=[];const fetch=(...args)=>{requests.push(args);};const reporter=createReporter({fetch});
for(const item of [{...meta,id:'upl_123'},{...meta,custom:true},{...meta,upload:true},{...meta,title:meta.id},{...meta,title:''}])reporter.report(item);
createReporter({fetch,enabled:()=>false}).report(meta);assert.equal(requests.length,0);
});
test('synchronous and rejected network errors are isolated from playback',async()=>{
assert.doesNotThrow(()=>createReporter({fetch:()=>{throw new Error('offline');}}).report(meta));
assert.doesNotThrow(()=>createReporter({fetch:()=>Promise.reject(new Error('offline'))}).report(meta));
await new Promise(resolve=>setImmediate(resolve));
});