diff --git a/tests/test_week_plan_frontend.py b/tests/test_week_plan_frontend.py index e4d6a16..ba6adf1 100644 --- a/tests/test_week_plan_frontend.py +++ b/tests/test_week_plan_frontend.py @@ -2,6 +2,8 @@ import json import subprocess from pathlib import Path +import pytest + FRONTEND = Path(__file__).parents[1] / "frontend" CONTROLLER = FRONTEND / "week-plan.js" @@ -400,16 +402,25 @@ console.log(JSON.stringify({queuedFirst,queuedSecond,resumed,confirmed,delivered assert result["state"]["revision"] == 9 -def test_week_controller_allows_only_one_tab_to_replay_the_shared_pull_queue(): - result = run_controller(""" -const values=new Map(),held=new Set(); -const storage={getItem:key=>values.get(key)||null,setItem:(key,value)=>values.set(key,value),removeItem:key=>values.delete(key)}; -const locks={request:async(name,_options,work)=>{ +@pytest.mark.parametrize( + "coordinator_setup", + [ + """const locks={request:async(name,_options,work)=>{ if(held.has(name))return work(null); held.add(name);try{return await work({name});}finally{held.delete(name);} }}; const coordinatorA=createOutboxCoordinator({storage,locks,channelFactory:null,tabId:'a'}); -const coordinatorB=createOutboxCoordinator({storage,locks,channelFactory:null,tabId:'b'}); +const coordinatorB=createOutboxCoordinator({storage,locks,channelFactory:null,tabId:'b'});""", + """const coordinatorA=createOutboxCoordinator({storage,locks:null,channelFactory:null,tabId:'a',now:()=>100}); +const coordinatorB=createOutboxCoordinator({storage,locks:null,channelFactory:null,tabId:'b',now:()=>100});""", + ], + ids=["navigator-lock", "storage-lease"], +) +def test_week_controller_allows_only_one_tab_to_replay_the_shared_pull_queue(coordinator_setup): + result = run_controller(""" +const values=new Map(),held=new Set(); +const storage={getItem:key=>values.get(key)||null,setItem:(key,value)=>values.set(key,value),removeItem:key=>values.delete(key)}; +COORDINATOR_SETUP let offline=true,posts=0,release; const gate=new Promise(resolve=>release=resolve); const fetchJson=async(_url,options={})=>{ @@ -431,7 +442,7 @@ const skipped=await second.flushPull(); release(); const confirmed=await firstFlush; console.log(JSON.stringify({posts,skipped,confirmed,pending:first.pendingPull()})); -""") +""".replace("COORDINATOR_SETUP", coordinator_setup)) assert result["posts"] == 1 assert result["skipped"]["lease_skipped"] is True