Queue multiple offline Week-to-Today pulls #1250

Merged
rockachopa merged 9 commits from timmy/1249-queue-offline-week-pulls into main 2026-08-22 04:52:49 +00:00
Showing only changes of commit 2e8efdb2bb - Show all commits

View File

@ -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