mirror of https://github.com/msgbyte/tailchat
chore: e2e testing
parent
bfc413750e
commit
3daf76b2e3
@ -0,0 +1,7 @@
|
|||||||
|
# 临时忽略, 这些是自动生成的代码
|
||||||
|
cypress/integration
|
||||||
|
cypress/fixtures
|
||||||
|
|
||||||
|
# 未启用的代码
|
||||||
|
cypress/screenshots
|
||||||
|
cypress/snapshots
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"component": {
|
||||||
|
"testFiles": "**/*.test.{js,ts,jsx,tsx}",
|
||||||
|
"componentFolder": "./cypress/components/"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { mount } from '@cypress/react';
|
||||||
|
import { Button } from 'antd';
|
||||||
|
import { TestWrapper } from './utils/TestWrapper';
|
||||||
|
|
||||||
|
describe('antd dark', () => {
|
||||||
|
it('antd button', () => {
|
||||||
|
mount(
|
||||||
|
<TestWrapper>
|
||||||
|
<Button data-testid="default">默认</Button>
|
||||||
|
<Button type="primary" data-testid="primary">
|
||||||
|
主色
|
||||||
|
</Button>
|
||||||
|
<Button danger={true} type="primary" data-testid="primary-danger">
|
||||||
|
主危险
|
||||||
|
</Button>
|
||||||
|
</TestWrapper>
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.get('[data-testid=default]')
|
||||||
|
.should('have.css', 'color', 'rgba(255, 255, 255, 0.65)')
|
||||||
|
.should('have.css', 'border-color', 'rgb(67, 67, 67)')
|
||||||
|
.should('have.css', 'background-color', 'rgba(0, 0, 0, 0)')
|
||||||
|
.matchImageSnapshot();
|
||||||
|
|
||||||
|
cy.get('[data-testid=primary]')
|
||||||
|
.should('have.css', 'color', 'rgb(255, 255, 255)')
|
||||||
|
.should('have.css', 'border-color', 'rgb(23, 125, 220)')
|
||||||
|
.should('have.css', 'background-color', 'rgb(23, 125, 220)');
|
||||||
|
|
||||||
|
cy.get('[data-testid=primary-danger]')
|
||||||
|
.should('have.css', 'color', 'rgb(255, 255, 255)')
|
||||||
|
.should('have.css', 'border-color', 'rgb(166, 29, 36)')
|
||||||
|
.should('have.css', 'background-color', 'rgb(166, 29, 36)');
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,21 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import '../../../../src/styles';
|
||||||
|
import clsx from 'clsx';
|
||||||
|
|
||||||
|
export const TestWrapper: React.FC<{
|
||||||
|
theme?: 'dark' | 'light';
|
||||||
|
}> = (props) => {
|
||||||
|
const { theme = 'dark' } = props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={clsx(theme, {
|
||||||
|
'bg-black': theme === 'dark',
|
||||||
|
})}
|
||||||
|
data-testid="test-wrapper"
|
||||||
|
>
|
||||||
|
{props.children}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
TestWrapper.displayName = 'TestWrapper';
|
@ -0,0 +1,36 @@
|
|||||||
|
/// <reference types="cypress" />
|
||||||
|
// ***********************************************************
|
||||||
|
// This example plugins/index.js can be used to load plugins
|
||||||
|
//
|
||||||
|
// You can change the location of this file or turn off loading
|
||||||
|
// the plugins file with the 'pluginsFile' configuration option.
|
||||||
|
//
|
||||||
|
// You can read more here:
|
||||||
|
// https://on.cypress.io/plugins-guide
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// This function is called when a project is opened or re-opened (e.g. due to
|
||||||
|
// the project's config changing)
|
||||||
|
|
||||||
|
const injectDevServer = require('./load-webpack');
|
||||||
|
const path = require('path');
|
||||||
|
const {
|
||||||
|
addMatchImageSnapshotPlugin,
|
||||||
|
} = require('cypress-image-snapshot/plugin');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Cypress.PluginConfig}
|
||||||
|
*/
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
module.exports = (on, config) => {
|
||||||
|
// `on` is used to hook into various events Cypress emits
|
||||||
|
// `config` is the resolved Cypress config
|
||||||
|
|
||||||
|
injectDevServer(on, config, {
|
||||||
|
webpackFilename: path.resolve(__dirname, '../../../webpack.config.ts'),
|
||||||
|
});
|
||||||
|
|
||||||
|
addMatchImageSnapshotPlugin(on, config);
|
||||||
|
|
||||||
|
return config;
|
||||||
|
};
|
@ -0,0 +1,39 @@
|
|||||||
|
// @ts-check
|
||||||
|
const path = require('path');
|
||||||
|
const { startDevServer } = require('@cypress/webpack-dev-server');
|
||||||
|
const tryLoadWebpackConfig = require('./utils/tryLoadWebpackConfig');
|
||||||
|
|
||||||
|
/** @type {(config: Cypress.PluginConfigOptions, path: string) => string} */
|
||||||
|
function normalizeWebpackPath(config, webpackConfigPath) {
|
||||||
|
return path.isAbsolute(webpackConfigPath)
|
||||||
|
? webpackConfigPath
|
||||||
|
: path.resolve(config.projectRoot, webpackConfigPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Injects dev-server based on the webpack config file.
|
||||||
|
*
|
||||||
|
* **Important:** `webpackFilename` path is relative to the project root (cypress.json location)
|
||||||
|
* @type {(on: Cypress.PluginEvents, config: Cypress.PluginConfigOptions, options: { webpackFilename: string }) => Cypress.PluginConfigOptions}
|
||||||
|
*/
|
||||||
|
function injectWebpackDevServer(on, config, { webpackFilename }) {
|
||||||
|
const webpackConfig = tryLoadWebpackConfig(
|
||||||
|
normalizeWebpackPath(config, webpackFilename)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!webpackConfig) {
|
||||||
|
throw new Error(
|
||||||
|
`Can not load webpack config from path ${webpackFilename}.`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
on('dev-server:start', async (options) => {
|
||||||
|
return startDevServer({ options, webpackConfig });
|
||||||
|
});
|
||||||
|
|
||||||
|
config.env.reactDevtools = true;
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = injectWebpackDevServer;
|
@ -0,0 +1,40 @@
|
|||||||
|
// @ts-check
|
||||||
|
const debug = require('debug')('@cypress/react');
|
||||||
|
|
||||||
|
/** @type {(configPath: string) => null | import('webpack').Configuration } */
|
||||||
|
module.exports = function tryLoadWebpackConfig(webpackConfigPath) {
|
||||||
|
debug('trying to load webpack config from %s', webpackConfigPath);
|
||||||
|
// Do this as the first thing so that any code reading it knows the right env.
|
||||||
|
const envName = 'test';
|
||||||
|
|
||||||
|
// @ts-expect-error override env is possible
|
||||||
|
process.env.NODE_ENV = envName;
|
||||||
|
process.env.BABEL_ENV = envName;
|
||||||
|
|
||||||
|
try {
|
||||||
|
let webpackOptions = require(webpackConfigPath);
|
||||||
|
|
||||||
|
if (webpackOptions.default) {
|
||||||
|
// we probably loaded TS file
|
||||||
|
debug('loaded webpack options has .default - taking that as the config');
|
||||||
|
webpackOptions = webpackOptions.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof webpackOptions === 'function') {
|
||||||
|
debug('calling webpack function with environment "%s"', envName);
|
||||||
|
webpackOptions = webpackOptions('development');
|
||||||
|
}
|
||||||
|
|
||||||
|
debug('webpack options: %o', webpackOptions);
|
||||||
|
|
||||||
|
return webpackOptions;
|
||||||
|
} catch (err) {
|
||||||
|
debug('could not load react-scripts webpack');
|
||||||
|
debug('error %s', err.message);
|
||||||
|
debug(err);
|
||||||
|
|
||||||
|
console.error(err);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,20 @@
|
|||||||
|
// ***********************************************************
|
||||||
|
// 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
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// Import commands.js using ES2015 syntax:
|
||||||
|
import './commands';
|
||||||
|
|
||||||
|
// Alternatively you can use CommonJS syntax:
|
||||||
|
// require('./commands')
|
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "tailchat-e2e",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"author": "moonrailgun",
|
||||||
|
"license": "MIT",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"cypress:open": "cypress open",
|
||||||
|
"cypress:run": "cypress run",
|
||||||
|
"cypress:open-ct": "cypress open-ct",
|
||||||
|
"cypress:run-ct": "cypress run-ct"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@cypress/react": "^5.9.4",
|
||||||
|
"@cypress/webpack-dev-server": "^1.4.0",
|
||||||
|
"@types/cypress-image-snapshot": "^3.1.6",
|
||||||
|
"cypress": "^8.3.0",
|
||||||
|
"cypress-image-snapshot": "^4.0.1"
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,4 @@
|
|||||||
|
import 'antd/dist/antd.css';
|
||||||
|
import './antd/index.less';
|
||||||
|
import 'tailwindcss/tailwind.css';
|
||||||
|
import './global.less';
|
Loading…
Reference in New Issue