Queue multiple offline Week-to-Today pulls #1250
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user