typizator-test
Version:
Test utilities for the typizator library.
2 lines (1 loc) • 3.22 kB
JavaScript
import{transformToArray as d}from"typizator";import y from"json-bigint";import{Table as M}from"console-table-printer";var b=r=>{try{return BigInt(r),!0}catch{return!1}},E=()=>expect.extend({toContainTable(r,f,D,W){if(!Array.isArray(r))return{pass:!1,message:()=>`Received object ${r} is not an array`};let g=d(D);if(g.length==0)return{pass:!1,message:()=>"Cannot compare to an empty table"};let h=[],c=[],p=new Map;Object.keys(g[0]).forEach(a=>{let i=f.metadata.fields.get(a);i?(p.set(a,i),c.push({name:a,alignment:"left"})):(h.push(a),c.push({name:a,alignment:"left",color:"red"}))});let o=new M({title:W,columns:c});if(h.length>0)return g.forEach(a=>o.addRow(a)),o.printTable(),{pass:!1,message:()=>`Columns absent in the checked type: ${h.join(",")}`};let u={},w=g.every(a=>{let i={},S=Array.from(Object.keys(a).reduce((n,s)=>{let t=a[s];i[s]=t;let e=p.get(s);return n.set(s,t==="*"?"*":typeof t=="string"&&(t.startsWith(">")||t.startsWith("<")||t.startsWith("~"))?t:e.unbox(t))},new Map)),N=-1,m={key:"",value:""},T=r.some(n=>S.every(([s,t],e)=>{let l=t==="*"||typeof t=="string"&&typeof n[s]=="bigint"&&(t.startsWith("<=")&&b(t.substring(2))&&BigInt(t.substring(2)).valueOf()>=n[s]||t.startsWith(">=")&&b(t.substring(2))&&BigInt(t.substring(2)).valueOf()<=n[s]||t.startsWith("<")&&b(t.substring(1))&&BigInt(t.substring(1)).valueOf()>n[s]||t.startsWith(">")&&b(t.substring(1))&&BigInt(t.substring(1)).valueOf()<n[s])||typeof t=="string"&&typeof n[s]=="number"&&(t.startsWith("<=")&&!Number.isNaN(t.substring(2))&&Number(t.substring(2)).valueOf()>=n[s]||t.startsWith(">=")&&!Number.isNaN(t.substring(2))&&Number(t.substring(2)).valueOf()<=n[s]||t.startsWith("<")&&!Number.isNaN(t.substring(1))&&Number(t.substring(1)).valueOf()>n[s]||t.startsWith(">")&&!Number.isNaN(t.substring(1))&&Number(t.substring(1)).valueOf()<n[s])||typeof t=="string"&&n[s]instanceof Date&&(t.startsWith("<=")&&!isNaN(Date.parse(t.substring(2)))&&new Date(t.substring(2)).getTime()>=n[s].getTime()||t.startsWith(">=")&&!isNaN(Date.parse(t.substring(2)))&&new Date(t.substring(2)).getTime()<=n[s].getTime()||t.startsWith("<")&&!isNaN(Date.parse(t.substring(1)))&&new Date(t.substring(1)).getTime()>n[s].getTime()||t.startsWith(">")&&!isNaN(Date.parse(t.substring(1)))&&new Date(t.substring(1)).getTime()<n[s].getTime())||typeof t=="string"&&t.startsWith("~")&&Number(t.substring(1))===Math.round(Number(n[s]))||t==="@ulid"&&O(n[s])||t==="@blankString"&&n[s]?.toString().trim()===""||t==="@sha256"&&n[s]?.match(/\b[A-Fa-f0-9]{64}\b/)||t?.getTime&&n[s]?.getTime()===t.getTime()||n[s]===t;return!l&&e>N&&(m={key:s,value:n[s]},N=e),l}));return T?o.addRow(i,{color:"green"}):(u=a,i[m.key]=`--> ${i[m.key]?.toString().trim()??"EMPTY"} !== ${m.value?.toString().trim()??"EMPTY"} <--`,o.addRow(i,{color:"red"})),T}),x=o.table.rows.length;return g.forEach((a,i)=>{i>=x&&o.addRow(a)}),o.printTable(),{pass:w,message:()=>`Received ${y.stringify(r,null,3)} doesn't contain ${y.stringify(u,null,3)}`}}}),O=r=>r.match(/[0-7][0-9A-HJKMNP-TV-Z]{25}/)!==null,$=()=>expect.extend({toBeUlidish(r){return{pass:O(r),message:()=>`Received ${r} result doesn't match the ULID pattern`}}});export{$ as extendExpectWithToBeUlidish,E as extendExpectWithToContainTable};