[READ-ONLY] Mirror of https://github.com/vitest-dev/vitest. Next generation testing framework powered by Vite. vitest.dev
test testing-tools vite
12

Configure Feed

Select the types of activity you want to include in your feed.

test(ui): test editor interaction (#10401)

Co-authored-by: Codex <noreply@openai.com>

authored by

Hiroshi Ogawa
Codex
and committed by
GitHub
(May 21, 2026, 9:16 AM +0200) 9bd17f47 0468e157

+267 -128
+129 -126
pnpm-lock.yaml
··· 180 180 vitest: workspace:* 181 181 182 182 patchedDependencies: 183 - '@sinonjs/fake-timers@15.3.2': 184 - hash: 5513cab538aec68ba021f971d90c859c11658db640ba76d316c8df0d2915b0b0 185 - path: patches/@sinonjs__fake-timers@15.3.2.patch 186 - acorn@8.11.3: 187 - hash: 62f89b815dbd769c8a4d5b19b1f6852f28922ecb581d876c8a8377d05c2483c4 188 - path: patches/acorn@8.11.3.patch 189 - cac@6.7.14: 190 - hash: a8f0f3517a47ce716ed90c0cfe6ae382ab763b021a664ada2a608477d0621588 191 - path: patches/cac@6.7.14.patch 192 - istanbul-lib-instrument: 193 - hash: fa76adf262fdb0bf545d5c529c5420e0ae33df7f5e344a6c8a727a2ffc0b0b11 194 - path: patches/istanbul-lib-instrument.patch 195 - istanbul-lib-source-maps: 196 - hash: be977704c4b9838da456619fe2421b5e24df2103a25967bd383b2246c88ddf6e 197 - path: patches/istanbul-lib-source-maps.patch 198 - rrweb-snapshot: 199 - hash: d11ec9bd9b66247ba493ab5fd117fbf0b4cb6e5d0a6a7c600d1d844bfa3d3044 200 - path: patches/rrweb-snapshot.patch 183 + '@sinonjs/fake-timers@15.3.2': 5513cab538aec68ba021f971d90c859c11658db640ba76d316c8df0d2915b0b0 184 + acorn@8.11.3: 62f89b815dbd769c8a4d5b19b1f6852f28922ecb581d876c8a8377d05c2483c4 185 + cac@6.7.14: a8f0f3517a47ce716ed90c0cfe6ae382ab763b021a664ada2a608477d0621588 186 + istanbul-lib-instrument: fa76adf262fdb0bf545d5c529c5420e0ae33df7f5e344a6c8a727a2ffc0b0b11 187 + istanbul-lib-source-maps: be977704c4b9838da456619fe2421b5e24df2103a25967bd383b2246c88ddf6e 188 + rrweb-snapshot: d11ec9bd9b66247ba493ab5fd117fbf0b4cb6e5d0a6a7c600d1d844bfa3d3044 201 189 202 190 importers: 203 191 ··· 241 229 version: link:packages/ui 242 230 bumpp: 243 231 specifier: ^10.4.1 244 - version: 10.4.1(magicast@0.3.5) 232 + version: 10.4.1 245 233 changelogithub: 246 234 specifier: ^14.0.0 247 - version: 14.0.0(magicast@0.3.5) 235 + version: 14.0.0 248 236 esbuild: 249 237 specifier: ^0.27.3 250 238 version: 0.27.3 ··· 268 256 version: 6.3.0(rollup@4.59.0)(typescript@5.9.3) 269 257 rollup-plugin-license: 270 258 specifier: ^3.7.0 271 - version: 3.7.0(picomatch@4.0.3)(rollup@4.59.0) 259 + version: 3.7.0(picomatch@4.0.4)(rollup@4.59.0) 272 260 tinyglobby: 273 261 specifier: 'catalog:' 274 262 version: 0.2.15 ··· 417 405 version: link:../../packages/browser-playwright 418 406 jsdom: 419 407 specifier: latest 420 - version: 29.0.1(@noble/hashes@1.8.0) 408 + version: 29.1.1(@noble/hashes@1.8.0) 421 409 playwright: 422 410 specifier: ^1.59.0 423 411 version: 1.59.0 ··· 474 462 version: 6.9.1 475 463 '@testing-library/react': 476 464 specifier: ^16.3.2 477 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.2.14)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) 465 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) 478 466 '@testing-library/user-event': 479 467 specifier: ^14.6.1 480 468 version: 14.6.1(@testing-library/dom@10.4.1) ··· 1258 1246 version: link:../../packages/vitest 1259 1247 vitest-browser-react: 1260 1248 specifier: ^2.0.5 1261 - version: 2.0.5(@types/react-dom@18.2.14)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@packages+vitest) 1249 + version: 2.0.5(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@packages+vitest) 1262 1250 ws: 1263 1251 specifier: 'catalog:' 1264 1252 version: 8.19.0 ··· 1330 1318 version: 3.0.3 1331 1319 '@vitejs/plugin-vue': 1332 1320 specifier: latest 1333 - version: 6.0.5(vite@8.0.11(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3)) 1321 + version: 6.0.7(vite@8.0.11(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3)) 1334 1322 '@vitest/browser-playwright': 1335 1323 specifier: workspace:* 1336 1324 version: link:../../packages/browser-playwright ··· 1354 1342 version: 2.4.10(@vue/compiler-dom@3.5.29)(@vue/server-renderer@3.5.29(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) 1355 1343 happy-dom: 1356 1344 specifier: latest 1357 - version: 20.8.7 1345 + version: 20.9.0 1358 1346 istanbul-lib-coverage: 1359 1347 specifier: 'catalog:' 1360 1348 version: 3.2.2 ··· 1556 1544 '@testing-library/dom': 1557 1545 specifier: ^10.4.1 1558 1546 version: 10.4.1 1547 + '@types/codemirror': 1548 + specifier: ^5.60.17 1549 + version: 5.60.17 1559 1550 '@vitest/browser-playwright': 1560 1551 specifier: workspace:* 1561 1552 version: link:../../packages/browser-playwright 1562 1553 happy-dom: 1563 1554 specifier: latest 1564 - version: 20.8.7 1555 + version: 20.9.0 1565 1556 vitest: 1566 1557 specifier: workspace:* 1567 1558 version: link:../../packages/vitest ··· 1690 1681 version: 3.2.2 1691 1682 jsdom: 1692 1683 specifier: latest 1693 - version: 29.0.1(@noble/hashes@1.8.0) 1684 + version: 29.1.1(@noble/hashes@1.8.0) 1694 1685 vitest: 1695 1686 specifier: workspace:* 1696 1687 version: link:../../packages/vitest ··· 1800 1791 '@asamuzakjp/css-color@4.1.2': 1801 1792 resolution: {integrity: sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==} 1802 1793 1803 - '@asamuzakjp/css-color@5.0.1': 1804 - resolution: {integrity: sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==} 1794 + '@asamuzakjp/css-color@5.1.11': 1795 + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} 1805 1796 engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} 1806 1797 1807 1798 '@asamuzakjp/dom-selector@6.7.6': 1808 1799 resolution: {integrity: sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==} 1809 1800 1810 - '@asamuzakjp/dom-selector@7.0.4': 1811 - resolution: {integrity: sha512-jXR6x4AcT3eIrS2fSNAwJpwirOkGcd+E7F7CP3zjdTqz9B/2huHOL8YJZBgekKwLML+u7qB/6P1LXQuMScsx0w==} 1801 + '@asamuzakjp/dom-selector@7.1.1': 1802 + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} 1803 + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} 1804 + 1805 + '@asamuzakjp/generational-cache@1.0.1': 1806 + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} 1812 1807 engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} 1813 1808 1814 1809 '@asamuzakjp/nwsapi@2.3.9': ··· 2392 2387 '@clack/prompts@1.0.1': 2393 2388 resolution: {integrity: sha512-/42G73JkuYdyWZ6m8d/CJtBrGl1Hegyc7Fy78m5Ob+jF85TOUmLR5XLce/U3LxYAw0kJ8CT5aI99RIvPHcGp/Q==} 2394 2389 2395 - '@csstools/color-helpers@6.0.1': 2396 - resolution: {integrity: sha512-NmXRccUJMk2AWA5A7e5a//3bCIMyOu2hAtdRYrhPPHjDxINuCwX1w6rnIZ4xjLcp0ayv6h8Pc3X0eJUGiAAXHQ==} 2397 - engines: {node: '>=20.19.0'} 2398 - 2399 2390 '@csstools/color-helpers@6.0.2': 2400 2391 resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} 2401 2392 engines: {node: '>=20.19.0'} ··· 2407 2398 '@csstools/css-parser-algorithms': ^4.0.0 2408 2399 '@csstools/css-tokenizer': ^4.0.0 2409 2400 2410 - '@csstools/css-color-parser@4.0.1': 2411 - resolution: {integrity: sha512-vYwO15eRBEkeF6xjAno/KQ61HacNhfQuuU/eGwH67DplL0zD5ZixUa563phQvUelA07yDczIXdtmYojCphKJcw==} 2401 + '@csstools/css-calc@3.2.1': 2402 + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} 2412 2403 engines: {node: '>=20.19.0'} 2413 2404 peerDependencies: 2414 2405 '@csstools/css-parser-algorithms': ^4.0.0 ··· 2421 2412 '@csstools/css-parser-algorithms': ^4.0.0 2422 2413 '@csstools/css-tokenizer': ^4.0.0 2423 2414 2415 + '@csstools/css-color-parser@4.1.1': 2416 + resolution: {integrity: sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==} 2417 + engines: {node: '>=20.19.0'} 2418 + peerDependencies: 2419 + '@csstools/css-parser-algorithms': ^4.0.0 2420 + '@csstools/css-tokenizer': ^4.0.0 2421 + 2424 2422 '@csstools/css-parser-algorithms@4.0.0': 2425 2423 resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} 2426 2424 engines: {node: '>=20.19.0'} 2427 2425 peerDependencies: 2428 2426 '@csstools/css-tokenizer': ^4.0.0 2429 2427 2430 - '@csstools/css-syntax-patches-for-csstree@1.0.27': 2431 - resolution: {integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==} 2432 - 2433 2428 '@csstools/css-syntax-patches-for-csstree@1.1.1': 2434 2429 resolution: {integrity: sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==} 2430 + peerDependencies: 2431 + css-tree: ^3.2.1 2432 + peerDependenciesMeta: 2433 + css-tree: 2434 + optional: true 2435 + 2436 + '@csstools/css-syntax-patches-for-csstree@1.1.4': 2437 + resolution: {integrity: sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==} 2435 2438 peerDependencies: 2436 2439 css-tree: ^3.2.1 2437 2440 peerDependenciesMeta: ··· 4551 4554 '@rolldown/pluginutils@1.0.0-rc.3': 4552 4555 resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} 4553 4556 4557 + '@rolldown/pluginutils@1.0.1': 4558 + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} 4559 + 4554 4560 '@rollup/plugin-babel@5.3.1': 4555 4561 resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} 4556 4562 engines: {node: '>= 10.0.0'} ··· 5188 5194 '@types/prompts@2.4.9': 5189 5195 resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} 5190 5196 5191 - '@types/react-dom@18.2.14': 5192 - resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} 5193 - 5194 5197 '@types/react-is@19.2.0': 5195 5198 resolution: {integrity: sha512-NP2xtcjZfORsOa4g2JwdseyEnF+wUCx25fTdG/J/HIY6yKga6+NozRBg2xR2gyh7kKYyd6DXndbq0YbQuTJ7Ew==} 5196 5199 ··· 5308 5311 5309 5312 '@ungap/structured-clone@1.3.0': 5310 5313 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 5314 + deprecated: Potential CWE-502 - Update to 1.3.1 or higher 5311 5315 5312 5316 '@unocss/cli@66.6.6': 5313 5317 resolution: {integrity: sha512-78SY8j4hAVelK+vP/adsDGaSjEITasYLFECJLHWxUJSzK+G9UIc5wtL/u4jA+zKvwVkHcDvbkcO5K6wwwpAixg==} ··· 5414 5418 vite: 8.0.11 5415 5419 vue: ^3.2.25 5416 5420 5417 - '@vitejs/plugin-vue@6.0.5': 5418 - resolution: {integrity: sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==} 5421 + '@vitejs/plugin-vue@6.0.7': 5422 + resolution: {integrity: sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==} 5419 5423 engines: {node: ^20.19.0 || >=22.12.0} 5420 5424 peerDependencies: 5421 5425 vite: 8.0.11 ··· 5951 5955 basic-ftp@5.0.3: 5952 5956 resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} 5953 5957 engines: {node: '>=10.0.0'} 5954 - deprecated: Security vulnerability fixed in 5.2.0, please upgrade 5958 + deprecated: Security vulnerability fixed in 5.2.1, please upgrade 5955 5959 5956 5960 bidi-js@1.0.3: 5957 5961 resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} ··· 6631 6635 resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} 6632 6636 engines: {node: '>=0.12'} 6633 6637 6638 + entities@8.0.0: 6639 + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} 6640 + engines: {node: '>=20.19.0'} 6641 + 6634 6642 es-abstract@1.24.1: 6635 6643 resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} 6636 6644 engines: {node: '>= 0.4'} ··· 7290 7298 resolution: {integrity: sha512-lMHQRRwIPyJ70HV0kkFT7jH/gXzSI7yDkQFe07E2flwmNDFoWUTRMKpW2sglsnpeA7b6S2TJPp98EbQxai8eaQ==} 7291 7299 engines: {node: '>=20.0.0'} 7292 7300 7293 - happy-dom@20.8.7: 7294 - resolution: {integrity: sha512-7wfBi+UqulQlyLcis+9a+hTK0A/fMO4QKP6w6J9HnadXVkRdOvGf/N5G4XVpfgCYfnY7oKazlOSdWmsfatNSLQ==} 7301 + happy-dom@20.9.0: 7302 + resolution: {integrity: sha512-GZZ9mKe8r646NUAf/zemnGbjYh4Bt8/MqASJY+pSm5ZDtc3YQox+4gsLI7yi1hba6o+eCsGxpHn5+iEVn31/FQ==} 7295 7303 engines: {node: '>=20.0.0'} 7296 7304 7297 7305 has-bigints@1.1.0: ··· 7750 7758 canvas: 7751 7759 optional: true 7752 7760 7753 - jsdom@29.0.1: 7754 - resolution: {integrity: sha512-z6JOK5gRO7aMybVq/y/MlIpKh8JIi68FBKMUtKkK2KH/wMSRlCxQ682d08LB9fYXplyY/UXG8P4XXTScmdjApg==} 7761 + jsdom@29.1.1: 7762 + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} 7755 7763 engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} 7756 7764 peerDependencies: 7757 7765 canvas: ^3.0.0 ··· 8055 8063 lru-cache@10.4.3: 8056 8064 resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 8057 8065 8058 - lru-cache@11.2.6: 8059 - resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} 8060 - engines: {node: 20 || >=22} 8061 - 8062 8066 lru-cache@11.2.7: 8063 8067 resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} 8068 + engines: {node: 20 || >=22} 8069 + 8070 + lru-cache@11.4.0: 8071 + resolution: {integrity: sha512-W+R+kFL4HgVxONq2bhXPi3bGpzGe/yEhVOp233qw9wCRtgncJ15P3bC+e4zZMu4Cq7d+WAJjXGW0uUkifhcatA==} 8064 8072 engines: {node: 20 || >=22} 8065 8073 8066 8074 lru-cache@5.1.1: ··· 8086 8094 8087 8095 magic-string@0.30.21: 8088 8096 resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 8089 - 8090 - magicast@0.3.5: 8091 - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} 8092 8097 8093 8098 magicast@0.5.2: 8094 8099 resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} ··· 8641 8646 8642 8647 parse5@8.0.0: 8643 8648 resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} 8649 + 8650 + parse5@8.0.1: 8651 + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} 8644 8652 8645 8653 parseurl@1.3.3: 8646 8654 resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} ··· 9937 9945 resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} 9938 9946 engines: {node: '>=18.17'} 9939 9947 9940 - undici@7.24.5: 9941 - resolution: {integrity: sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==} 9948 + undici@7.25.0: 9949 + resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} 9942 9950 engines: {node: '>=20.18.1'} 9943 9951 9944 9952 unicode-canonical-property-names-ecmascript@2.0.1: ··· 10636 10644 '@asamuzakjp/css-color@4.1.2': 10637 10645 dependencies: 10638 10646 '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) 10639 - '@csstools/css-color-parser': 4.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) 10640 - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) 10641 - '@csstools/css-tokenizer': 4.0.0 10642 - lru-cache: 11.2.6 10643 - 10644 - '@asamuzakjp/css-color@5.0.1': 10645 - dependencies: 10646 - '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) 10647 10647 '@csstools/css-color-parser': 4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) 10648 10648 '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) 10649 10649 '@csstools/css-tokenizer': 4.0.0 10650 10650 lru-cache: 11.2.7 10651 + 10652 + '@asamuzakjp/css-color@5.1.11': 10653 + dependencies: 10654 + '@asamuzakjp/generational-cache': 1.0.1 10655 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) 10656 + '@csstools/css-color-parser': 4.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) 10657 + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) 10658 + '@csstools/css-tokenizer': 4.0.0 10651 10659 10652 10660 '@asamuzakjp/dom-selector@6.7.6': 10653 10661 dependencies: ··· 10655 10663 bidi-js: 1.0.3 10656 10664 css-tree: 3.1.0 10657 10665 is-potential-custom-element-name: 1.0.1 10658 - lru-cache: 11.2.6 10666 + lru-cache: 11.2.7 10659 10667 10660 - '@asamuzakjp/dom-selector@7.0.4': 10668 + '@asamuzakjp/dom-selector@7.1.1': 10661 10669 dependencies: 10670 + '@asamuzakjp/generational-cache': 1.0.1 10662 10671 '@asamuzakjp/nwsapi': 2.3.9 10663 10672 bidi-js: 1.0.3 10664 10673 css-tree: 3.2.1 10665 10674 is-potential-custom-element-name: 1.0.1 10666 - lru-cache: 11.2.7 10675 + 10676 + '@asamuzakjp/generational-cache@1.0.1': {} 10667 10677 10668 10678 '@asamuzakjp/nwsapi@2.3.9': {} 10669 10679 ··· 11391 11401 picocolors: 1.1.1 11392 11402 sisteransi: 1.0.5 11393 11403 11394 - '@csstools/color-helpers@6.0.1': {} 11395 - 11396 11404 '@csstools/color-helpers@6.0.2': {} 11397 11405 11398 11406 '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': ··· 11400 11408 '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) 11401 11409 '@csstools/css-tokenizer': 4.0.0 11402 11410 11403 - '@csstools/css-color-parser@4.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': 11411 + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': 11404 11412 dependencies: 11405 - '@csstools/color-helpers': 6.0.1 11406 - '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) 11407 11413 '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) 11408 11414 '@csstools/css-tokenizer': 4.0.0 11409 11415 ··· 11414 11420 '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) 11415 11421 '@csstools/css-tokenizer': 4.0.0 11416 11422 11423 + '@csstools/css-color-parser@4.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': 11424 + dependencies: 11425 + '@csstools/color-helpers': 6.0.2 11426 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) 11427 + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) 11428 + '@csstools/css-tokenizer': 4.0.0 11429 + 11417 11430 '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': 11418 11431 dependencies: 11419 11432 '@csstools/css-tokenizer': 4.0.0 11420 11433 11421 - '@csstools/css-syntax-patches-for-csstree@1.0.27': {} 11434 + '@csstools/css-syntax-patches-for-csstree@1.1.1(css-tree@3.1.0)': 11435 + optionalDependencies: 11436 + css-tree: 3.1.0 11422 11437 11423 - '@csstools/css-syntax-patches-for-csstree@1.1.1(css-tree@3.2.1)': 11438 + '@csstools/css-syntax-patches-for-csstree@1.1.4(css-tree@3.2.1)': 11424 11439 optionalDependencies: 11425 11440 css-tree: 3.2.1 11426 11441 ··· 12978 12993 12979 12994 '@rolldown/pluginutils@1.0.0-rc.3': {} 12980 12995 12996 + '@rolldown/pluginutils@1.0.1': {} 12997 + 12981 12998 '@rollup/plugin-babel@5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@4.59.0)': 12982 12999 dependencies: 12983 13000 '@babel/core': 7.29.0 ··· 13434 13451 picocolors: 1.1.1 13435 13452 redent: 3.0.0 13436 13453 13437 - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.2.14)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': 13454 + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': 13438 13455 dependencies: 13439 13456 '@babel/runtime': 7.28.4 13440 13457 '@testing-library/dom': 10.4.1 ··· 13442 13459 react-dom: 19.2.4(react@19.2.4) 13443 13460 optionalDependencies: 13444 13461 '@types/react': 19.2.14 13445 - '@types/react-dom': 18.2.14 13446 13462 13447 13463 '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': 13448 13464 dependencies: ··· 13575 13591 dependencies: 13576 13592 '@types/node': 24.12.0 13577 13593 kleur: 3.0.3 13578 - 13579 - '@types/react-dom@18.2.14': 13580 - dependencies: 13581 - '@types/react': 19.2.14 13582 - optional: true 13583 13594 13584 13595 '@types/react-is@19.2.0': 13585 13596 dependencies: ··· 13903 13914 vite: 8.0.11(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) 13904 13915 vue: 3.5.29(typescript@5.9.3) 13905 13916 13906 - '@vitejs/plugin-vue@6.0.5(vite@8.0.11(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))': 13917 + '@vitejs/plugin-vue@6.0.7(vite@8.0.11(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))': 13907 13918 dependencies: 13908 - '@rolldown/pluginutils': 1.0.0-rc.2 13919 + '@rolldown/pluginutils': 1.0.1 13909 13920 vite: 8.0.11(@types/node@24.12.0)(esbuild@0.27.3)(jiti@2.6.1)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) 13910 13921 vue: 3.5.29(typescript@5.9.3) 13911 13922 ··· 14566 14577 14567 14578 builtin-modules@5.0.0: {} 14568 14579 14569 - bumpp@10.4.1(magicast@0.3.5): 14580 + bumpp@10.4.1: 14570 14581 dependencies: 14571 14582 ansis: 4.2.0 14572 14583 args-tokenizer: 0.3.0 14573 - c12: 3.3.3(magicast@0.3.5) 14584 + c12: 3.3.3 14574 14585 cac: 6.7.14(patch_hash=a8f0f3517a47ce716ed90c0cfe6ae382ab763b021a664ada2a608477d0621588) 14575 14586 escalade: 3.2.0 14576 14587 jsonc-parser: 3.3.1 ··· 14590 14601 14591 14602 bytes@3.1.2: {} 14592 14603 14593 - c12@1.11.2(magicast@0.3.5): 14604 + c12@1.11.2: 14594 14605 dependencies: 14595 14606 chokidar: 3.6.0 14596 14607 confbox: 0.1.8 ··· 14604 14615 perfect-debounce: 1.0.0 14605 14616 pkg-types: 1.3.1 14606 14617 rc9: 2.1.2 14607 - optionalDependencies: 14608 - magicast: 0.3.5 14609 14618 14610 - c12@3.3.2(magicast@0.3.5): 14619 + c12@3.3.2: 14611 14620 dependencies: 14612 14621 chokidar: 4.0.3 14613 14622 confbox: 0.2.2 ··· 14621 14630 perfect-debounce: 2.0.0 14622 14631 pkg-types: 2.3.0 14623 14632 rc9: 2.1.2 14624 - optionalDependencies: 14625 - magicast: 0.3.5 14626 14633 14627 - c12@3.3.3(magicast@0.3.5): 14634 + c12@3.3.3: 14628 14635 dependencies: 14629 14636 chokidar: 5.0.0 14630 14637 confbox: 0.2.2 ··· 14638 14645 perfect-debounce: 2.0.0 14639 14646 pkg-types: 2.3.0 14640 14647 rc9: 2.1.2 14641 - optionalDependencies: 14642 - magicast: 0.3.5 14643 14648 14644 14649 cac@6.7.14(patch_hash=a8f0f3517a47ce716ed90c0cfe6ae382ab763b021a664ada2a608477d0621588): {} 14645 14650 ··· 14675 14680 14676 14681 change-case@5.4.4: {} 14677 14682 14678 - changelogen@0.5.7(magicast@0.3.5): 14683 + changelogen@0.5.7: 14679 14684 dependencies: 14680 - c12: 1.11.2(magicast@0.3.5) 14685 + c12: 1.11.2 14681 14686 colorette: 2.0.20 14682 14687 consola: 3.4.2 14683 14688 convert-gitmoji: 0.1.5 ··· 14694 14699 transitivePeerDependencies: 14695 14700 - magicast 14696 14701 14697 - changelogithub@14.0.0(magicast@0.3.5): 14702 + changelogithub@14.0.0: 14698 14703 dependencies: 14699 14704 ansis: 4.2.0 14700 - c12: 3.3.2(magicast@0.3.5) 14705 + c12: 3.3.2 14701 14706 cac: 6.7.14(patch_hash=a8f0f3517a47ce716ed90c0cfe6ae382ab763b021a664ada2a608477d0621588) 14702 - changelogen: 0.5.7(magicast@0.3.5) 14707 + changelogen: 0.5.7 14703 14708 convert-gitmoji: 0.1.5 14704 14709 execa: 9.6.0 14705 14710 ofetch: 1.5.1 ··· 14943 14948 cssstyle@5.3.5: 14944 14949 dependencies: 14945 14950 '@asamuzakjp/css-color': 4.1.2 14946 - '@csstools/css-syntax-patches-for-csstree': 1.0.27 14951 + '@csstools/css-syntax-patches-for-csstree': 1.1.1(css-tree@3.1.0) 14947 14952 css-tree: 3.1.0 14948 14953 14949 14954 csstype@3.2.3: {} ··· 15227 15232 entities@6.0.1: {} 15228 15233 15229 15234 entities@7.0.1: {} 15235 + 15236 + entities@8.0.0: {} 15230 15237 15231 15238 es-abstract@1.24.1: 15232 15239 dependencies: ··· 16158 16165 - bufferutil 16159 16166 - utf-8-validate 16160 16167 16161 - happy-dom@20.8.7: 16168 + happy-dom@20.9.0: 16162 16169 dependencies: 16163 16170 '@types/node': 24.12.0 16164 16171 '@types/whatwg-mimetype': 3.0.2 ··· 16629 16636 - supports-color 16630 16637 - utf-8-validate 16631 16638 16632 - jsdom@29.0.1(@noble/hashes@1.8.0): 16639 + jsdom@29.1.1(@noble/hashes@1.8.0): 16633 16640 dependencies: 16634 - '@asamuzakjp/css-color': 5.0.1 16635 - '@asamuzakjp/dom-selector': 7.0.4 16641 + '@asamuzakjp/css-color': 5.1.11 16642 + '@asamuzakjp/dom-selector': 7.1.1 16636 16643 '@bramus/specificity': 2.4.2 16637 - '@csstools/css-syntax-patches-for-csstree': 1.1.1(css-tree@3.2.1) 16644 + '@csstools/css-syntax-patches-for-csstree': 1.1.4(css-tree@3.2.1) 16638 16645 '@exodus/bytes': 1.15.0(@noble/hashes@1.8.0) 16639 16646 css-tree: 3.2.1 16640 16647 data-urls: 7.0.0(@noble/hashes@1.8.0) 16641 16648 decimal.js: 10.6.0 16642 16649 html-encoding-sniffer: 6.0.0(@noble/hashes@1.8.0) 16643 16650 is-potential-custom-element-name: 1.0.1 16644 - lru-cache: 11.2.7 16645 - parse5: 8.0.0 16651 + lru-cache: 11.4.0 16652 + parse5: 8.0.1 16646 16653 saxes: 6.0.0 16647 16654 symbol-tree: 3.2.4 16648 16655 tough-cookie: 6.0.1 16649 - undici: 7.24.5 16656 + undici: 7.25.0 16650 16657 w3c-xmlserializer: 5.0.0 16651 16658 webidl-conversions: 8.0.1 16652 16659 whatwg-mimetype: 5.0.0 ··· 16895 16902 16896 16903 lru-cache@10.4.3: {} 16897 16904 16898 - lru-cache@11.2.6: {} 16899 - 16900 16905 lru-cache@11.2.7: {} 16906 + 16907 + lru-cache@11.4.0: {} 16901 16908 16902 16909 lru-cache@5.1.1: 16903 16910 dependencies: ··· 16928 16935 magic-string@0.30.21: 16929 16936 dependencies: 16930 16937 '@jridgewell/sourcemap-codec': 1.5.5 16931 - 16932 - magicast@0.3.5: 16933 - dependencies: 16934 - '@babel/parser': 7.29.0 16935 - '@babel/types': 7.29.0 16936 - source-map-js: 1.2.1 16937 - optional: true 16938 16938 16939 16939 magicast@0.5.2: 16940 16940 dependencies: ··· 17816 17816 dependencies: 17817 17817 entities: 6.0.1 17818 17818 17819 + parse5@8.0.1: 17820 + dependencies: 17821 + entities: 8.0.0 17822 + 17819 17823 parseurl@1.3.3: {} 17820 17824 17821 17825 path-browserify@1.0.1: {} ··· 18304 18308 optionalDependencies: 18305 18309 '@babel/code-frame': 7.27.1 18306 18310 18307 - rollup-plugin-license@3.7.0(picomatch@4.0.3)(rollup@4.59.0): 18311 + rollup-plugin-license@3.7.0(picomatch@4.0.4)(rollup@4.59.0): 18308 18312 dependencies: 18309 18313 commenting: 1.1.0 18310 - fdir: 6.5.0(picomatch@4.0.3) 18314 + fdir: 6.5.0(picomatch@4.0.4) 18311 18315 lodash: 4.17.21 18312 18316 magic-string: 0.30.21 18313 18317 moment: 2.30.1 ··· 19269 19273 19270 19274 undici@6.21.3: {} 19271 19275 19272 - undici@7.24.5: {} 19276 + undici@7.25.0: {} 19273 19277 19274 19278 unicode-canonical-property-names-ecmascript@2.0.1: {} 19275 19279 ··· 19557 19561 - universal-cookie 19558 19562 - yaml 19559 19563 19560 - vitest-browser-react@2.0.5(@types/react-dom@18.2.14)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@packages+vitest): 19564 + vitest-browser-react@2.0.5(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@packages+vitest): 19561 19565 dependencies: 19562 19566 react: 19.2.4 19563 19567 react-dom: 19.2.4(react@19.2.4) 19564 19568 vitest: link:packages/vitest 19565 19569 optionalDependencies: 19566 19570 '@types/react': 19.2.14 19567 - '@types/react-dom': 18.2.14 19568 19571 19569 19572 vitest-browser-vue@2.1.0(@vue/compiler-dom@3.5.29)(@vue/server-renderer@3.5.29(vue@3.5.29(typescript@5.9.3)))(vitest@packages+vitest)(vue@3.5.29(typescript@5.9.3)): 19570 19573 dependencies:
+1
test/ui/package.json
··· 8 8 }, 9 9 "devDependencies": { 10 10 "@testing-library/dom": "^10.4.1", 11 + "@types/codemirror": "^5.60.17", 11 12 "@vitest/browser-playwright": "workspace:*", 12 13 "happy-dom": "latest", 13 14 "vitest": "workspace:*"
+85
test/ui/test/editor.spec.ts
··· 1 + import type { Vitest } from 'vitest/node' 2 + import fs from 'node:fs' 3 + import path from 'node:path' 4 + import { expect, test } from '@playwright/test' 5 + import { assertTestCounts, evaluateEditor, getExplorerItem, startVitestUi } from './helper' 6 + 7 + test.describe('editor', () => { 8 + let vitest: Vitest | undefined 9 + let baseURL: string 10 + 11 + const root = path.join(import.meta.dirname, '../fixtures/editor') 12 + const testFile = path.join(root, 'basic.test.ts') 13 + const testFileContent = fs.readFileSync(testFile, 'utf-8') 14 + 15 + test.beforeAll(async () => { 16 + const server = await startVitestUi({ 17 + root, 18 + watch: true, 19 + ui: true, 20 + open: false, 21 + reporters: [], 22 + }) 23 + vitest = server.vitest 24 + baseURL = `${server.url}/__vitest__/` 25 + }) 26 + 27 + test.afterAll(async () => { 28 + await vitest?.close() 29 + fs.writeFileSync(testFile, testFileContent, 'utf-8') 30 + }) 31 + 32 + test('can edit', async ({ page }) => { 33 + await page.goto(baseURL) 34 + 35 + await assertTestCounts(page, { pass: 1, fail: 0 }) 36 + 37 + const item = getExplorerItem(page, 'test-to-edit') 38 + const editor = page.getByTestId('editor').locator('.CodeMirror') 39 + const editorTabButton = page.getByTestId('btn-code') 40 + 41 + // initially pass 42 + await expect(item.getByTestId('status-icon-pass')).toBeVisible() 43 + 44 + // open editor 45 + await item.click() 46 + await editorTabButton.click() 47 + await expect(editor).toContainText('.toBe(2)') 48 + 49 + // edit to fail test 50 + await editor.click() 51 + await page.waitForTimeout(300) // some unknown lag required 52 + await evaluateEditor( 53 + page, 54 + (editor, source) => editor.setValue(source), 55 + testFileContent.replace('toBe(2)', 'toBe(3)'), 56 + ) 57 + await expect(editorTabButton).toHaveText('* Code') 58 + await page.keyboard.press('ControlOrMeta+S') 59 + 60 + // verify failed 61 + await expect(item.getByTestId('status-icon-fail')).toBeVisible() 62 + await expect(editor).toContainText('toBe(3)') 63 + await expect(editor).toContainText('AssertionError: expected 2 to be 3') 64 + await expect(editorTabButton).toHaveText('Code') 65 + expect(fs.readFileSync(testFile, 'utf-8')).toContain('toBe(3)') 66 + 67 + // edit to fix test 68 + await editor.click() 69 + await page.waitForTimeout(300) 70 + await evaluateEditor( 71 + page, 72 + (editor, source) => editor.setValue(source), 73 + testFileContent, 74 + ) 75 + await expect(editorTabButton).toHaveText('* Code') 76 + await page.keyboard.press('ControlOrMeta+S') 77 + 78 + // verify fixed 79 + await expect(item.getByTestId('status-icon-pass')).toBeVisible() 80 + await expect(editor).toContainText('.toBe(2)') 81 + await expect(editor).not.toContainText('AssertionError') 82 + await expect(editorTabButton).toHaveText('Code') 83 + expect(fs.readFileSync(testFile, 'utf-8')).toContain('toBe(2)') 84 + }) 85 + })
+18
test/ui/test/helper.ts
··· 1 1 import type { Locator, Page } from '@playwright/test' 2 + import type { EditorFromTextArea } from 'codemirror' 2 3 import type { InlineConfig, PreviewServer } from 'vite' 3 4 import type { CliOptions, Vitest } from 'vitest/node' 4 5 import assert from 'node:assert' ··· 104 105 const annotation = page.getByRole('note').filter({ hasText: options.name }) 105 106 await expect(annotation.getByRole('link')).toHaveAttribute('href', /.+/) 106 107 await expect(annotation.getByRole('img')).not.toHaveJSProperty('naturalWidth', 0) 108 + } 109 + 110 + export async function evaluateEditor<T>( 111 + page: Page, 112 + fn: (editor: EditorFromTextArea, ...args: any[]) => T, 113 + ...args: any[] 114 + ): Promise<T> { 115 + const editor = page.getByTestId('editor').locator('.CodeMirror') 116 + return editor.evaluate( 117 + (e, [fnStr, args]) => { 118 + const codemirror = (e as any).CodeMirror 119 + // eslint-disable-next-line no-new-func 120 + const fn = new Function('codemirror', 'args', `return (${fnStr})(codemirror, ...args)`) 121 + return fn(codemirror, args) 122 + }, 123 + [fn.toString(), args], 124 + ) 107 125 }
+10 -1
test/ui/test/trace.spec.ts
··· 2 2 import type { PreviewServer } from 'vite' 3 3 import type { Vitest } from 'vitest/node' 4 4 import { expect, test } from '@playwright/test' 5 - import { assertTestCounts, openExplorerItem, startHtmlReportPreview, startVitestUi } from './helper' 5 + import { assertTestCounts, evaluateEditor, openExplorerItem, startHtmlReportPreview, startVitestUi } from './helper' 6 6 7 7 test.describe('ui', () => { 8 8 let vitest: Vitest | undefined ··· 138 138 await traceSteps.getByText('Render simple').click() 139 139 await expect(page.getByTestId('btn-code')).toContainClass('tab-button-active') 140 140 141 + // verify editor cursor position 142 + const getEditorCursor = () => evaluateEditor(page, editor => editor.getCursor()) 143 + await expect.poll(() => getEditorCursor()).toEqual({ line: 9, ch: 32 }) 144 + 141 145 // verify snapshot replay in iframe 142 146 const traceFrame = traceView.frameLocator('iframe') 143 147 await expect(traceFrame.getByRole('button', { name: 'Simple' })).toBeVisible() 144 148 145 149 // verify selector highlight 146 150 await expect(traceFrame.getByTestId('trace-view-highlight')).toBeVisible() 151 + 152 + // selecting 2nd trace step and verify again 153 + await traceSteps.getByText('Render another').click() 154 + await expect(traceFrame.getByRole('button', { name: 'Another' })).toBeVisible() 155 + await expect.poll(() => getEditorCursor()).toEqual({ line: 12, ch: 32 }) 147 156 148 157 // verify selecting another test switches trace viewer 149 158 await openExplorerItem(page, 'switch-target')
+13 -1
packages/ui/client/components/StatusIcon.vue
··· 11 11 <template> 12 12 <div 13 13 v-if="state === 'pass'" 14 + data-testid="status-icon-pass" 14 15 text-green-700 dark:text-green-500 15 16 flex-shrink-0 16 17 i-carbon:checkmark ··· 18 19 <div 19 20 v-else-if="failedSnapshot" 20 21 v-tooltip.right="'Contains failed snapshot'" 22 + data-testid="status-icon-failed-snapshot" 21 23 text-red-700 dark:text-red-500 22 24 flex-shrink-0 23 25 i-carbon:compare 24 26 /> 25 27 <div 26 28 v-else-if="state === 'fail'" 29 + data-testid="status-icon-fail" 27 30 text-red-700 dark:text-red-500 28 31 flex-shrink-0 29 32 i-carbon:close ··· 31 34 <div 32 35 v-else-if="mode === 'todo'" 33 36 v-tooltip.right="'Todo'" 37 + data-testid="status-icon-todo" 34 38 text-gray-500 35 39 flex-shrink-0 36 40 i-carbon:document-blank ··· 38 42 <div 39 43 v-else-if="mode === 'skip' || state === 'skip'" 40 44 v-tooltip.right="'Skipped'" 45 + data-testid="status-icon-skip" 41 46 text-gray-500 42 47 flex-shrink-0 43 48 i-carbon:redo 44 49 rotate-90 45 50 /> 46 - <div v-else text-yellow-700 dark:text-yellow-500 flex-shrink-0 i-carbon:circle-dash animate-spin /> 51 + <div 52 + v-else 53 + data-testid="status-icon-running" 54 + text-yellow-700 dark:text-yellow-500 55 + flex-shrink-0 56 + i-carbon:circle-dash 57 + animate-spin 58 + /> 47 59 </template>
+5
test/ui/fixtures/editor/basic.test.ts
··· 1 + import { expect, test } from 'vitest' 2 + 3 + test('test-to-edit', () => { 4 + expect(1 + 1).toBe(2) 5 + })
+3
test/ui/fixtures/editor/vitest.config.ts
··· 1 + import { defineConfig } from 'vitest/config' 2 + 3 + export default defineConfig({})
+3
test/ui/fixtures/trace/basic.test.ts
··· 8 8 test('simple', async () => { 9 9 document.body.innerHTML = '<button>Simple</button>' 10 10 await page.getByRole('button').mark('Render simple') 11 + 12 + document.body.innerHTML = '<button>Another</button>' 13 + await page.getByRole('button').mark('Render another') 11 14 }) 12 15 13 16 test('switch-target', async () => {