running-tools

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

commit de99040e38f6fd15376fdb547ebcfeb313a788f9
parent 3d696cb56c466a5006ae98ca8537bc7b70d719e2
Author: Asher Morgan <59518073+ashermorgan@users.noreply.github.com>
Date:   Sun, 24 Mar 2024 18:13:47 -0700

Update Unit Calculator tests

Diffstat:
Msrc/views/UnitCalculator.vue | 9++++-----
Mtests/unit/views/UnitCalculator.spec.js | 168+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
2 files changed, 121 insertions(+), 56 deletions(-)

diff --git a/src/views/UnitCalculator.vue b/src/views/UnitCalculator.vue @@ -153,16 +153,15 @@ export default { case 'time': { this.inputValue = storage.get('unit-calculator-time-input-value', 1); this.inputUnit = storage.get('unit-calculator-time-input-unit', 'seconds'); - this.outputUnit = storage.get('unit-calculator-time-ouput-unit', 'hh:mm:ss'); + this.outputUnit = storage.get('unit-calculator-time-output-unit', 'hh:mm:ss'); break; } case 'speed_and_pace': { - this.inputValue = storage.get('unit-calculator-speed-input-value', - unitUtils.getDefaultPaceUnit() === 'seconds_per_mile' ? 600 : 300); + this.inputValue = storage.get('unit-calculator-speed-input-value', 600); this.inputUnit = storage.get('unit-calculator-speed-input-unit', - unitUtils.getDefaultPaceUnit()); + 'seconds_per_mile'); this.outputUnit = storage.get('unit-calculator-speed-output-unit', - unitUtils.getDefaultSpeedUnit()); + 'miles_per_hour'); break; } default: { diff --git a/tests/unit/views/UnitCalculator.spec.js b/tests/unit/views/UnitCalculator.spec.js @@ -1,39 +1,41 @@ /* eslint-disable no-underscore-dangle */ -import { test, expect } from 'vitest'; +import { beforeEach, test, expect } from 'vitest'; import { shallowMount } from '@vue/test-utils'; import unitUtils from '@/utils/units'; import UnitCalculator from '@/views/UnitCalculator.vue'; +beforeEach(() => { + localStorage.clear(); +}) + test('should correctly update controls when category changes', async () => { // Initialize component const wrapper = shallowMount(UnitCalculator); // Change category - await wrapper.setData({ category: 'time' }); + await wrapper.find('select[aria-label="Selected unit category"]').setValue('time'); // Assert controls are correct - expect(wrapper.vm.inputValue).to.equal(1); - expect(wrapper.vm.inputUnit).to.equal('seconds'); - expect(wrapper.vm.outputUnit).to.equal('hh:mm:ss'); + expect(wrapper.findComponent({ name: 'decimal-input' }).vm.modelValue).to.equal(1); + expect(wrapper.find('select[aria-label="Input units"]').element.value).to.equal('seconds'); + expect(wrapper.find('select[aria-label="Output units"]').element.value).to.equal('hh:mm:ss'); // Change category - await wrapper.setData({ category: 'speed_and_pace' }); + await wrapper.find('select[aria-label="Selected unit category"]').setValue('speed_and_pace'); // Assert controls are correct - expect(wrapper.vm.inputValue).to.equal( - unitUtils.getDefaultPaceUnit() === 'seconds_per_mile' ? 600 : 300, - ); - expect(wrapper.vm.inputUnit).to.equal(unitUtils.getDefaultPaceUnit()); - expect(wrapper.vm.outputUnit).to.equal(unitUtils.getDefaultSpeedUnit()); + expect(wrapper.findComponent({ name: 'time-input' }).vm.modelValue).to.equal(600); + expect(wrapper.find('select[aria-label="Input units"]').element.value).to.equal('seconds_per_mile'); + expect(wrapper.find('select[aria-label="Output units"]').element.value).to.equal('miles_per_hour'); // Change category await wrapper.setData({ category: 'distance' }); // Assert controls are correct - expect(wrapper.vm.inputValue).to.equal(1); - expect(wrapper.vm.inputUnit).to.equal('miles'); - expect(wrapper.vm.outputUnit).to.equal('kilometers'); + expect(wrapper.findComponent({ name: 'decimal-input' }).vm.modelValue).to.equal(1); + expect(wrapper.find('select[aria-label="Input units"]').element.value).to.equal('miles'); + expect(wrapper.find('select[aria-label="Output units"]').element.value).to.equal('kilometers'); }); test('outputValue should be correct', async () => { @@ -41,37 +43,31 @@ test('outputValue should be correct', async () => { const wrapper = shallowMount(UnitCalculator); // Change category and update input - await wrapper.setData({ category: 'distance' }); - await wrapper.setData({ - inputValue: 2, - inputUnit: 'kilometers', - outputUnit: 'meters', - }); + await wrapper.find('select[aria-label="Selected unit category"]').setValue('distance'); + await wrapper.find('select[aria-label="Input units"]').setValue('kilometers'); + await wrapper.findComponent({ name: 'decimal-input' }).setValue(2); + await wrapper.find('select[aria-label="Output units"]').setValue('meters'); - // Assert controls are correct - expect(wrapper.vm.outputValue).to.equal(2000); + // Assert output is correct + expect(wrapper.find('span[aria-label="Output value"]').element.textContent).to.equal('2000.000'); // Change category and update input - await wrapper.setData({ category: 'time' }); - await wrapper.setData({ - inputValue: 3, - inputUnit: 'minutes', - outputUnit: 'seconds', - }); + await wrapper.find('select[aria-label="Selected unit category"]').setValue('time'); + await wrapper.find('select[aria-label="Input units"]').setValue('minutes'); + await wrapper.findComponent({ name: 'decimal-input' }).setValue(3); + await wrapper.find('select[aria-label="Output units"]').setValue('seconds'); - // Assert controls are correct - expect(wrapper.vm.outputValue).to.equal(3 * 60); + // Assert output is correct + expect(wrapper.find('span[aria-label="Output value"]').element.textContent).to.equal('180.000'); // Change category and update input - await wrapper.setData({ category: 'speed_and_pace' }); - await wrapper.setData({ - inputValue: 2, - inputUnit: 'miles_per_hour', - outputUnit: 'seconds_per_mile', - }); + await wrapper.find('select[aria-label="Selected unit category"]').setValue('speed_and_pace'); + await wrapper.find('select[aria-label="Input units"]').setValue('miles_per_hour'); + await wrapper.findComponent({ name: 'decimal-input' }).setValue(2); + await wrapper.find('select[aria-label="Output units"]').setValue('seconds_per_mile'); - // Assert controls are correct - expect(wrapper.vm.outputValue).to.be.closeTo(30 * 60, 0.001); + // Assert output is correct + expect(wrapper.find('span[aria-label="Output value"]').element.textContent).to.equal('00:30:00.000'); }); test('should correctly convert to and from hh:mm:ss', async () => { @@ -79,23 +75,93 @@ test('should correctly convert to and from hh:mm:ss', async () => { const wrapper = shallowMount(UnitCalculator); // Change category and update input - await wrapper.setData({ category: 'time' }); - await wrapper.setData({ - inputValue: 60, - inputUnit: 'hh:mm:ss', - outputUnit: 'minutes', - }); + await wrapper.find('select[aria-label="Selected unit category"]').setValue('time'); + await wrapper.find('select[aria-label="Input units"]').setValue('hh:mm:ss'); + await wrapper.findComponent({ name: 'time-input' }).setValue(60); + await wrapper.find('select[aria-label="Output units"]').setValue('minutes'); // Assert controls are correct - expect(wrapper.vm.outputValue).to.equal(1); + expect(wrapper.find('span[aria-label="Output value"]').element.textContent).to.equal('1.000'); // Update input - await wrapper.setData({ - inputValue: 1, - inputUnit: 'minutes', - outputUnit: 'hh:mm:ss', - }); + await wrapper.find('select[aria-label="Input units"]').setValue('minutes'); + await wrapper.findComponent({ name: 'decimal-input' }).setValue(1); + await wrapper.find('select[aria-label="Output units"]').setValue('hh:mm:ss'); // Assert controls are correct - expect(wrapper.vm.outputValue).to.equal(60); + expect(wrapper.find('span[aria-label="Output value"]').element.textContent).to.equal('00:01:00.000'); +}); + +test('should correctly load saved inputs', async () => { + // Initialize localStorage + localStorage.setItem('running-tools.unit-calculator-distance-input-value', '5'); + localStorage.setItem('running-tools.unit-calculator-distance-input-unit', '"kilometers"'); + localStorage.setItem('running-tools.unit-calculator-distance-output-unit', '"miles"'); + localStorage.setItem('running-tools.unit-calculator-time-input-value', '90'); + localStorage.setItem('running-tools.unit-calculator-time-input-unit', '"hh:mm:ss"'); + localStorage.setItem('running-tools.unit-calculator-time-output-unit', '"minutes"'); + localStorage.setItem('running-tools.unit-calculator-speed-input-value', '15'); + localStorage.setItem('running-tools.unit-calculator-speed-input-unit', '"miles_per_hour"'); + localStorage.setItem('running-tools.unit-calculator-speed-output-unit', '"seconds_per_mile"'); + + // Initialize component + const wrapper = shallowMount(UnitCalculator); + + // Change category + await wrapper.find('select[aria-label="Selected unit category"]').setValue('time'); + + // Assert inputs are correct + expect(wrapper.findComponent({ name: 'time-input' }).vm.modelValue).to.equal(90); + expect(wrapper.find('select[aria-label="Input units"]').element.value).to.equal('hh:mm:ss'); + expect(wrapper.find('select[aria-label="Output units"]').element.value).to.equal('minutes'); + + // Change category + await wrapper.find('select[aria-label="Selected unit category"]').setValue('speed_and_pace'); + + // Assert inputs are correct + expect(wrapper.findComponent({ name: 'decimal-input' }).vm.modelValue).to.equal(15); + expect(wrapper.find('select[aria-label="Input units"]').element.value).to.equal('miles_per_hour'); + expect(wrapper.find('select[aria-label="Output units"]').element.value).to.equal('seconds_per_mile'); + + // Change category + await wrapper.setData({ category: 'distance' }); + + // Assert inputs are correct + expect(wrapper.findComponent({ name: 'decimal-input' }).vm.modelValue).to.equal(5); + expect(wrapper.find('select[aria-label="Input units"]').element.value).to.equal('kilometers'); + expect(wrapper.find('select[aria-label="Output units"]').element.value).to.equal('miles'); +}); + +test('should correctly save inputs', async () => { + // Initialize component + const wrapper = shallowMount(UnitCalculator); + + // Change category and update input + await wrapper.find('select[aria-label="Selected unit category"]').setValue('distance'); + await wrapper.find('select[aria-label="Input units"]').setValue('kilometers'); + await wrapper.findComponent({ name: 'decimal-input' }).setValue(5); + await wrapper.find('select[aria-label="Output units"]').setValue('miles'); + + // Change category and update input + await wrapper.find('select[aria-label="Selected unit category"]').setValue('time'); + await wrapper.find('select[aria-label="Input units"]').setValue('hh:mm:ss'); + await wrapper.findComponent({ name: 'time-input' }).setValue(90); + await wrapper.find('select[aria-label="Output units"]').setValue('minutes'); + + // Change category and update input + await wrapper.find('select[aria-label="Selected unit category"]').setValue('speed_and_pace'); + await wrapper.find('select[aria-label="Input units"]').setValue('miles_per_hour'); + await wrapper.findComponent({ name: 'decimal-input' }).setValue(15); + await wrapper.find('select[aria-label="Output units"]').setValue('seconds_per_mile'); + + // Initialize localStorage + expect(localStorage.getItem('running-tools.unit-calculator-distance-input-value')).to.equal('5'); + expect(localStorage.getItem('running-tools.unit-calculator-distance-input-unit')).to.equal('"kilometers"'); + expect(localStorage.getItem('running-tools.unit-calculator-distance-output-unit')).to.equal('"miles"'); + expect(localStorage.getItem('running-tools.unit-calculator-time-input-value')).to.equal('90'); + expect(localStorage.getItem('running-tools.unit-calculator-time-input-unit')).to.equal('"hh:mm:ss"'); + expect(localStorage.getItem('running-tools.unit-calculator-time-output-unit')).to.equal('"minutes"'); + expect(localStorage.getItem('running-tools.unit-calculator-speed-input-value')).to.equal('15'); + expect(localStorage.getItem('running-tools.unit-calculator-speed-input-unit')).to.equal('"miles_per_hour"'); + expect(localStorage.getItem('running-tools.unit-calculator-speed-output-unit')).to.equal('"seconds_per_mile"'); });