Repository navigation
Expand file tree
/
Copy pathplaywright-ct.config.ts
More file actions
193 lines (164 loc) · 7.37 KB
/
Copy pathplaywright-ct.config.ts
File metadata and controls
193 lines (164 loc) · 7.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
import type { PlaywrightTestConfig } from '@playwright/experimental-ct-react';
import { devices, defineConfig } from '@playwright/experimental-ct-react';
import react from '@vitejs/plugin-react';
import svgr from 'vite-plugin-svgr';
import appConfig from 'src/config';
import { ctPort } from './playwright/utils/ports';
const isInsideWorktree = __dirname.includes('/.claude/worktrees/');
/**
* See https://playwright.dev/docs/test-configuration.
*/
const config: PlaywrightTestConfig = defineConfig({
testDir: './',
testMatch: /.*\.pw\.tsx/,
testIgnore: isInsideWorktree ? undefined : '.claude/worktrees/**',
snapshotPathTemplate: '{testDir}/{testFileDir}/__screenshots__/{testFileName}_{projectName}_{arg}{ext}',
/* Maximum time one test can run for. */
timeout: 10 * 1000,
/* Run tests in files in parallel */
fullyParallel: true,
/* Fail the build on CI if you accidentally left test.only in the source code. */
forbidOnly: Boolean(process.env.CI),
/* Retry on CI only */
retries: process.env.CI ? 2 : 0,
/* Opt out of parallel tests. */
// on non-performant local machines some tests may fail due to lack of resources
// so we opt out of parallel tests in any environment
workers: 1,
outputDir: 'playwright-results',
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
// The json report sits under outputDir rather than next to the html one: the html reporter wipes
// playwright-report/ when the run ends, whereas outputDir is cleared at run start.
reporter: [
process.env.CI ? [ 'blob' ] : [ 'html' ],
[ 'json', { outputFile: 'playwright-results/report.json' } ],
],
expect: {
toHaveScreenshot: {
threshold: 0.05,
maxDiffPixels: 5,
},
},
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
baseURL: appConfig.app.baseUrl,
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: 'on-first-retry',
/* Port to use for Playwright component endpoint. */
ctPort,
headless: true,
ctViteConfig: {
plugins: [
react(),
svgr({
include: '**/*.svg',
svgrOptions: {
icon: true,
svgo: true,
plugins: [ '@svgr/plugin-jsx' ],
svgoConfig: {
plugins: [
{
name: 'preset-default',
params: {
overrides: {
removeViewBox: false,
removeHiddenElems: false,
},
},
},
'removeDimensions',
],
},
},
}),
],
build: {
// it actually frees some memory that vite needs a lot
// https://github.com/storybookjs/builder-vite/issues/409#issuecomment-1152848986
sourcemap: false,
minify: false,
rolldownOptions: {
output: {
// Ensure __envs exists in every chunk so code (e.g. configs/app) that
// runs before index.ts/envs.js doesn't throw. Real envs are set when envs.js runs.
//
// Explanation:
// With await import(...) in useAccount/useWallet, Vite turns those into separate chunks.
// In Playwright CT, the component’s chunk (and its dependency graph, including useAccount → config → getEnvValue → __envs)
// can load and run before the main entry that runs envs.js.
// So when that chunk runs, window.__envs isn’t set yet and you get ReferenceError: __envs is not defined.
//
// https://rollupjs.org/configuration-options/#output-banner-output-footer
banner: '(function(){if(typeof window!==\'undefined\')window.__envs=window.__envs||{};})();',
},
},
},
resolve: {
tsconfigPaths: true,
alias: [
// There is an issue with building these package using vite that I cannot resolve
// The solution described here - https://github.com/vitejs/vite/issues/9703#issuecomment-1216662109
// doesn't seam to work well with our setup
// so for now we just mock these modules in tests
{ find: '@metamask/post-message-stream', replacement: './playwright/mocks/modules/@metamask/post-message-stream.js' },
{ find: '@metamask/providers', replacement: './playwright/mocks/modules/@metamask/providers.js' },
// Mock for growthbook to test feature flags
{ find: 'src/services/growthbook/useFeatureValue', replacement: './playwright/mocks/client/services/growthbook/useFeatureValue.js' },
// Mock for reCaptcha hook
{ find: 'src/services/re-captcha/useReCaptcha', replacement: './playwright/mocks/client/services/re-captcha/useReCaptcha.js' },
// Mock for reCaptcha widget, so Google's script never loads and never fires the init error
{ find: /^react-google-recaptcha$/, replacement: './playwright/mocks/modules/react-google-recaptcha.js' },
// The createWeb3Modal() function from web3modal/wagmi/react somehow pollutes the global styles which causes the tests to fail
// We don't call this function in TestApp and since we use useWeb3Modal() and useWeb3ModalState() hooks in the code, we have to mock the module
// Otherwise it will complain that createWeb3Modal() is no called before the hooks are used
{ find: /^@reown\/appkit\/react$/, replacement: './playwright/mocks/modules/@reown/appkit/react.js' },
{ find: '/playwright/index.ts', replacement: './playwright/index.ts' },
{ find: '/playwright/envs.js', replacement: './playwright/envs.js' },
// Fix for @libp2p/utils missing merge-options export
{ find: '@libp2p/utils/merge-options', replacement: 'merge-options' },
// Mocks for the Helia packages to avoid build issues in tests
{ find: '@helia/verified-fetch', replacement: './playwright/mocks/modules/@helia/verified-fetch.js' },
{ find: /^@helia\/http$/, replacement: './playwright/mocks/modules/@helia/http.js' },
{ find: /^helia$/, replacement: './playwright/mocks/modules/helia.js' },
// Mock for @specify-sh/publisher-sdk to avoid build issues in tests
{ find: '@specify-sh/publisher-sdk', replacement: './playwright/mocks/modules/@specify-sh/publisher-sdk.js' },
],
},
define: {
'process.env': '__envs', // Port process.env over window.__envs
},
},
},
// configured projects
// these projects are also used for sharding tests in CI: the `pw_tests` matrix in
// .github/workflows/checks.yml runs one job per project, with `default` split into three shards
// when adding or deleting a project, or changing the shard count, make sure to update github workflow accordingly
projects: [
{
name: 'default',
grepInvert: /-@default/,
use: {
...devices['Desktop Chrome'],
viewport: { width: 1200, height: 750 },
},
},
{
name: 'mobile',
grep: /\+@mobile/,
use: {
...devices['iPhone 13 Pro'],
},
},
{
name: 'dark-color-mode',
grep: /\+@dark-mode/,
use: {
...devices['Desktop Chrome'],
viewport: { width: 1200, height: 750 },
colorScheme: 'dark',
},
},
],
});
export default config;