running-tools

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

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