From 168756dbeedc1e86eaff6fc35d5e03e224cf6bb6 Mon Sep 17 00:00:00 2001 From: Joan Perals Tresserra Date: Wed, 20 May 2026 16:22:25 +0200 Subject: [PATCH] chore: Generate test definitions --- build-tools/tasks/index.js | 1 + build-tools/tasks/package-json.js | 5 ++++ build-tools/tasks/test-definitions.js | 8 ++++++ gulpfile.js | 4 ++- test/definitions/index.ts | 10 +++++++ test/definitions/types.ts | 27 ++++++++++++++++++ test/definitions/visual/action-card.ts | 32 ++++++++++++++++++++++ test/definitions/visual/alert.ts | 38 ++++++++++++++++++++++++++ tsconfig.test-definitions.json | 20 ++++++++++++++ 9 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 build-tools/tasks/test-definitions.js create mode 100644 test/definitions/index.ts create mode 100644 test/definitions/types.ts create mode 100644 test/definitions/visual/action-card.ts create mode 100644 test/definitions/visual/alert.ts create mode 100644 tsconfig.test-definitions.json diff --git a/build-tools/tasks/index.js b/build-tools/tasks/index.js index 982a8f6a72..d7db3c0784 100644 --- a/build-tools/tasks/index.js +++ b/build-tools/tasks/index.js @@ -21,4 +21,5 @@ module.exports = { themeableSource: require('./themeable-source'), bundleVendorFiles: require('./bundle-vendor-files'), sizeLimit: require('./size-limit'), + testDefinitions: require('./test-definitions'), }; diff --git a/build-tools/tasks/package-json.js b/build-tools/tasks/package-json.js index a0d076df35..a7c69a53f5 100644 --- a/build-tools/tasks/package-json.js +++ b/build-tools/tasks/package-json.js @@ -101,6 +101,10 @@ const devPagesPackageJson = generatePackageJson(path.join(workspace.targetPath, name: '@cloudscape-design/dev-pages', }); +const testDefinitionsPackageJson = generatePackageJson(path.join(workspace.targetPath, 'test-definitions'), { + name: '@cloudscape-design/test-definitions', +}); + module.exports = parallel([ ...themes.flatMap(theme => [ generatePackageJson( @@ -130,5 +134,6 @@ module.exports = parallel([ componentsThemeablePackageJson, copyTask('package-lock', ['package-lock.json'], path.join(workspace.targetPath, 'dev-pages', 'internal')), devPagesPackageJson, + testDefinitionsPackageJson, ]); module.exports.generatePackageJson = generatePackageJson; diff --git a/build-tools/tasks/test-definitions.js b/build-tools/tasks/test-definitions.js new file mode 100644 index 0000000000..db82381589 --- /dev/null +++ b/build-tools/tasks/test-definitions.js @@ -0,0 +1,8 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +const execa = require('execa'); +const { task } = require('../utils/gulp-utils'); + +module.exports = task('test-definitions', () => + execa('tsc', ['-p', 'tsconfig.test-definitions.json'], { stdio: 'inherit' }) +); diff --git a/gulpfile.js b/gulpfile.js index 9d290b74f1..6e3f389082 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -23,6 +23,7 @@ const { themeableSource, bundleVendorFiles, sizeLimit, + testDefinitions, } = require('./build-tools/tasks'); const quickBuild = series( @@ -35,7 +36,8 @@ const quickBuild = series( exports.clean = clean; exports['quick-build'] = quickBuild; exports.i18n = generateI18nMessages; -exports.build = series(quickBuild, parallel(buildPages, themeableSource, docs, sizeLimit)); +exports.build = series(quickBuild, parallel(buildPages, themeableSource, docs, sizeLimit, testDefinitions)); +exports['build:test-definitions'] = testDefinitions; exports.test = series(unit, integ, a11y); exports['test:unit'] = unit; exports['test:integ'] = integ; diff --git a/test/definitions/index.ts b/test/definitions/index.ts new file mode 100644 index 0000000000..91e90a89f7 --- /dev/null +++ b/test/definitions/index.ts @@ -0,0 +1,10 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// Each component has its own test definition file. +// Import them here manually to form the full test suite. +import { TestSuite } from './types'; +import actionCard from './visual/action-card'; +import alert from './visual/alert'; + +export const allSuites: TestSuite[] = [actionCard, alert]; diff --git a/test/definitions/types.ts b/test/definitions/types.ts new file mode 100644 index 0000000000..8cdca9996a --- /dev/null +++ b/test/definitions/types.ts @@ -0,0 +1,27 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import type { ScreenshotPageObject } from '@cloudscape-design/browser-test-tools/page-objects'; + +export interface ScreenshotTestConfiguration { + width?: number; + height?: number; +} + +// 'screenshotArea' — captures the .screenshot-area element on the page. +// 'permutations' — captures the entire page and crops permutations out of it. +export type ScreenshotType = 'screenshotArea' | 'permutations'; + +export interface TestDefinition { + description: string; + path: string; + screenshotType: ScreenshotType; + queryParams?: Record; + configuration?: ScreenshotTestConfiguration; + setup?: (page: ScreenshotPageObject) => Promise; +} + +export interface TestSuite { + componentName?: string; + description: string; + tests: Array; +} diff --git a/test/definitions/visual/action-card.ts b/test/definitions/visual/action-card.ts new file mode 100644 index 0000000000..81426c4e26 --- /dev/null +++ b/test/definitions/visual/action-card.ts @@ -0,0 +1,32 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import { TestSuite } from '../types'; + +const suite: TestSuite = { + description: 'Action card', + componentName: 'action-card', + tests: [ + { + description: 'permutations', + path: 'action-card/permutations', + screenshotType: 'permutations', + }, + { + description: 'variant permutations', + path: 'action-card/variant-permutations', + screenshotType: 'permutations', + }, + { + description: 'padding permutations', + path: 'action-card/padding-permutations', + screenshotType: 'permutations', + }, + { + description: 'simple', + path: 'action-card/simple', + screenshotType: 'screenshotArea', + }, + ], +}; + +export default suite; diff --git a/test/definitions/visual/alert.ts b/test/definitions/visual/alert.ts new file mode 100644 index 0000000000..3220c79e7e --- /dev/null +++ b/test/definitions/visual/alert.ts @@ -0,0 +1,38 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { TestSuite } from '../types'; + +const suite: TestSuite = { + description: 'Alert', + componentName: 'alert', + tests: [ + { + description: 'simple', + path: 'alert/simple', + screenshotType: 'screenshotArea', + }, + { + description: 'style custom page', + path: 'alert/style-custom-types', + screenshotType: 'screenshotArea', + }, + ...[600, 1280].map(width => ({ + description: `width ${width}px`, + tests: [ + { + description: 'permutations', + path: 'alert/permutations', + screenshotType: 'permutations' as const, + }, + { + description: 'custom types', + path: 'alert/style-custom-types', + screenshotType: 'screenshotArea' as const, + }, + ], + })), + ], +}; + +export default suite; diff --git a/tsconfig.test-definitions.json b/tsconfig.test-definitions.json new file mode 100644 index 0000000000..30e82b4047 --- /dev/null +++ b/tsconfig.test-definitions.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "lib": ["ES2021", "DOM"], + "target": "ES2019", + "types": [], + "module": "CommonJS", + "moduleResolution": "node", + "esModuleInterop": true, + "strict": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "inlineSources": true, + "rootDir": "test/definitions", + "outDir": "lib/test-definitions", + "skipLibCheck": true + }, + "include": ["test/definitions", "test/types.ts"], + "exclude": [] +}