123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /**
- * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
- const themesToTest = ['light', 'dark', 'light-highcontrast', 'dark-highcontrast']
- const testCases = {
- 'Main text': {
- foregroundColors: [
- 'color-main-text',
- // 'color-text-light', deprecated
- // 'color-text-lighter', deprecated
- 'color-text-maxcontrast',
- ],
- backgroundColors: [
- 'color-main-background',
- 'color-background-hover',
- 'color-background-dark',
- // 'color-background-darker', this should only be used for elements not for text
- ],
- },
- 'blurred background': {
- foregroundColors: [
- 'color-main-text',
- 'color-text-maxcontrast-blur',
- ],
- backgroundColors: [
- 'color-main-background-blur',
- ],
- },
- Primary: {
- foregroundColors: [
- 'color-primary-text',
- ],
- backgroundColors: [
- // 'color-primary-default', this should only be used for elements not for text!
- // 'color-primary-hover', this should only be used for elements and not for text!
- 'color-primary',
- ],
- },
- 'Primary light': {
- foregroundColors: [
- 'color-primary-light-text',
- ],
- backgroundColors: [
- 'color-primary-light',
- 'color-primary-light-hover',
- ],
- },
- 'Primary element': {
- foregroundColors: [
- 'color-primary-element-text',
- 'color-primary-element-text-dark',
- ],
- backgroundColors: [
- 'color-primary-element',
- 'color-primary-element-hover',
- ],
- },
- 'Primary element light': {
- foregroundColors: [
- 'color-primary-element-light-text',
- ],
- backgroundColors: [
- 'color-primary-element-light',
- 'color-primary-element-light-hover',
- ],
- },
- 'Servity information texts': {
- foregroundColors: [
- 'color-error-text',
- 'color-warning-text',
- 'color-success-text',
- 'color-info-text',
- ],
- backgroundColors: [
- 'color-main-background',
- 'color-background-hover',
- 'color-main-background-blur',
- ],
- },
- }
- /**
- * Create a wrapper element with color and background set
- *
- * @param foreground The foreground color (css variable without leading --)
- * @param background The background color
- */
- function createTestCase(foreground: string, background: string) {
- const wrapper = document.createElement('div')
- wrapper.style.padding = '14px'
- wrapper.style.color = `var(--${foreground})`
- wrapper.style.backgroundColor = `var(--${background})`
- if (background.includes('blur')) {
- wrapper.style.backdropFilter = 'var(--filter-background-blur)'
- }
- const testCase = document.createElement('div')
- testCase.innerText = `${foreground} ${background}`
- testCase.setAttribute('data-cy-testcase', '')
- wrapper.appendChild(testCase)
- return wrapper
- }
- describe('Accessibility of Nextcloud theming colors', () => {
- for (const theme of themesToTest) {
- context(`Theme: ${theme}`, () => {
- before(() => {
- cy.createRandomUser().then(($user) => {
- // set user theme
- cy.runOccCommand(`user:setting -- '${$user.userId}' theming enabled-themes '[\\"${theme}\\"]'`)
- cy.login($user)
- cy.visit('/')
- cy.injectAxe({ axeCorePath: 'node_modules/axe-core/axe.min.js' })
- })
- })
- beforeEach(() => {
- cy.document().then(doc => {
- // Unset background image and thus use background-color for testing blur background (images do not work with axe-core)
- doc.body.style.backgroundImage = 'unset'
- const root = doc.querySelector('main')
- if (root === null) {
- throw new Error('No test root found')
- }
- root.innerHTML = ''
- })
- })
- for (const [name, { backgroundColors, foregroundColors }] of Object.entries(testCases)) {
- context(`Accessibility of CSS color variables for ${name}`, () => {
- for (const foreground of foregroundColors) {
- for (const background of backgroundColors) {
- it(`color contrast of ${foreground} on ${background}`, () => {
- cy.document().then(doc => {
- const element = createTestCase(foreground, background)
- const root = doc.querySelector('main')
- // eslint-disable-next-line no-unused-expressions
- expect(root).not.to.be.undefined
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- root!.appendChild(element)
- cy.checkA11y('[data-cy-testcase]', {
- runOnly: ['color-contrast'],
- })
- })
- })
- }
- }
- })
- }
- })
- }
- })
|