Fix desktop quiz submission and keep runs enabled until cancelled

This commit is contained in:
2026-10-06 02:23:01 +08:00
parent 08c9e0aa4d
commit 606d264917
7 changed files with 218 additions and 96 deletions
+6 -6
View File
@@ -9,14 +9,14 @@ let passed = 0;
async function test(name, fn) { await fn(); ++passed; console.log(`PASS ${name}`); }
function detail(overrides = {}) {
return {course: {id: ID, courseName: '课程一', status: 'LEARNING', completedAt: null,
examRequired: true, examPassed: true}, resources: [
examRequired: true, examPassed: true,examScorePercent:100}, resources: [
{id: RID, name: '视频一', type: 'VIDEO', sortNo: 1, completed: false, playable: true},
{id: '2093583972926885888', name: '视频二', type: 'VIDEO', sortNo: 2, completed: false, playable: true}], ...overrides};
}
function harness() {
function harness({sessionEntries=[]}={}) {
let now = 100000;
class TestDate extends Date { static now() { return now; } }
const storage = new Map(), session = new Map(), selectors = new Map();
const storage = new Map(), session = new Map(sessionEntries), selectors = new Map();
function eventSurface(){
const listeners=new Map();
return {addEventListener(type,fn,options){const list=listeners.get(type)||[];list.push({fn,capture:options===true||!!options?.capture});listeners.set(type,list);},
@@ -41,13 +41,13 @@ function harness() {
setInterval() {}};
const source = fs.readFileSync('./icampus-study-helper.user.js', 'utf8').replace(
'setInterval(() => { void tick(); }, 1000);',
`window.testing = {receive, stop, tick, tickCourse, tickQuiz, monitor, details, holdLease, waitMedia, recoverMedia, mount, setBackgroundEnabled,
`window.testing = {receive, stop, park, tick, tickCourse, tickQuiz, monitor, details, holdLease, waitMedia, recoverMedia, mount, setBackgroundEnabled,
pendingCourse(id){expectedCourse=id;courseNavigationPending=true;navigatingUntil=Date.now()+20000;},
recovered(id){recoveryUsed.add('${ID}/'+id);},
begin(){running=true;runNumber++;mode={value:'all'};startAt=Date.now()-1000;},
begin(){armed=true;running=true;runNumber++;mode={value:'all'};startAt=Date.now()-1000;persistIntent();},
track(v){active={video:v,id:'${RID}',courseId:'${ID}',src:v.currentSrc,lastPosition:v.currentTime,progressedAt:Date.now(),started:Date.now()};lastNetworkAt=Date.now();},
pending(){courseNavigationPending=true;navigatingUntil=Date.now()-1;},
get state(){return {running,status,active,courses,packagesAt,busy,bank,lastExam,quiz};}};`);
get state(){return {armed,waiting,running,status,active,courses,packagesAt,busy,bank,lastExam,quiz};}};`);
vm.runInNewContext(source, context);
const api = window.testing;
const video = {currentTime: 120, currentSrc: 'media', readyState: 4, isConnected: true, playbackRate: 2,