draft-storage.test.mjs (1592B)
1 import test from 'node:test'; 2 import assert from 'node:assert/strict'; 3 import {DRAFT_KEY,savedDraft,readDraft,writeDraft} from '../dist/draft-storage.js'; 4 const draft={schema:1,source:'invalid unfinished source is still saved',name:'id',arguments:'[]',output:'tree',mode:'pure'}; 5 function storage(){const values=new Map();return {getItem:k=>values.get(k)??null,setItem:(k,v)=>values.set(k,v),removeItem:k=>values.delete(k)};} 6 test('recovery retains source and exact demo context but no risky mode or executable state',()=>{ 7 const s=storage();assert.equal(readDraft(s),undefined); 8 const demo={hash:'a'.repeat(64),environment:'practical'}; 9 writeDraft(s,{...draft,demo,uncapped:true,compiled:true}); 10 assert.deepEqual(readDraft(s),{...draft,demo}); 11 s.removeItem(DRAFT_KEY);assert.equal(readDraft(s),undefined); 12 }); 13 test('recovery rejects malformed, oversized or unavailable storage without silent success',()=>{ 14 for(const value of [null,[],{}, {...draft,schema:2},{...draft,source:'x'.repeat(32769)},{...draft,demo:{hash:'bad',environment:'empty'}}])assert.throws(()=>savedDraft(value)); 15 const s=storage();s.setItem(DRAFT_KEY,'{');assert.throws(()=>readDraft(s)); 16 s.setItem(DRAFT_KEY,' '.repeat(100001));assert.throws(()=>readDraft(s),/large/); 17 assert.throws(()=>writeDraft(s,{...draft,source:'\0'.repeat(32768)}),/large/); 18 assert.throws(()=>writeDraft({setItem(){throw new Error('quota');}},draft),/quota/); 19 assert.throws(()=>writeDraft({setItem(){},getItem(){return null;}},draft),/verification/); 20 assert.throws(()=>readDraft({getItem(){throw new Error('denied');}}),/denied/); 21 });