/ ui / service / tests / visual.spec.ts
visual.spec.ts
  1  import { type Page, expect, test } from '@playwright/test'
  2  
  3  const goToFirstSnapshotAndExpanSomeWidgets = async ({
  4    projectName,
  5    page
  6  }: {
  7    page: Page
  8  
  9    projectName: string
 10  }) => {
 11    await page.goto('/')
 12    await page.getByRole('link', { name: projectName, exact: true }).click()
 13    await page.getByRole('tab', { name: 'Reports', exact: true }).click()
 14    await page.getByRole('link', { name: 'View', exact: true }).first().click()
 15    await page.waitForLoadState('networkidle')
 16  
 17    const Details = page.getByRole('button', { name: 'Details', exact: true })
 18  
 19    const DetailsCount = await Details.count()
 20  
 21    if (DetailsCount === 0) {
 22      return
 23    }
 24  
 25    await expect(Details.first()).toBeVisible()
 26  
 27    await Details.first().click()
 28    await page.waitForLoadState('networkidle')
 29  
 30    if (DetailsCount > 1) {
 31      await Details.nth(1).click()
 32      await page.waitForLoadState('networkidle')
 33    }
 34  
 35    if (DetailsCount > 2) {
 36      await Details.last().click()
 37      await page.waitForLoadState('networkidle')
 38    }
 39  
 40    await page.waitForTimeout(1000)
 41  }
 42  
 43  const VisualTestSnapshot = async ({
 44    page,
 45    projectName
 46  }: {
 47    page: Page
 48    projectName: string
 49  }) => {
 50    await goToFirstSnapshotAndExpanSomeWidgets({
 51      page,
 52      projectName
 53    })
 54  
 55    await expect(page).toHaveScreenshot({ fullPage: true, maxDiffPixels: 150 })
 56  }
 57  
 58  const goToSnapshotsList = async ({
 59    projectName,
 60    page
 61  }: {
 62    page: Page
 63    projectName: string
 64  }) => {
 65    await page.goto('/')
 66    await page.getByRole('link', { name: projectName }).click()
 67    await page.getByRole('tab', { name: 'Reports' }).click()
 68    await page.waitForLoadState('networkidle')
 69  }
 70  
 71  const VisualTestSnapshotsList = async ({
 72    page,
 73    projectName
 74  }: {
 75    page: Page
 76    projectName: string
 77  }) => {
 78    await goToSnapshotsList({
 79      page,
 80      projectName
 81    })
 82  
 83    await expect(page).toHaveScreenshot({ fullPage: true, maxDiffPixels: 150 })
 84  }
 85  
 86  const VisualTestDashboard = async ({ page, projectName }: { page: Page; projectName: string }) => {
 87    await page.goto('/')
 88    await page.getByRole('link', { name: projectName }).click()
 89    await page.waitForLoadState('networkidle')
 90    await expect(page).toHaveScreenshot({ fullPage: true, maxDiffPixels: 150 })
 91  }
 92  
 93  const BikesDemoProjectName = 'Demo project - Bikes'
 94  
 95  /////////////////////
 96  ///   Home
 97  /////////////////////
 98  
 99  test('Home', async ({ page }) => {
100    await page.goto('/')
101    await page.waitForLoadState('networkidle')
102    await expect(page).toHaveScreenshot({ fullPage: true, maxDiffPixels: 150 })
103  })
104  
105  /////////////////////
106  ///  Shapshots List
107  /////////////////////
108  
109  for (const project of [BikesDemoProjectName]) {
110    test(`Reports List: ${project}`, async ({ page }) => {
111      await VisualTestSnapshotsList({ page, projectName: project })
112    })
113  }
114  
115  /////////////////////
116  ///   Dashboards
117  /////////////////////
118  
119  for (const project of [BikesDemoProjectName]) {
120    test(`Dashboard: ${project}`, async ({ page }) => {
121      await VisualTestDashboard({ page, projectName: project })
122    })
123  }
124  
125  /////////////////////
126  ///   Snapshots
127  /////////////////////
128  
129  for (const project of [BikesDemoProjectName]) {
130    test(`Report: ${project}`, async ({ page }) => {
131      await VisualTestSnapshot({ page, projectName: project })
132    })
133  }