migration.spec.js (8385B)
1 import { beforeEach, describe, test, expect } from 'vitest'; 2 import { migrateLocalStorage } from '@/core/migrations'; 3 import { detectDefaultUnitSystem } from '@/core/units'; 4 5 beforeEach(() => { 6 localStorage.clear(); 7 }); 8 9 describe('migrateLocalStorage method', () => { 10 test('should correctly migrate <=1.4.1 calculator options', async () => { 11 // Initialize localStorage 12 localStorage.setItem('running-tools.default-unit-system', '"imperial"'); 13 14 localStorage.setItem('running-tools.batch-calculator-input', 15 '{"distanceValue":100,"distanceUnit":"meters","time":10}'); 16 localStorage.setItem('running-tools.batch-calculator-options', 17 '{"calculator":"race","increment":32,"rows":15}'); 18 19 localStorage.setItem('running-tools.pace-calculator-input', 20 '{"distanceValue":110,"distanceUnit":"meters","time":11}'); 21 localStorage.setItem('running-tools.pace-calculator-target-set', '"A"'); 22 23 localStorage.setItem('running-tools.race-calculator-input', 24 '{"distanceValue":120,"distanceUnit":"meters","time":12}'); 25 localStorage.setItem('running-tools.race-calculator-options', 26 '{"model":"RiegelModel","riegelExponent":1.07}'); 27 localStorage.setItem('running-tools.race-calculator-target-set', '"B"'); 28 29 localStorage.setItem('running-tools.split-calculator-target-set', '"C"'); 30 31 localStorage.setItem('running-tools.workout-calculator-input', 32 '{"distanceValue":130,"distanceUnit":"meters","time":13}'); 33 localStorage.setItem('running-tools.workout-calculator-options', 34 '{"model":"RiegelModel","riegelExponent":1.08}'); 35 localStorage.setItem('running-tools.workout-calculator-target-set', '"D"'); 36 37 // Run migrations 38 migrateLocalStorage(); 39 40 // Assert localStorage entries correctly migrated 41 expect(localStorage.getItem('running-tools.default-unit-system')).to.equal(null); 42 expect(localStorage.getItem('running-tools.global-options')).to.equal( 43 '{"defaultUnitSystem":"imperial","racePredictionOptions":{"model":"RiegelModel",' + 44 '"riegelExponent":1.07}}'); 45 46 expect(localStorage.getItem('running-tools.batch-calculator-input')).to.equal(null); 47 expect(localStorage.getItem('running-tools.batch-calculator-options')).to.equal( 48 '{"calculator":"race","increment":32,"rows":15,"label":"",' + 49 '"input":{"distanceValue":100,"distanceUnit":"meters","time":10}}'); 50 51 expect(localStorage.getItem('running-tools.pace-calculator-input')).to.equal(null); 52 expect(localStorage.getItem('running-tools.pace-calculator-options')).to.equal( 53 '{"input":{"distanceValue":110,"distanceUnit":"meters","time":11},"selectedTargetSet":"A"}'); 54 expect(localStorage.getItem('running-tools.pace-calculator-target-set')).to.equal(null); 55 56 expect(localStorage.getItem('running-tools.race-calculator-input')).to.equal(null); 57 expect(localStorage.getItem('running-tools.race-calculator-options')).to.equal( 58 '{"input":{"distanceValue":120,"distanceUnit":"meters","time":12},"selectedTargetSet":"B"}'); 59 expect(localStorage.getItem('running-tools.race-calculator-target-set')).to.equal(null); 60 61 expect(localStorage.getItem('running-tools.split-calculator-options')).to.equal( 62 '{"selectedTargetSet":"C"}'); 63 expect(localStorage.getItem('running-tools.split-calculator-target-set')).to.equal(null); 64 65 expect(localStorage.getItem('running-tools.workout-calculator-input')).to.equal(null); 66 expect(localStorage.getItem('running-tools.workout-calculator-options')).to.equal( 67 '{"customTargetNames":false,"input":{"distanceValue":130,"distanceUnit":"meters",' + 68 '"time":13},"selectedTargetSet":"D"}'); 69 expect(localStorage.getItem('running-tools.workout-calculator-target-set')).to.equal(null); 70 }); 71 72 test('should correctly migrate partial <=1.4.1 calculator options using default values', async () => { 73 // Initialize localStorage 74 // default-unit-system, *-calculator-input, and *-calculator-target-set left undefined 75 localStorage.setItem('running-tools.batch-calculator-options', 76 '{"calculator":"race","increment":32,"rows":15}'); 77 localStorage.setItem('running-tools.race-calculator-options', 78 '{"model":"RiegelModel","riegelExponent":1.07}'); 79 localStorage.setItem('running-tools.workout-calculator-options', 80 '{"model":"RiegelModel","riegelExponent":1.08}'); 81 82 // Run migrations 83 migrateLocalStorage(); 84 85 // Assert localStorage entries correctly migrated 86 const defaultUnitSystem = detectDefaultUnitSystem(); 87 expect(localStorage.getItem('running-tools.global-options')).to.equal( 88 `{"defaultUnitSystem":"${defaultUnitSystem}",` + 89 '"racePredictionOptions":{"model":"RiegelModel","riegelExponent":1.07}}'); 90 expect(localStorage.getItem('running-tools.batch-calculator-options')).to.equal( 91 '{"calculator":"race","increment":32,"rows":15,"label":"",' + 92 '"input":{"distanceValue":5,"distanceUnit":"kilometers","time":1200}}'); 93 expect(localStorage.getItem('running-tools.race-calculator-options')).to.equal( 94 '{"input":{"distanceValue":5,"distanceUnit":"kilometers","time":1200},' + 95 '"selectedTargetSet":"_race_targets"}'); 96 expect(localStorage.getItem('running-tools.workout-calculator-options')).to.equal( 97 '{"customTargetNames":false,"input":{"distanceValue":5,"distanceUnit":"kilometers",' + 98 '"time":1200},"selectedTargetSet":"_workout_targets"}'); 99 }); 100 101 test('should not modify >1.4.1 calculator options', async () => { 102 // Initialize localStorage 103 localStorage.setItem('running-tools.global-calculator-options', 104 '{"model":"RiegelModel","riegelExponent":1.07}'); 105 localStorage.setItem('running-tools.batch-calculator-options', 106 '{"calculator":"race","increment":32,"input":{"distanceValue":100,"distanceUnit":"meters",' + 107 '"time":10},"label":"foo","rows":15}'); 108 localStorage.setItem('running-tools.pace-calculator-options', 109 '{"input":{"distanceValue":110,"distanceUnit":"meters","time":11},"selectedTargetSet":"A"}'); 110 localStorage.setItem('running-tools.race-calculator-options', 111 '{"input":{"distanceValue":120,"distanceUnit":"meters","time":12},"selectedTargetSet":"B"}'); 112 localStorage.setItem('running-tools.split-calculator-options', 113 '{"selectedTargetSet":"C"}'); 114 localStorage.setItem('running-tools.workout-calculator-options', 115 '{"customTargetNames":true,"input":{"distanceValue":120,"distanceUnit":"meters","time":12},' + 116 '"selectedTargetSet":"D"}'); 117 118 // Run migrations 119 migrateLocalStorage(); 120 121 // Assert localStorage entries not modified 122 expect(localStorage.getItem('running-tools.global-calculator-options')).to.equal( 123 '{"model":"RiegelModel","riegelExponent":1.07}'); 124 expect(localStorage.getItem('running-tools.batch-calculator-options')).to.equal( 125 '{"calculator":"race","increment":32,"input":{"distanceValue":100,"distanceUnit":"meters",' + 126 '"time":10},"label":"foo","rows":15}'); 127 expect(localStorage.getItem('running-tools.pace-calculator-options')).to.equal( 128 '{"input":{"distanceValue":110,"distanceUnit":"meters","time":11},"selectedTargetSet":"A"}'); 129 expect(localStorage.getItem('running-tools.race-calculator-options')).to.equal( 130 '{"input":{"distanceValue":120,"distanceUnit":"meters","time":12},"selectedTargetSet":"B"}'); 131 expect(localStorage.getItem('running-tools.split-calculator-options')).to.equal( 132 '{"selectedTargetSet":"C"}'); 133 expect(localStorage.getItem('running-tools.workout-calculator-options')).to.equal( 134 '{"customTargetNames":true,"input":{"distanceValue":120,"distanceUnit":"meters","time":12},' + 135 '"selectedTargetSet":"D"}'); 136 }); 137 138 test('should not modify missing calculator options', async () => { 139 // Run migrations 140 migrateLocalStorage(); 141 142 // Assert localStorage entries not modified 143 expect(localStorage.getItem('running-tools.global-options')).to.equal(null); 144 expect(localStorage.getItem('running-tools.batch-calculator-options')).to.equal(null); 145 expect(localStorage.getItem('running-tools.pace-calculator-options')).to.equal(null); 146 expect(localStorage.getItem('running-tools.race-calculator-options')).to.equal(null); 147 expect(localStorage.getItem('running-tools.split-calculator-options')).to.equal(null); 148 expect(localStorage.getItem('running-tools.workout-calculator-options')).to.equal(null); 149 }); 150 });