feat: iphone app

This commit is contained in:
leon
2026-09-09 10:12:49 +02:00
parent 8666f6eb8f
commit 4f4f6f4c71
30 changed files with 13379 additions and 23 deletions
+9
View File
@@ -0,0 +1,9 @@
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,'');});