race-calculator.spec.js (7870B)
1 import { test, expect } from '@playwright/test'; 2 3 test('Race Calculator', async ({ page }) => { 4 // Go to race calculator 5 await page.goto('/'); 6 await page.getByRole('button', { name: 'Race Calculator' }).click(); 7 await expect(page).toHaveTitle('Race Calculator - Running Tools'); 8 9 // Test standard race results 10 { 11 // Enter input race (2 mi in 10:30) 12 await page.getByLabel('Input race distance value').fill('2'); 13 await page.getByLabel('Input race distance unit').selectOption('Miles'); 14 await page.getByLabel('Input race duration hours').fill('0'); 15 await page.getByLabel('Input race duration minutes').fill('10'); 16 await page.getByLabel('Input race duration seconds').fill('30'); 17 18 // Assert race predictions are correct 19 await expect(page.getByRole('row').nth(5)).toHaveText('1 mi' + '4:55.53' + '4:56 / mi'); 20 await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '16:47.57' + '5:24 / mi'); 21 await expect(page.getByRole('row')).toHaveCount(17); 22 23 // Assert race statistics are correct 24 await page.getByText('Race Statistics').click(); 25 await expect(page.getByText('Purdy Points:')).toContainText(': 680.1'); 26 await expect(page.getByText('V̇O₂:')).toContainText(': 61.0 ml/kg/min (100.5% of max)'); 27 await expect(page.getByText('V̇O₂ Max:')).toContainText(': 60.7 ml/kg/min'); 28 } 29 30 // Test different calculator options 31 { 32 // Change default units 33 await page.getByText('Advanced Options').click(); 34 await page.getByLabel('Default units').selectOption('Kilometers'); 35 36 // Assert race predictions are correct 37 await expect(page.getByRole('row').nth(5)).toHaveText('1 mi' + '4:55.53' + '3:04 / km'); 38 await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '16:47.57' + '3:22 / km'); 39 await expect(page.getByRole('row')).toHaveCount(17); 40 41 // Change prediction model 42 await page.getByLabel('Prediction model').selectOption('Riegel\'s Model'); 43 44 // Assert race predictions are correct 45 await expect(page.getByRole('row').nth(5)).toHaveText('1 mi' + '5:02.17' + '3:08 / km'); 46 await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '16:44.87' + '3:21 / km'); 47 await expect(page.getByRole('row')).toHaveCount(17); 48 49 // Change Riegel exponent 50 await page.getByLabel('Riegel Exponent').fill('1.12'); 51 52 // Assert race predictions are correct 53 await expect(page.getByRole('row').nth(5)).toHaveText('1 mi' + '4:49.86' + '3:00 / km'); 54 await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '17:11.78' + '3:26 / km'); 55 await expect(page.getByRole('row')).toHaveCount(17); 56 } 57 58 // Test modified default target set 59 { 60 // Edit default target set 61 await page.getByRole('button', { name: 'Edit target set' }).click(); 62 await page.getByLabel('Target set label').fill('Less-common Race Targets'); 63 await page.getByLabel('Target distance value').nth(4).fill('1.01'); 64 await page.getByRole('button', { name: 'Add distance target' }).click(); 65 await page.getByLabel('Target distance value').last().fill('1.5'); 66 await page.getByLabel('Target distance unit').last().selectOption('Miles'); 67 await page.getByRole('button', { name: 'Add time target' }).click(); 68 await page.getByLabel('Target duration minutes').last().fill('19'); 69 await page.getByLabel('Target duration seconds').last().fill('0'); 70 await page.getByRole('button', { name: 'Close' }).click(); 71 72 // Assert race predictions are correct 73 await expect(page.getByRole('row').nth(5)).toHaveText('1.01 mi' + '4:53.11' + '3:00 / km'); 74 await expect(page.getByRole('row').nth(6)).toHaveText('1.5 mi' + '7:36.47' + '3:09 / km'); 75 await expect(page.getByRole('row').nth(12)).toHaveText('5.47 km' + '19:00' + '3:29 / km'); 76 await expect(page.getByRole('row')).toHaveCount(19); 77 } 78 79 // Test custom target set 80 { 81 // Create custom target set 82 await page.getByLabel('Selected target set').selectOption('[ Create New Target Set ]'); 83 await expect(page.getByRole('row').nth(4)).toHaveText('There aren\'t any targets in this set yet.'); 84 await expect(page.getByRole('row')).toHaveCount(5); 85 86 // Edit new target set 87 await expect(page.getByRole('row').nth(1)).toHaveText('There aren\'t any targets in this set yet.'); 88 await expect(page.getByLabel('Target set label')).toHaveValue('New target set'); 89 await page.getByLabel('Target set label').fill('XC Race Targets'); 90 await page.getByRole('button', { name: 'Add distance target' }).click(); 91 await page.getByLabel('Target distance value').nth(0).fill('5'); 92 await page.getByLabel('Target distance unit').nth(0).selectOption('Kilometers'); 93 await page.getByRole('button', { name: 'Add distance target' }).click(); 94 await page.getByLabel('Target distance value').nth(1).fill('10'); 95 await page.getByLabel('Target distance unit').nth(1).selectOption('Kilometers'); 96 await page.getByRole('button', { name: 'Close' }).click(); 97 98 // Assert race predictions are correct 99 await expect(page.getByRole('row').nth(1)).toHaveText('5 km' + '17:11.78' + '3:26 / km'); 100 await expect(page.getByRole('row').nth(2)).toHaveText('10 km' + '37:22.54' + '3:44 / km'); 101 await expect(page.getByRole('row')).toHaveCount(3); 102 } 103 104 // Reload page 105 await page.reload(); 106 107 // Assert outputs are still the same 108 { 109 // Assert race predictions are correct (custom targets, default units, and model settings not reset) 110 await expect(page.getByRole('row').nth(1)).toHaveText('5 km' + '17:11.78' + '3:26 / km'); 111 await expect(page.getByRole('row').nth(2)).toHaveText('10 km' + '37:22.54' + '3:44 / km'); 112 await expect(page.getByRole('row')).toHaveCount(3); 113 114 // Switch target set 115 await page.getByText('Advanced Options').click(); 116 await page.getByLabel('Selected target set').selectOption('Less-common Race Targets'); 117 118 // Assert race predictions are correct 119 await expect(page.getByRole('row').nth(5)).toHaveText('1.01 mi' + '4:53.11' + '3:00 / km'); 120 await expect(page.getByRole('row').nth(6)).toHaveText('1.5 mi' + '7:36.47' + '3:09 / km'); 121 await expect(page.getByRole('row').nth(12)).toHaveText('5.47 km' + '19:00' + '3:29 / km'); 122 await expect(page.getByRole('row')).toHaveCount(19); 123 } 124 125 // Test target set deletion and reversion 126 { 127 // Delete custom target set 128 await page.getByLabel('Selected target set').selectOption('XC Race Targets'); 129 await page.getByRole('button', { name: 'Edit target set' }).click(); 130 await expect(page.getByLabel('Target set label')).toHaveValue('XC Race Targets'); 131 await page.getByRole('button', { name: 'Delete target set' }).click(); 132 133 // Assert race predictions are correct (back to default target set) 134 await expect(page.getByRole('row').nth(5)).toHaveText('1.01 mi' + '4:53.11' + '3:00 / km'); 135 await expect(page.getByRole('row').nth(6)).toHaveText('1.5 mi' + '7:36.47' + '3:09 / km'); 136 await expect(page.getByRole('row').nth(12)).toHaveText('5.47 km' + '19:00' + '3:29 / km'); 137 await expect(page.getByRole('row')).toHaveCount(19); 138 139 // Revert target set 140 await page.getByRole('button', { name: 'Edit target set' }).click(); 141 await expect(page.getByLabel('Target set label')).toHaveValue('Less-common Race Targets'); 142 await page.getByRole('button', { name: 'Revert target set' }).click(); 143 await page.getByRole('button', { name: 'Close' }).click(); 144 145 // Assert paces are correct 146 await expect(page.getByRole('row').nth(5)).toHaveText('1 mi' + '4:49.86' + '3:00 / km'); 147 await expect(page.getByRole('row').nth(10)).toHaveText('5 km' + '17:11.78' + '3:26 / km'); 148 await expect(page.getByRole('row')).toHaveCount(17); 149 150 // Assert title was reset 151 await page.getByRole('button', { name: 'Edit target set' }).click(); 152 await expect(page.getByLabel('Target set label')).toHaveValue('Common Race Targets'); 153 } 154 });