running-tools

A collection of tools for runners and their coaches
git clone https://git.ashermorgan.net/running-tools/
Log | Files | Refs | README

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 });