Files
haptika/mobile/scripts/firebase-mapping.test.cjs
2026-09-09 10:12:49 +02:00

10 lines
1.7 KiB
JavaScript

const {test}=require('node:test');const assert=require('node:assert/strict');const ts=require('typescript');const fs=require('node:fs');const vm=require('node:vm');
const source=ts.transpileModule(fs.readFileSync('src/firebase/state-mapping.ts','utf8'),{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2022}}).outputText;
const sandbox={exports:{},Date};vm.runInNewContext(source,sandbox);const {initialState,toUserPatch,mergePatch,fromAccount}=sandbox.exports;
const plain=v=>JSON.parse(JSON.stringify(v));
test('only business edits cross cloud boundary',()=>{const state={...initialState,values:{'565:123':'72',duration:'5 MIN'},toggles:{vibration:true}};assert.deepEqual(plain(toUserPatch(initialState,state)),{});});
test('explicit profile edit maps to stable fields',()=>{assert.deepEqual(plain(toUserPatch(initialState,{...initialState,values:{firstName:'Léon',birthYear:'1998',gender:'Homme'}})),{profile:{firstName:'Léon',birthYear:1998,gender:'male'}});});
test('partial invalid year is not uploaded',()=>{assert.deepEqual(plain(toUserPatch(initialState,{...initialState,values:{birthYear:'19'}})),{});});
test('queue merges fields without losing unsent edits',()=>{assert.deepEqual(plain(mergePatch({profile:{firstName:'A'},onboarding:{experience:'watch'}},{profile:{birthYear:2000}})),{profile:{firstName:'A',birthYear:2000},onboarding:{experience:'watch'}});});
test('cloud hydration does not use mock profile',()=>{const s=fromAccount({profile:{firstName:'',birthYear:null,gender:null},onboarding:{completed:false,experience:'phone'},preferences:{blackScreenEnabled:false}},{...initialState,values:{firstName:'Alexandre'}});assert.equal(s.values.firstName,'');});