running-tools

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

pace-calculator.spec.js (6701B)


      1 import { test, expect } from '@playwright/test';
      2 
      3 test('Pace Calculator', async ({ page }) => {
      4   // Go to pace calculator
      5   await page.goto('/');
      6   await page.getByRole('button', { name: 'Pace Calculator' }).click();
      7   await expect(page).toHaveTitle('Pace Calculator - Running Tools');
      8 
      9   // Test standard pace results
     10   {
     11     // Enter input pace (2 mi in 15:30)
     12     await page.getByLabel('Input distance value').fill('2');
     13     await page.getByLabel('Input distance unit').selectOption('Miles');
     14     await page.getByLabel('Input duration hours').fill('0');
     15     await page.getByLabel('Input duration minutes').fill('15');
     16     await page.getByLabel('Input duration seconds').fill('30');
     17 
     18     // Assert paces are correct
     19     await expect(page.getByRole('row').nth(11)).toHaveText('1 mi' + '7:45.00');
     20     await expect(page.getByRole('row').nth(13)).toHaveText('1.29 mi' + '10:00');
     21     await expect(page.getByRole('row')).toHaveCount(31);
     22 
     23     // Change default units
     24     await page.getByText('Advanced Options').click();
     25     await page.getByLabel('Default units').selectOption('Kilometers');
     26 
     27     // Assert paces are correct
     28     await expect(page.getByRole('row').nth(11)).toHaveText('1 mi' + '7:45.00');
     29     await expect(page.getByRole('row').nth(13)).toHaveText('2.08 km' + '10:00');
     30     await expect(page.getByRole('row')).toHaveCount(31);
     31   }
     32 
     33   // Test modified default target set
     34   {
     35     // Edit default target set
     36     await page.getByRole('button', { name: 'Edit target set' }).click();
     37     await page.getByLabel('Target set label').fill('Less-common Pace Targets');
     38     await page.getByLabel('Target distance value').nth(10).fill('1.01');
     39     await page.getByLabel('Target distance unit').nth(10).selectOption('Miles');
     40     await page.getByLabel('Target duration second').nth(0).fill('1');
     41     await page.getByRole('button', { name: 'Add distance target' }).click();
     42     await page.getByLabel('Target distance value').last().fill('1.5');
     43     await page.getByLabel('Target distance unit').last().selectOption('Miles');
     44     await page.getByRole('button', { name: 'Add time target' }).click();
     45     await page.getByLabel('Target duration minutes').last().fill('19');
     46     await page.getByLabel('Target duration seconds').last().fill('0');
     47     await page.getByRole('button', { name: 'Close' }).click();
     48 
     49     // Assert paces are correct
     50     await expect(page.getByRole('row').nth(11)).toHaveText('1.01 mi' + '7:49.65');
     51     await expect(page.getByRole('row').nth(13)).toHaveText('2.08 km' + '10:01');
     52     await expect(page.getByRole('row').nth(14)).toHaveText('1.5 mi' + '11:37.50');
     53     await expect(page.getByRole('row').nth(18)).toHaveText('3.95 km' + '19:00');
     54     await expect(page.getByRole('row')).toHaveCount(33);
     55   }
     56 
     57   // Test custom target set
     58   {
     59     // Create custom target set
     60     await page.getByLabel('Selected target set').selectOption('[ Create New Target Set ]');
     61     await expect(page.getByRole('row').nth(4)).toHaveText('There aren\'t any targets in this set yet.');
     62     await expect(page.getByRole('row')).toHaveCount(5);
     63 
     64     // Edit new target set
     65     await expect(page.getByRole('row').nth(1)).toHaveText('There aren\'t any targets in this set yet.');
     66     await expect(page.getByLabel('Target set label')).toHaveValue('New target set');
     67     await page.getByLabel('Target set label').fill('800m Splits');
     68     await page.getByRole('button', { name: 'Add distance target' }).click();
     69     await page.getByLabel('Target distance value').nth(0).fill('0.4');
     70     await page.getByLabel('Target distance unit').nth(0).selectOption('Kilometers');
     71     await page.getByRole('button', { name: 'Add distance target' }).click();
     72     await page.getByLabel('Target distance value').nth(1).fill('800');
     73     await page.getByLabel('Target distance unit').nth(1).selectOption('Meters');
     74     await page.getByRole('button', { name: 'Close' }).click();
     75 
     76     // Assert paces are correct
     77     await expect(page.getByRole('row').nth(1)).toHaveText('0.4 km' + '1:55.58');
     78     await expect(page.getByRole('row').nth(2)).toHaveText('800 m' + '3:51.15');
     79     await expect(page.getByRole('row')).toHaveCount(3);
     80   }
     81 
     82   // Reload page
     83   await page.reload();
     84 
     85   // Assert outputs are still the same
     86   {
     87     // Assert paces are correct (custom targets and default units not reset)
     88     await expect(page.getByRole('row').nth(1)).toHaveText('0.4 km' + '1:55.58');
     89     await expect(page.getByRole('row').nth(2)).toHaveText('800 m' + '3:51.15');
     90     await expect(page.getByRole('row')).toHaveCount(3);
     91 
     92     // Switch target set
     93     await page.getByText('Advanced Options').click();
     94     await page.getByLabel('Selected target set').selectOption('Less-common Pace Targets');
     95 
     96     // Assert paces are correct
     97     await expect(page.getByRole('row').nth(11)).toHaveText('1.01 mi' + '7:49.65');
     98     await expect(page.getByRole('row').nth(13)).toHaveText('2.08 km' + '10:01');
     99     await expect(page.getByRole('row').nth(14)).toHaveText('1.5 mi' + '11:37.50');
    100     await expect(page.getByRole('row').nth(18)).toHaveText('3.95 km' + '19:00');
    101     await expect(page.getByRole('row')).toHaveCount(33);
    102   }
    103 
    104   // Test target set deletion and reversion
    105   {
    106     // Delete custom target set
    107     await page.getByLabel('Selected target set').selectOption('800m Splits');
    108     await page.getByRole('button', { name: 'Edit target set' }).click();
    109     await expect(page.getByLabel('Target set label')).toHaveValue('800m Splits');
    110     await page.getByRole('button', { name: 'Delete target set' }).click();
    111 
    112     // Assert paces are correct (back to default target set)
    113     await expect(page.getByRole('row').nth(11)).toHaveText('1.01 mi' + '7:49.65');
    114     await expect(page.getByRole('row').nth(13)).toHaveText('2.08 km' + '10:01');
    115     await expect(page.getByRole('row').nth(14)).toHaveText('1.5 mi' + '11:37.50');
    116     await expect(page.getByRole('row').nth(18)).toHaveText('3.95 km' + '19:00');
    117     await expect(page.getByRole('row')).toHaveCount(33);
    118 
    119     // Revert target set
    120     await page.getByRole('button', { name: 'Edit target set' }).click();
    121     await expect(page.getByLabel('Target set label')).toHaveValue('Less-common Pace Targets');
    122     await page.getByRole('button', { name: 'Revert target set' }).click();
    123     await page.getByRole('button', { name: 'Close' }).click();
    124 
    125     // Assert paces are correct
    126     await expect(page.getByRole('row').nth(11)).toHaveText('1 mi' + '7:45.00');
    127     await expect(page.getByRole('row').nth(13)).toHaveText('2.08 km' + '10:00');
    128     await expect(page.getByRole('row')).toHaveCount(31);
    129 
    130     // Assert title was reset
    131     await page.getByRole('button', { name: 'Edit target set' }).click();
    132     await expect(page.getByLabel('Target set label')).toHaveValue('Common Pace Targets');
    133   }
    134 });