Files
sausage/host/js/automations-test-support.ts
T

26 lines
1.9 KiB
TypeScript

/** Minimal assertions for the imported Standing agent cases, without Node or Vitest. */
export const cases: {name:string;run:()=>any}[]=[]
export const it=(name:string,run:()=>any)=>cases.push({name,run})
export const describe=(_name:string,run:()=>any)=>run()
export const assert=(value:any,message:string)=>{if(!value)throw new Error(message)}
const same=(a:any,b:any):boolean=>b?.__contains ? b.values.every((v:any)=>a.includes(v)) : JSON.stringify(a)===JSON.stringify(b)
const subset=(a:any,b:any):boolean=>b && typeof b==='object' ? Object.entries(b).every(([k,v])=>subset(a?.[k],v)) : a===b
export function expect(value:any,negate=false):any {
const check=(ok:boolean)=>assert(negate?!ok:ok,`Expected ${String(value)}${negate?' not':''} to match`)
const result:any={
toBe:(b:any)=>check(value===b),toEqual:(b:any)=>check(same(value,b)),toHaveLength:(n:number)=>check(value.length===n),
toMatchObject:(b:any)=>check(subset(value,b)),toMatch:(b:RegExp)=>check(b.test(value)),toContain:(b:any)=>check(value.includes(b)),
toBeUndefined:()=>check(value===undefined),toBeDefined:()=>check(value!==undefined),toBeGreaterThanOrEqual:(b:number)=>check(value>=b),
toThrow:(b:any)=>{let error;try{value()}catch(e){error=e}check(error!==undefined && (b instanceof RegExp?b.test(String(error)):String(error).includes(b)))},
}
Object.defineProperty(result,'not',{get:()=>expect(value,!negate)})
Object.defineProperty(result,'rejects',{get:()=>({toThrow:async(b:string)=>{let error;try{await value}catch(e){error=e}check(error!==undefined&&String(error).includes(b))}})})
return result
}
expect.arrayContaining=(values:any[])=>({__contains:true,values})
export async function until(condition:()=>any) {
const deadline=Date.now()+5000
while(!await condition()) {assert(Date.now()<deadline,'Condition deadline');await new Promise(resolve=>setTimeout(resolve,0))}
}
export const setImmediate=(callback:any)=>setTimeout(callback,0)