mirror of
https://github.com/UniversityOfHelsinkiCS/oodikone.git
synced 2026-10-12 19:03:39 +03:00
[Playwright] Fix lint errors in e2e tests and plugins
- Converted loops to Promise.all where appropriate - Removed inferrable types and unused async params - Converted Cypress plugins to named export Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
committed by
Aaro Koivukangas
co-authored by
Copilot
parent
d73f3b5101
commit
4587d66ac2
@@ -1,7 +1,7 @@
|
||||
import { test, expect, Page } from '@playwright/test'
|
||||
import { checkTableStats, init } from './support/commands'
|
||||
|
||||
const getEmptyYears = (isAcademicYear: boolean = false) => {
|
||||
const getEmptyYears = (isAcademicYear = false) => {
|
||||
const today = new Date()
|
||||
const latestYear = isAcademicYear && today.getMonth() < 7 ? today.getFullYear() - 1 : today.getFullYear()
|
||||
const years = []
|
||||
@@ -43,7 +43,7 @@ test.describe('Degree programme overview', () => {
|
||||
})
|
||||
test.describe('Basic information tab works for basic user', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
init(page, '/study-programme')
|
||||
await init(page, '/study-programme')
|
||||
await page.getByRole('link', { name: 'Matemaattisten tieteiden kandiohjelma' }).click()
|
||||
await page.getByTestId('year-toggle').click() // NOTE: Tests are written for calendar years
|
||||
})
|
||||
@@ -212,15 +212,12 @@ test.describe('Degree programme overview', () => {
|
||||
|
||||
test.describe('Graduation times of master programmes', () => {
|
||||
test('are split into three graphs', async ({ page }) => {
|
||||
init(page, '/study-programme')
|
||||
await init(page, '/study-programme')
|
||||
await page.getByRole('link', { name: 'Matematiikan ja tilastotieteen maisteriohjelma' }).click()
|
||||
await page.getByTestId('year-toggle').click() // Tests are written for calendar year
|
||||
|
||||
// await expect(page.getByTestId("unset-breakdown-bar-chart")).toBeVisible()
|
||||
|
||||
await page.getByTestId('graduation-mode-selector').getByTestId('select-average').click()
|
||||
|
||||
// await expect(page.getByTestId("unset-breakdown-section").getByText("Master study right")).toBeVisible()
|
||||
const masterChart = page
|
||||
.getByTestId('unset-graduation-times-section')
|
||||
.filter({ hasText: 'Master study right', hasNotText: 'Bachelor +' })
|
||||
@@ -251,11 +248,7 @@ test.describe('Degree programme overview', () => {
|
||||
|
||||
test.describe('Study tracks and class statistics tab works for basic user', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
// cy.intercept(
|
||||
// 'GET',
|
||||
// 'api/studyprogrammes/KH50_001/studytrackstats?special_groups=SPECIAL_INCLUDED&combined_programme='
|
||||
// ).as('stQuery')
|
||||
init(page, '/study-programme')
|
||||
await init(page, '/study-programme')
|
||||
await page.getByRole('link', { name: 'Matemaattisten tieteiden kandiohjelma' }).click()
|
||||
await page.getByTestId('StudyTracksAndClassStatisticsTab').click()
|
||||
})
|
||||
@@ -659,7 +652,9 @@ test.describe('Degree programme overview', () => {
|
||||
await expect(page.getByText('Select curriculum to edit:')).toBeVisible()
|
||||
await expect(page.getByTestId('curriculum-picker').getByText('2023–2026')).toBeVisible()
|
||||
})
|
||||
test.skip('can be changed', async () => {})
|
||||
test.skip('can be changed', () => {
|
||||
return
|
||||
})
|
||||
})
|
||||
|
||||
test.describe('Credit criteria section', () => {
|
||||
@@ -671,7 +666,7 @@ test.describe('Degree programme overview', () => {
|
||||
).toBeVisible()
|
||||
})
|
||||
|
||||
test.skip('changing the credit criteria works', async ({ page }) => {
|
||||
test.skip('changing the credit criteria works', () => {
|
||||
// TODO: Test using the inputs
|
||||
// TODO: Button status
|
||||
// TODO: Test "previously set to _" text changing when saving
|
||||
@@ -765,15 +760,17 @@ test.describe('Degree programme overview', () => {
|
||||
|
||||
await page.getByText('Students (5)').click()
|
||||
|
||||
for (const studentNumber of studentNumbers) {
|
||||
await expect(page.getByText(studentNumber)).toBeVisible()
|
||||
}
|
||||
await Promise.all(studentNumbers.map(studentNumber => expect(page.getByText(studentNumber)).toBeVisible()))
|
||||
|
||||
for (const studentNumber of studentNumbers) {
|
||||
await page.goto(`/students/${studentNumber}`)
|
||||
await expect(page.getByRole('heading', { name: 'Tags' })).toBeVisible()
|
||||
await expect(page.getByText(tagName)).toBeVisible()
|
||||
}
|
||||
await Promise.all(
|
||||
studentNumbers.map(async studentNumber => {
|
||||
const studentPage = await context.newPage()
|
||||
await studentPage.goto(`/students/${studentNumber}`)
|
||||
await expect(studentPage.getByRole('heading', { name: 'Tags' })).toBeVisible()
|
||||
await expect(studentPage.getByText(tagName)).toBeVisible()
|
||||
await studentPage.close()
|
||||
})
|
||||
)
|
||||
|
||||
// Change to other tab
|
||||
const pagePromise = context.waitForEvent('page')
|
||||
@@ -782,16 +779,20 @@ test.describe('Degree programme overview', () => {
|
||||
await deleteTag(newPage, tagName)
|
||||
})
|
||||
|
||||
test('deleting a tag from tag view also removes it from students', async ({ page }) => {
|
||||
test('deleting a tag from tag view also removes it from students', async ({ page, context }) => {
|
||||
// NOTE: Navigating to each students' page takes time, fix?
|
||||
test.slow()
|
||||
|
||||
await expect(page.getByText(tagName)).not.toBeVisible()
|
||||
for (const studentNumber of studentNumbers) {
|
||||
await page.goto(`/students/${studentNumber}`)
|
||||
await expect(page.getByRole('heading', { name: 'Tags' })).not.toBeVisible()
|
||||
await expect(page.getByText(tagName)).not.toBeVisible()
|
||||
}
|
||||
await Promise.all(
|
||||
studentNumbers.map(async studentNumber => {
|
||||
const studentPage = await context.newPage()
|
||||
await studentPage.goto(`/students/${studentNumber}`)
|
||||
await expect(studentPage.getByRole('heading', { name: 'Tags' })).not.toBeVisible()
|
||||
await expect(studentPage.getByText(tagName)).not.toBeVisible()
|
||||
await studentPage.close()
|
||||
})
|
||||
)
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -802,7 +803,7 @@ test.describe('Degree programme overview', () => {
|
||||
await page.getByRole('link', { name: 'Matemaattisten tieteiden kandiohjelma' }).click()
|
||||
})
|
||||
|
||||
test.skip('year selector', async ({ page }) => {
|
||||
test.skip('year selector', () => {
|
||||
// TODO: Implement this test
|
||||
// Things to test:
|
||||
// - Clicking the button works
|
||||
|
||||
@@ -195,28 +195,32 @@ test.describe('Population statistics tests', () => {
|
||||
'Percentage of population',
|
||||
])
|
||||
|
||||
for (const category of [
|
||||
getTableData('All students of the class', [9, 5, 7, 4, 2, 0]),
|
||||
getTableData('Avoin väylä', [0, 1, 3, 2, 0, 0]),
|
||||
getTableData('Muu', [0, 1, 1, 1, 0, 0]),
|
||||
getTableData('Todistusvalinta', [9, 3, 3, 1, 2, 0]),
|
||||
]) {
|
||||
category.forEach(async ({ selector, start, end, students, percentage }, index) => {
|
||||
let value
|
||||
if (start === null) {
|
||||
value = '0 credits'
|
||||
} else if (end === null) {
|
||||
value = `${start} ≤ credits`
|
||||
} else {
|
||||
value = `${start} ≤ credits < ${end}`
|
||||
}
|
||||
const bodyLocator = page.getByTestId(selector).getByTestId('credits-gained-table-body')
|
||||
await expect(bodyLocator).toBeVisible()
|
||||
const row = bodyLocator.locator('tr').nth(index)
|
||||
await expect(row.locator('td')).toHaveCount(4)
|
||||
await expect(row.locator('td')).toHaveText(['' /* Icon */, value, students.toString(), percentage])
|
||||
})
|
||||
}
|
||||
await Promise.all(
|
||||
[
|
||||
getTableData('All students of the class', [9, 5, 7, 4, 2, 0]),
|
||||
getTableData('Avoin väylä', [0, 1, 3, 2, 0, 0]),
|
||||
getTableData('Muu', [0, 1, 1, 1, 0, 0]),
|
||||
getTableData('Todistusvalinta', [9, 3, 3, 1, 2, 0]),
|
||||
].map(category =>
|
||||
Promise.all(
|
||||
category.map(async ({ selector, start, end, students, percentage }, index) => {
|
||||
let value
|
||||
if (start === null) {
|
||||
value = '0 credits'
|
||||
} else if (end === null) {
|
||||
value = `${start} ≤ credits`
|
||||
} else {
|
||||
value = `${start} ≤ credits < ${end}`
|
||||
}
|
||||
const bodyLocator = page.getByTestId(selector).getByTestId('credits-gained-table-body')
|
||||
await expect(bodyLocator).toBeVisible()
|
||||
const row = bodyLocator.locator('tr').nth(index)
|
||||
await expect(row.locator('td')).toHaveCount(4)
|
||||
await expect(row.locator('td')).toHaveText(['' /* Icon */, value, students.toString(), percentage])
|
||||
})
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
const numberOfStudentCounts = await page
|
||||
.getByTestId('credits-gained-table-All students of the class')
|
||||
@@ -258,18 +262,22 @@ test.describe('Population statistics tests', () => {
|
||||
},
|
||||
]
|
||||
|
||||
for (const { selector, data, size } of categories) {
|
||||
const tableLocator = page.getByTestId(`statistics-table-${selector}`)
|
||||
await expect(tableLocator).toBeVisible()
|
||||
await expect(tableLocator.getByRole('heading', { level: 5, name: selector })).toBeVisible()
|
||||
await Promise.all(
|
||||
categories.map(async ({ selector, data, size }) => {
|
||||
const tableLocator = page.getByTestId(`statistics-table-${selector}`)
|
||||
await expect(tableLocator).toBeVisible()
|
||||
await expect(tableLocator.getByRole('heading', { level: 5, name: selector })).toBeVisible()
|
||||
|
||||
await expect(tableLocator.getByTestId('credit-stats-population-size')).toContainText(`n = ${size}`)
|
||||
await expect(tableLocator.getByTestId('credit-stats-population-size')).toContainText(`n = ${size}`)
|
||||
|
||||
for (let index = 0; index < rows.length; index++) {
|
||||
const row = tableLocator.locator('table tbody tr').nth(index)
|
||||
await expect(row.locator('td')).toHaveText([rows[index], data[index]])
|
||||
}
|
||||
}
|
||||
await Promise.all(
|
||||
rows.map((_, index) => {
|
||||
const row = tableLocator.locator('table tbody tr').nth(index)
|
||||
return expect(row.locator('td')).toHaveText([rows[index], data[index]])
|
||||
})
|
||||
)
|
||||
})
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
+3
-5
@@ -13,9 +13,7 @@ visibleLinks.admin = [...visibleLinks.basic, 'Teachers', 'Admin']
|
||||
|
||||
const containsLinks = async (page: Page, links: string[]) => {
|
||||
const navBar = page.getByTestId('nav-bar')
|
||||
for (const link of links) {
|
||||
await expect(navBar.getByText(link)).toBeVisible()
|
||||
}
|
||||
await Promise.all(links.map(link => expect(navBar.getByText(link)).toBeVisible()))
|
||||
}
|
||||
|
||||
const userButtonWorks = async (page: Page, username: string, mocking = false) => {
|
||||
@@ -81,10 +79,10 @@ test.describe('Users tests', () => {
|
||||
})
|
||||
|
||||
test("only the mocked user's programmes are visible", async ({ page }) => {
|
||||
page.route('**/api/populationstatistics/studyprogrammes', async route => {
|
||||
await page.route('**/api/populationstatistics/studyprogrammes', async route => {
|
||||
const response = await route.fetch()
|
||||
expect(response.status()).toBeLessThanOrEqual(304)
|
||||
route.fulfill({ response })
|
||||
await route.fulfill({ response })
|
||||
})
|
||||
|
||||
await page.goto('/populations')
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
/**
|
||||
* @type {Cypress.PluginConfig}
|
||||
*/
|
||||
module.exports = (on, config) => {
|
||||
export function setup(on, _config) {
|
||||
// `on` is used to hook into various events Cypress emits
|
||||
// `config` is the resolved Cypress config
|
||||
// `_config` is the resolved Cypress config (unused)
|
||||
on('before:browser:launch', (browser = {}, launchOptions) => {
|
||||
// By manually setting the browser width and height in headless
|
||||
// mode, screenshots and videos will have a better quality
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
// ***********************************************************
|
||||
// This example support/index.js is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
require('./commands')
|
||||
Cypress.on('uncaught:exception', error => {
|
||||
/* returning false here prevents Cypress from failing the test */
|
||||
return true
|
||||
})
|
||||
Reference in New Issue
Block a user