feat: CI browser journey loses active break state after corrupt-record recovery #1319
|
|
@ -126,7 +126,7 @@ function createTodayTimer({ storage, getLogin, now = () => Date.now(), onChange
|
|||
state.attention_interruption = null;
|
||||
state.search_interruption = null;
|
||||
state.detour_interruption = null;
|
||||
state.timed_break = null;
|
||||
if(running || validBreak(state)?.identity !== identity) state.timed_break=null;
|
||||
return write(state);
|
||||
},
|
||||
activate(identity) {
|
||||
|
|
|
|||
|
|
@ -93,6 +93,35 @@ process.stdout.write(JSON.stringify({reopened,snapshot:timer.snapshot(),pending:
|
|||
}
|
||||
|
||||
|
||||
def test_adopting_paused_state_for_same_item_preserves_valid_local_break():
|
||||
script = TIMER.read_text() + r"""
|
||||
const values = new Map();
|
||||
const storage = {getItem:key=>values.get(key)||null,setItem:(key,value)=>values.set(key,value)};
|
||||
const timer = createTodayTimer({storage,getLogin:()=> 'timmy',now:()=>100000});
|
||||
timer.activate('issue:r:42:');
|
||||
timer.startBreak(5);
|
||||
const adopted = timer.adopt('issue:r:42:', 12000, false, [
|
||||
{identity:'issue:r:42:',elapsed_ms:12000},
|
||||
]);
|
||||
process.stdout.write(JSON.stringify({adopted,snapshot:timer.snapshot(),pending:timer.breakSnapshot()}));
|
||||
"""
|
||||
|
||||
assert run_node(script) == {
|
||||
"adopted": True,
|
||||
"snapshot": {
|
||||
"identity": "issue:r:42:",
|
||||
"elapsed_ms": 12000,
|
||||
"running": False,
|
||||
"break_deadline_at": 400_000,
|
||||
},
|
||||
"pending": {
|
||||
"identity": "issue:r:42:",
|
||||
"deadline_at": 400_000,
|
||||
"expired": False,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def test_break_expiry_never_restarts_time_and_resume_is_explicit_and_idempotent():
|
||||
script = TIMER.read_text() + r"""
|
||||
const values = new Map();
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user