mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-11 08:33:53 +00:00
test(nuxt): add additional unit tests for composables (#24289)
This commit is contained in:
parent
86693c1005
commit
b301b639e1
5
.github/workflows/ci.yml
vendored
5
.github/workflows/ci.yml
vendored
@ -238,6 +238,11 @@ jobs:
|
|||||||
TEST_CONTEXT: ${{ matrix.context }}
|
TEST_CONTEXT: ${{ matrix.context }}
|
||||||
SKIP_BUNDLE_SIZE: ${{ github.event_name != 'push' || matrix.env == 'dev' || matrix.builder == 'webpack' || matrix.context == 'default' || runner.os == 'Windows' }}
|
SKIP_BUNDLE_SIZE: ${{ github.event_name != 'push' || matrix.env == 'dev' || matrix.builder == 'webpack' || matrix.context == 'default' || runner.os == 'Windows' }}
|
||||||
|
|
||||||
|
- uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d # v3.1.4
|
||||||
|
if: github.event_name != 'push' && matrix.env == 'built' && matrix.builder == 'vite' && matrix.context == 'default' && matrix.os == 'ubuntu-latest' && matrix.manifest == 'manifest-on'
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
|
||||||
build-release:
|
build-release:
|
||||||
permissions:
|
permissions:
|
||||||
id-token: write
|
id-token: write
|
||||||
|
@ -24,9 +24,9 @@
|
|||||||
"test:fixtures": "nuxi prepare test/fixtures/basic && nuxi prepare test/fixtures/runtime-compiler && vitest run --dir test",
|
"test:fixtures": "nuxi prepare test/fixtures/basic && nuxi prepare test/fixtures/runtime-compiler && vitest run --dir test",
|
||||||
"test:fixtures:dev": "TEST_ENV=dev pnpm test:fixtures",
|
"test:fixtures:dev": "TEST_ENV=dev pnpm test:fixtures",
|
||||||
"test:fixtures:webpack": "TEST_BUILDER=webpack pnpm test:fixtures",
|
"test:fixtures:webpack": "TEST_BUILDER=webpack pnpm test:fixtures",
|
||||||
"test:runtime": "vitest -c vitest.nuxt.config.ts",
|
"test:runtime": "vitest -c vitest.nuxt.config.ts --coverage",
|
||||||
"test:types": "pnpm --filter './test/fixtures/**' test:types",
|
"test:types": "pnpm --filter './test/fixtures/**' test:types",
|
||||||
"test:unit": "vitest run --dir packages",
|
"test:unit": "vitest run --dir packages --coverage",
|
||||||
"typecheck": "tsc --noEmit"
|
"typecheck": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
@ -46,6 +46,7 @@
|
|||||||
"@types/fs-extra": "11.0.4",
|
"@types/fs-extra": "11.0.4",
|
||||||
"@types/node": "20.9.0",
|
"@types/node": "20.9.0",
|
||||||
"@types/semver": "7.5.5",
|
"@types/semver": "7.5.5",
|
||||||
|
"@vitest/coverage-v8": "^0.34.6",
|
||||||
"case-police": "0.6.1",
|
"case-police": "0.6.1",
|
||||||
"changelogen": "0.5.5",
|
"changelogen": "0.5.5",
|
||||||
"consola": "3.2.3",
|
"consola": "3.2.3",
|
||||||
|
108
pnpm-lock.yaml
108
pnpm-lock.yaml
@ -36,6 +36,9 @@ importers:
|
|||||||
'@types/semver':
|
'@types/semver':
|
||||||
specifier: 7.5.5
|
specifier: 7.5.5
|
||||||
version: 7.5.5
|
version: 7.5.5
|
||||||
|
'@vitest/coverage-v8':
|
||||||
|
specifier: ^0.34.6
|
||||||
|
version: 0.34.6(vitest@0.33.0)
|
||||||
case-police:
|
case-police:
|
||||||
specifier: 0.6.1
|
specifier: 0.6.1
|
||||||
version: 0.6.1
|
version: 0.6.1
|
||||||
@ -1210,6 +1213,10 @@ packages:
|
|||||||
to-fast-properties: 2.0.0
|
to-fast-properties: 2.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@bcoe/v8-coverage@0.2.3:
|
||||||
|
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@cloudflare/kv-asset-handler@0.3.0:
|
/@cloudflare/kv-asset-handler@0.3.0:
|
||||||
resolution: {integrity: sha512-9CB/MKf/wdvbfkUdfrj+OkEwZ5b7rws0eogJ4293h+7b6KX5toPwym+VQKmILafNB9YiehqY0DlNrDcDhdWHSQ==}
|
resolution: {integrity: sha512-9CB/MKf/wdvbfkUdfrj+OkEwZ5b7rws0eogJ4293h+7b6KX5toPwym+VQKmILafNB9YiehqY0DlNrDcDhdWHSQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -1649,6 +1656,11 @@ packages:
|
|||||||
wrap-ansi: 8.1.0
|
wrap-ansi: 8.1.0
|
||||||
wrap-ansi-cjs: /wrap-ansi@7.0.0
|
wrap-ansi-cjs: /wrap-ansi@7.0.0
|
||||||
|
|
||||||
|
/@istanbuljs/schema@0.1.3:
|
||||||
|
resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@jest/schemas@29.6.3:
|
/@jest/schemas@29.6.3:
|
||||||
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
|
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
|
||||||
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
||||||
@ -2415,7 +2427,6 @@ packages:
|
|||||||
|
|
||||||
/@types/istanbul-lib-coverage@2.0.5:
|
/@types/istanbul-lib-coverage@2.0.5:
|
||||||
resolution: {integrity: sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==}
|
resolution: {integrity: sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==}
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@types/istanbul-lib-report@3.0.2:
|
/@types/istanbul-lib-report@3.0.2:
|
||||||
resolution: {integrity: sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==}
|
resolution: {integrity: sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==}
|
||||||
@ -2785,9 +2796,30 @@ packages:
|
|||||||
vite: 4.5.0
|
vite: 4.5.0
|
||||||
vue: 3.3.8
|
vue: 3.3.8
|
||||||
dependencies:
|
dependencies:
|
||||||
vite: 4.5.0(@types/node@20.8.10)
|
vite: 4.5.0(@types/node@20.9.0)
|
||||||
vue: 3.3.8(typescript@5.2.2)
|
vue: 3.3.8(typescript@5.2.2)
|
||||||
|
|
||||||
|
/@vitest/coverage-v8@0.34.6(vitest@0.33.0):
|
||||||
|
resolution: {integrity: sha512-fivy/OK2d/EsJFoEoxHFEnNGTg+MmdZBAVK9Ka4qhXR2K3J0DS08vcGVwzDtXSuUMabLv4KtPcpSKkcMXFDViw==}
|
||||||
|
peerDependencies:
|
||||||
|
vitest: '>=0.32.0 <1'
|
||||||
|
dependencies:
|
||||||
|
'@ampproject/remapping': 2.2.1
|
||||||
|
'@bcoe/v8-coverage': 0.2.3
|
||||||
|
istanbul-lib-coverage: 3.2.1
|
||||||
|
istanbul-lib-report: 3.0.1
|
||||||
|
istanbul-lib-source-maps: 4.0.1
|
||||||
|
istanbul-reports: 3.1.6
|
||||||
|
magic-string: 0.30.5
|
||||||
|
picocolors: 1.0.0
|
||||||
|
std-env: 3.4.3
|
||||||
|
test-exclude: 6.0.0
|
||||||
|
v8-to-istanbul: 9.1.3
|
||||||
|
vitest: 0.33.0(happy-dom@12.10.3)
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@vitest/expect@0.33.0:
|
/@vitest/expect@0.33.0:
|
||||||
resolution: {integrity: sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==}
|
resolution: {integrity: sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -3512,7 +3544,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==}
|
resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==}
|
||||||
engines: {node: '>= 10.0.0'}
|
engines: {node: '>= 10.0.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.23.0
|
'@babel/types': 7.23.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/balanced-match@1.0.2:
|
/balanced-match@1.0.2:
|
||||||
@ -3918,8 +3950,8 @@ packages:
|
|||||||
/constantinople@4.0.1:
|
/constantinople@4.0.1:
|
||||||
resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==}
|
resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.23.0
|
'@babel/parser': 7.23.3
|
||||||
'@babel/types': 7.23.0
|
'@babel/types': 7.23.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/convert-gitmoji@0.1.3:
|
/convert-gitmoji@0.1.3:
|
||||||
@ -5446,6 +5478,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==}
|
resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/html-escaper@2.0.2:
|
||||||
|
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/html-tags@3.3.1:
|
/html-tags@3.3.1:
|
||||||
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
|
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@ -5857,6 +5893,39 @@ packages:
|
|||||||
engines: {node: '>=16'}
|
engines: {node: '>=16'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/istanbul-lib-coverage@3.2.1:
|
||||||
|
resolution: {integrity: sha512-opCrKqbthmq3SKZ10mFMQG9dk3fTa3quaOLD35kJa5ejwZHd9xAr+kLuziiZz2cG32s4lMZxNdmdcEQnTDP4+g==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/istanbul-lib-report@3.0.1:
|
||||||
|
resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
dependencies:
|
||||||
|
istanbul-lib-coverage: 3.2.1
|
||||||
|
make-dir: 4.0.0
|
||||||
|
supports-color: 7.2.0
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/istanbul-lib-source-maps@4.0.1:
|
||||||
|
resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
dependencies:
|
||||||
|
debug: 4.3.4
|
||||||
|
istanbul-lib-coverage: 3.2.1
|
||||||
|
source-map: 0.6.1
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/istanbul-reports@3.1.6:
|
||||||
|
resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dependencies:
|
||||||
|
html-escaper: 2.0.2
|
||||||
|
istanbul-lib-report: 3.0.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
/jackspeak@2.3.6:
|
/jackspeak@2.3.6:
|
||||||
resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
|
resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
@ -6248,6 +6317,13 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
semver: 6.3.1
|
semver: 6.3.1
|
||||||
|
|
||||||
|
/make-dir@4.0.0:
|
||||||
|
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
dependencies:
|
||||||
|
semver: 7.5.4
|
||||||
|
dev: true
|
||||||
|
|
||||||
/make-fetch-happen@11.1.1:
|
/make-fetch-happen@11.1.1:
|
||||||
resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==}
|
resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==}
|
||||||
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
||||||
@ -8596,6 +8672,15 @@ packages:
|
|||||||
commander: 2.20.3
|
commander: 2.20.3
|
||||||
source-map-support: 0.5.21
|
source-map-support: 0.5.21
|
||||||
|
|
||||||
|
/test-exclude@6.0.0:
|
||||||
|
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dependencies:
|
||||||
|
'@istanbuljs/schema': 0.1.3
|
||||||
|
glob: 7.2.3
|
||||||
|
minimatch: 3.1.2
|
||||||
|
dev: true
|
||||||
|
|
||||||
/text-table@0.2.0:
|
/text-table@0.2.0:
|
||||||
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
|
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
|
||||||
|
|
||||||
@ -9080,6 +9165,15 @@ packages:
|
|||||||
/util-deprecate@1.0.2:
|
/util-deprecate@1.0.2:
|
||||||
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
|
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
|
||||||
|
|
||||||
|
/v8-to-istanbul@9.1.3:
|
||||||
|
resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==}
|
||||||
|
engines: {node: '>=10.12.0'}
|
||||||
|
dependencies:
|
||||||
|
'@jridgewell/trace-mapping': 0.3.20
|
||||||
|
'@types/istanbul-lib-coverage': 2.0.5
|
||||||
|
convert-source-map: 2.0.0
|
||||||
|
dev: true
|
||||||
|
|
||||||
/validate-npm-package-license@3.0.4:
|
/validate-npm-package-license@3.0.4:
|
||||||
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
|
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -9775,8 +9869,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==}
|
resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==}
|
||||||
engines: {node: '>= 10.0.0'}
|
engines: {node: '>= 10.0.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.23.0
|
'@babel/parser': 7.23.3
|
||||||
'@babel/types': 7.23.0
|
'@babel/types': 7.23.3
|
||||||
assert-never: 1.2.1
|
assert-never: 1.2.1
|
||||||
babel-walk: 3.0.0-canary-5
|
babel-walk: 3.0.0-canary-5
|
||||||
dev: false
|
dev: false
|
||||||
|
1
test/mocks/app-config.ts
Normal file
1
test/mocks/app-config.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default {}
|
4
test/mocks/paths.ts
Normal file
4
test/mocks/paths.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import { joinURL } from 'ufo'
|
||||||
|
|
||||||
|
export const baseURL = () => '/'
|
||||||
|
export const buildAssetsURL = (url: string) => joinURL('/_nuxt', url)
|
@ -3,7 +3,7 @@
|
|||||||
import { describe, expect, it, vi } from 'vitest'
|
import { describe, expect, it, vi } from 'vitest'
|
||||||
import { defineEventHandler } from 'h3'
|
import { defineEventHandler } from 'h3'
|
||||||
|
|
||||||
import { registerEndpoint } from 'nuxt-vitest/utils'
|
import { mountSuspended, registerEndpoint } from 'nuxt-vitest/utils'
|
||||||
|
|
||||||
import * as composables from '#app/composables'
|
import * as composables from '#app/composables'
|
||||||
|
|
||||||
@ -39,6 +39,33 @@ registerEndpoint('/_nuxt/builds/meta/override.json', defineEventHandler(() => ({
|
|||||||
prerendered: ['/specific-prerendered']
|
prerendered: ['/specific-prerendered']
|
||||||
})))
|
})))
|
||||||
|
|
||||||
|
describe('app config', () => {
|
||||||
|
it('can be updated', () => {
|
||||||
|
const appConfig = useAppConfig()
|
||||||
|
expect(appConfig).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"nuxt": {
|
||||||
|
"buildId": "override",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
updateAppConfig({
|
||||||
|
new: 'value',
|
||||||
|
// @ts-expect-error property does not exist
|
||||||
|
nuxt: { nested: 42 }
|
||||||
|
})
|
||||||
|
expect(appConfig).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"new": "value",
|
||||||
|
"nuxt": {
|
||||||
|
"buildId": "override",
|
||||||
|
"nested": 42,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('composables', () => {
|
describe('composables', () => {
|
||||||
it('are all tested', () => {
|
it('are all tested', () => {
|
||||||
const testedComposables: string[] = [
|
const testedComposables: string[] = [
|
||||||
@ -52,6 +79,7 @@ describe('composables', () => {
|
|||||||
'showError',
|
'showError',
|
||||||
'useError',
|
'useError',
|
||||||
'getAppManifest',
|
'getAppManifest',
|
||||||
|
'useHydration',
|
||||||
'getRouteRules',
|
'getRouteRules',
|
||||||
'onNuxtReady',
|
'onNuxtReady',
|
||||||
'setResponseStatus',
|
'setResponseStatus',
|
||||||
@ -62,17 +90,19 @@ describe('composables', () => {
|
|||||||
'useRequestHeaders',
|
'useRequestHeaders',
|
||||||
'clearNuxtState',
|
'clearNuxtState',
|
||||||
'useState',
|
'useState',
|
||||||
'useRequestURL'
|
'useRequestURL',
|
||||||
|
'useRoute',
|
||||||
|
'navigateTo',
|
||||||
|
'abortNavigation',
|
||||||
|
'setPageLayout',
|
||||||
|
'defineNuxtComponent',
|
||||||
]
|
]
|
||||||
const skippedComposables: string[] = [
|
const skippedComposables: string[] = [
|
||||||
'abortNavigation',
|
|
||||||
'addRouteMiddleware',
|
'addRouteMiddleware',
|
||||||
'defineNuxtComponent',
|
|
||||||
'defineNuxtRouteMiddleware',
|
'defineNuxtRouteMiddleware',
|
||||||
'definePayloadReducer',
|
'definePayloadReducer',
|
||||||
'definePayloadReviver',
|
'definePayloadReviver',
|
||||||
'loadPayload',
|
'loadPayload',
|
||||||
'navigateTo',
|
|
||||||
'onBeforeRouteLeave',
|
'onBeforeRouteLeave',
|
||||||
'onBeforeRouteUpdate',
|
'onBeforeRouteUpdate',
|
||||||
'prefetchComponents',
|
'prefetchComponents',
|
||||||
@ -80,14 +110,11 @@ describe('composables', () => {
|
|||||||
'preloadPayload',
|
'preloadPayload',
|
||||||
'preloadRouteComponents',
|
'preloadRouteComponents',
|
||||||
'reloadNuxtApp',
|
'reloadNuxtApp',
|
||||||
'setPageLayout',
|
|
||||||
'useCookie',
|
'useCookie',
|
||||||
'useFetch',
|
'useFetch',
|
||||||
'useHead',
|
'useHead',
|
||||||
'useHydration',
|
|
||||||
'useLazyFetch',
|
'useLazyFetch',
|
||||||
'useLazyAsyncData',
|
'useLazyAsyncData',
|
||||||
'useRoute',
|
|
||||||
'useRouter',
|
'useRouter',
|
||||||
'useSeoMeta',
|
'useSeoMeta',
|
||||||
'useServerSeoMeta'
|
'useServerSeoMeta'
|
||||||
@ -262,6 +289,20 @@ describe('ssr composables', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('useHydration', () => {
|
||||||
|
it('should hydrate value from payload', async () => {
|
||||||
|
let val: any
|
||||||
|
const nuxtApp = useNuxtApp()
|
||||||
|
useHydration('key', () => {}, (fromPayload) => { val = fromPayload })
|
||||||
|
await nuxtApp.hooks.callHook('app:created', nuxtApp.vueApp)
|
||||||
|
expect(val).toMatchInlineSnapshot('undefined')
|
||||||
|
|
||||||
|
nuxtApp.payload.key = 'from payload'
|
||||||
|
await nuxtApp.hooks.callHook('app:created', nuxtApp.vueApp)
|
||||||
|
expect(val).toMatchInlineSnapshot('"from payload"')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('useState', () => {
|
describe('useState', () => {
|
||||||
it('default', () => {
|
it('default', () => {
|
||||||
expect(useState(() => 'default').value).toBe('default')
|
expect(useState(() => 'default').value).toBe('default')
|
||||||
@ -378,3 +419,77 @@ describe.skipIf(process.env.TEST_MANIFEST === 'manifest-off')('app manifests', (
|
|||||||
expect(await isPrerendered('/pre/thing')).toBeTruthy()
|
expect(await isPrerendered('/pre/thing')).toBeTruthy()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('routing utilities: `navigateTo`', () => {
|
||||||
|
it('navigateTo should disallow navigation to external URLs by default', () => {
|
||||||
|
expect(() => navigateTo('https://test.com')).toThrowErrorMatchingInlineSnapshot('"Navigating to an external URL is not allowed by default. Use `navigateTo(url, { external: true })`."')
|
||||||
|
expect(() => navigateTo('https://test.com', { external: true })).not.toThrow()
|
||||||
|
})
|
||||||
|
it('navigateTo should disallow navigation to data/script URLs', () => {
|
||||||
|
const urls = [
|
||||||
|
['data:alert("hi")', 'data'],
|
||||||
|
['\0data:alert("hi")', 'data'],
|
||||||
|
]
|
||||||
|
for (const [url, protocol] of urls) {
|
||||||
|
expect(() => navigateTo(url, { external: true })).toThrowError(`Cannot navigate to a URL with '${protocol}:' protocol.`)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('routing utilities: `useRoute`', () => {
|
||||||
|
it('should show provide a mock route', async () => {
|
||||||
|
expect(useRoute()).toMatchObject({
|
||||||
|
fullPath: '/',
|
||||||
|
hash: '',
|
||||||
|
href: '/',
|
||||||
|
matched: [],
|
||||||
|
meta: {},
|
||||||
|
name: undefined,
|
||||||
|
params: {},
|
||||||
|
path: '/',
|
||||||
|
query: {},
|
||||||
|
redirectedFrom: undefined,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('routing utilities: `abortNavigation`', () => {
|
||||||
|
it('should throw an error if one is provided', () => {
|
||||||
|
const error = useError()
|
||||||
|
expect(() => abortNavigation({ message: 'Page not found' })).toThrowErrorMatchingInlineSnapshot('"Page not found"')
|
||||||
|
expect(error.value).toBeFalsy()
|
||||||
|
})
|
||||||
|
it('should block navigation if no error is provided', () => {
|
||||||
|
expect(abortNavigation()).toMatchInlineSnapshot('false')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('routing utilities: `setPageLayout`', () => {
|
||||||
|
it('should set error on page metadata if run outside middleware', () => {
|
||||||
|
const route = useRoute()
|
||||||
|
expect(route.meta.layout).toBeUndefined()
|
||||||
|
setPageLayout('custom')
|
||||||
|
expect(route.meta.layout).toEqual('custom')
|
||||||
|
route.meta.layout = undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not set layout directly if run within middleware', async () => {
|
||||||
|
const route = useRoute()
|
||||||
|
const nuxtApp = useNuxtApp()
|
||||||
|
nuxtApp._processingMiddleware = true
|
||||||
|
setPageLayout('custom')
|
||||||
|
expect(route.meta.layout).toBeUndefined()
|
||||||
|
nuxtApp._processingMiddleware = false
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('defineNuxtComponent', () => {
|
||||||
|
it('should produce a Vue component', async () => {
|
||||||
|
const wrapper = await mountSuspended(defineNuxtComponent({
|
||||||
|
render: () => h('div', 'hi there')
|
||||||
|
}))
|
||||||
|
expect(wrapper.html()).toMatchInlineSnapshot('"<div>hi there</div>"')
|
||||||
|
})
|
||||||
|
it.todo('should support Options API asyncData')
|
||||||
|
it.todo('should support Options API head')
|
||||||
|
})
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
import { resolve } from 'node:path'
|
import { resolve } from 'node:path'
|
||||||
import { defineConfig } from 'vite'
|
import { defineConfig } from 'vite'
|
||||||
import { configDefaults } from 'vitest/config'
|
import { configDefaults, coverageConfigDefaults } from 'vitest/config'
|
||||||
import { isWindows } from 'std-env'
|
import { isWindows } from 'std-env'
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
'#build/nuxt.config.mjs': resolve('./test/mocks/nuxt-config'),
|
'#build/nuxt.config.mjs': resolve('./test/mocks/nuxt-config'),
|
||||||
'#app': resolve('./packages/nuxt/dist/app/index')
|
'#build/paths.mjs': resolve('./test/mocks/paths'),
|
||||||
|
'#build/app.config.mjs': resolve('./test/mocks/app-config'),
|
||||||
|
'#app': resolve('./packages/nuxt/dist/app')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
define: {
|
define: {
|
||||||
@ -17,6 +19,10 @@ export default defineConfig({
|
|||||||
globalSetup: './test/setup.ts',
|
globalSetup: './test/setup.ts',
|
||||||
setupFiles: ['./test/setup-env.ts'],
|
setupFiles: ['./test/setup-env.ts'],
|
||||||
testTimeout: isWindows ? 60000 : 10000,
|
testTimeout: isWindows ? 60000 : 10000,
|
||||||
|
coverage: {
|
||||||
|
// TODO: remove when we upgrade to vitest 0.34.0: https://github.com/vitest-dev/vitest/pull/3794
|
||||||
|
exclude: [...coverageConfigDefaults.exclude, '**/virtual:nuxt:**'],
|
||||||
|
},
|
||||||
// Excluded plugin because it should throw an error when accidentally loaded via Nuxt
|
// Excluded plugin because it should throw an error when accidentally loaded via Nuxt
|
||||||
exclude: [...configDefaults.exclude, '**/test/nuxt/**', '**/test.ts', '**/this-should-not-load.spec.js'],
|
exclude: [...configDefaults.exclude, '**/test/nuxt/**', '**/test.ts', '**/this-should-not-load.spec.js'],
|
||||||
maxThreads: process.env.TEST_ENV === 'dev' ? 1 : undefined,
|
maxThreads: process.env.TEST_ENV === 'dev' ? 1 : undefined,
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { defineVitestConfig } from 'nuxt-vitest/config'
|
import { defineVitestConfig } from 'nuxt-vitest/config'
|
||||||
|
import { coverageConfigDefaults } from 'vitest/config'
|
||||||
|
|
||||||
export default defineVitestConfig({
|
export default defineVitestConfig({
|
||||||
// TODO: investigate
|
// TODO: investigate
|
||||||
@ -8,6 +9,10 @@ export default defineVitestConfig({
|
|||||||
test: {
|
test: {
|
||||||
dir: './test/nuxt',
|
dir: './test/nuxt',
|
||||||
environment: 'nuxt',
|
environment: 'nuxt',
|
||||||
|
coverage: {
|
||||||
|
// TODO: remove when we upgrade to vitest 0.34.0: https://github.com/vitest-dev/vitest/pull/3794
|
||||||
|
exclude: [...coverageConfigDefaults.exclude, '**/virtual:nuxt:**'],
|
||||||
|
},
|
||||||
environmentOptions: {
|
environmentOptions: {
|
||||||
nuxt: {
|
nuxt: {
|
||||||
overrides: {
|
overrides: {
|
||||||
|
Loading…
Reference in New Issue
Block a user