SplitOutputTable.spec.js (7648B)
1 import { test, expect } from 'vitest'; 2 import { shallowMount } from '@vue/test-utils'; 3 import SplitOutputTable from '@/components/SplitOutputTable.vue'; 4 5 test('should initialize undefined splits to 0:00.00', async () => { 6 // Initialize component 7 const wrapper = shallowMount(SplitOutputTable, { 8 propsData: { 9 modelValue: [ 10 { result: 'time', distanceValue: 1, distanceUnit: 'miles' }, 11 { result: 'time', distanceValue: 2, distanceUnit: 'miles' }, 12 { result: 'time', distanceValue: 5, distanceUnit: 'kilometers' }, 13 ], 14 }, 15 }); 16 17 // Assert results are correct 18 const rows = wrapper.findAll('tbody tr'); 19 expect(rows[0].findAll('td')[0].element.textContent).to.equal('1 mi'); 20 expect(rows[0].findAll('td')[1].element.textContent).to.equal('0:00.00'); 21 expect(rows[0].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue).to.equal(0); 22 expect(rows[0].findAll('td').length).to.equal(4); 23 expect(rows[1].findAll('td')[0].element.textContent).to.equal('2 mi'); 24 expect(rows[1].findAll('td')[1].element.textContent).to.equal('0:00.00'); 25 expect(rows[1].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue).to.equal(0); 26 expect(rows[1].findAll('td').length).to.equal(4); 27 expect(rows[2].findAll('td')[0].element.textContent).to.equal('5 km'); 28 expect(rows[2].findAll('td')[1].element.textContent).to.equal('0:00.00'); 29 expect(rows[2].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue).to.equal(0); 30 expect(rows[2].findAll('td').length).to.equal(4); 31 expect(rows.length).to.equal(3); 32 }); 33 34 test('should correctly load split times from split targets', async () => { 35 // Initialize component 36 const wrapper = shallowMount(SplitOutputTable, { 37 propsData: { 38 modelValue: [ 39 { result: 'time', distanceValue: 1, distanceUnit: 'kilometers', splitTime: 180 }, 40 { result: 'time', distanceValue: 2, distanceUnit: 'kilometers', splitTime: 190 }, 41 { result: 'time', distanceValue: 3000, distanceUnit: 'meters', splitTime: 200 }, 42 ], 43 }, 44 }); 45 46 // Assert results are correct 47 const rows = wrapper.findAll('tbody tr'); 48 expect(rows[0].findAll('td')[0].element.textContent).to.equal('1 km'); 49 expect(rows[0].findAll('td')[1].element.textContent).to.equal('3:00.00'); 50 expect(rows[0].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue) 51 .to.equal(180); 52 expect(rows[0].findAll('td').length).to.equal(4); 53 expect(rows[1].findAll('td')[0].element.textContent).to.equal('2 km'); 54 expect(rows[1].findAll('td')[1].element.textContent).to.equal('6:10.00'); 55 expect(rows[1].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue) 56 .to.equal(190); 57 expect(rows[1].findAll('td').length).to.equal(4); 58 expect(rows[2].findAll('td')[0].element.textContent).to.equal('3000 m'); 59 expect(rows[2].findAll('td')[1].element.textContent).to.equal('9:30.00'); 60 expect(rows[2].findAll('td')[2].findComponent({ name: 'time-input' }).vm.modelValue) 61 .to.equal(200); 62 expect(rows[2].findAll('td').length).to.equal(4); 63 expect(rows.length).to.equal(3); 64 }); 65 66 test('should correctly calculate paces and cumulative times from entered split times', async () => { 67 // Initialize component 68 const wrapper = shallowMount(SplitOutputTable, { 69 propsData: { 70 modelValue: [ 71 { result: 'time', distanceValue: 1, distanceUnit: 'miles' }, 72 { result: 'time', distanceValue: 2, distanceUnit: 'miles' }, 73 { result: 'time', distanceValue: 5, distanceUnit: 'kilometers' }, 74 ], 75 }, 76 }); 77 78 // Update split times 79 await wrapper.findAllComponents({ name: 'time-input' })[0].setValue(420); 80 await wrapper.findAllComponents({ name: 'time-input' })[1].setValue(390); 81 await wrapper.findAllComponents({ name: 'time-input' })[2].setValue(390); 82 83 // Assert results are correct 84 const rows = wrapper.findAll('tbody tr'); 85 expect(rows[0].findAll('td')[0].element.textContent).to.equal('1 mi'); 86 expect(rows[0].findAll('td')[1].element.textContent).to.equal('7:00.00'); 87 expect(rows[0].findAll('td')[2].findComponent({ name: 'time-input' }) 88 .vm.modelValue).to.equal(420); 89 expect(rows[0].findAll('td')[3].element.textContent).to.equal('4:21 / km'); 90 expect(rows[0].findAll('td').length).to.equal(4); 91 expect(rows[1].findAll('td')[0].element.textContent).to.equal('2 mi'); 92 expect(rows[1].findAll('td')[1].element.textContent).to.equal('13:30.00'); 93 expect(rows[1].findAll('td')[2].findComponent({ name: 'time-input' }) 94 .vm.modelValue).to.equal(390); 95 expect(rows[1].findAll('td')[3].element.textContent).to.equal('4:02 / km'); 96 expect(rows[1].findAll('td').length).to.equal(4); 97 expect(rows[2].findAll('td')[0].element.textContent).to.equal('5 km'); 98 expect(rows[2].findAll('td')[1].element.textContent).to.equal('20:00.00'); 99 expect(rows[2].findAll('td')[2].findComponent({ name: 'time-input' }) 100 .vm.modelValue).to.equal(390); 101 expect(rows[2].findAll('td')[3].element.textContent).to.equal('3:39 / km'); 102 expect(rows[2].findAll('td').length).to.equal(4); 103 expect(rows.length).to.equal(3); 104 }); 105 106 test('should emit update event when split times are changed', async () => { 107 // Initialize component 108 const wrapper = shallowMount(SplitOutputTable, { 109 propsData: { 110 modelValue: [ 111 { result: 'time', distanceValue: 1, distanceUnit: 'kilometers', splitTime: 180 }, 112 { result: 'time', distanceValue: 2, distanceUnit: 'kilometers', splitTime: 180 }, 113 { result: 'time', distanceValue: 3000, distanceUnit: 'meters', splitTime: 180 }, 114 ], 115 }, 116 }); 117 118 // Update split times 119 await wrapper.findAllComponents({ name: 'time-input' })[1].setValue(190); 120 await wrapper.findAllComponents({ name: 'time-input' })[2].setValue(200); 121 122 // Assert update events correctly emitted 123 expect(wrapper.emitted()['update:modelValue']).to.deep.equal([ 124 [[ 125 { result: 'time', distanceValue: 1, distanceUnit: 'kilometers', splitTime: 180 }, 126 { result: 'time', distanceValue: 2, distanceUnit: 'kilometers', splitTime: 190 }, 127 { result: 'time', distanceValue: 3000, distanceUnit: 'meters', splitTime: 180 }, 128 ]], 129 [[ 130 { result: 'time', distanceValue: 1, distanceUnit: 'kilometers', splitTime: 180 }, 131 { result: 'time', distanceValue: 2, distanceUnit: 'kilometers', splitTime: 190 }, 132 { result: 'time', distanceValue: 3000, distanceUnit: 'meters', splitTime: 200 }, 133 ]], 134 ]); 135 }); 136 137 test('should update paces according to default units setting', async () => { 138 // Initialize component 139 const wrapper = shallowMount(SplitOutputTable, { 140 propsData: { 141 modelValue: [ 142 { result: 'time', distanceValue: 1, distanceUnit: 'miles', splitTime: 300 }, 143 { result: 'time', distanceValue: 2, distanceUnit: 'miles', splitTime: 300 }, 144 { result: 'time', distanceValue: 5, distanceUnit: 'kilometers', splitTime: 330 }, 145 ], 146 defaultUnitSystem: 'metric', 147 } 148 }); 149 150 // Assert paces are correct 151 let rows = wrapper.findAll('tbody tr'); 152 expect(rows[0].findAll('td')[3].element.textContent).to.equal('3:06 / km'); 153 expect(rows[1].findAll('td')[3].element.textContent).to.equal('3:06 / km'); 154 expect(rows[2].findAll('td')[3].element.textContent).to.equal('3:05 / km'); 155 156 // Change default units 157 await wrapper.setProps({ defaultUnitSystem: 'imperial' }); 158 159 // Assert paces are correct 160 rows = wrapper.findAll('tbody tr'); 161 expect(rows[0].findAll('td')[3].element.textContent).to.equal('5:00 / mi'); 162 expect(rows[1].findAll('td')[3].element.textContent).to.equal('5:00 / mi'); 163 expect(rows[2].findAll('td')[3].element.textContent).to.equal('4:58 / mi'); 164 });