From 15733000a65a18e1bb4a97553a4b71affe15118a Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Fri, 25 Nov 2022 16:25:56 +0800 Subject: [PATCH] chore: setup unit test --- package.json | 9 +- pnpm-lock.yaml | 172 +++++++++++++++++++++++ tests/__snapshots__/content.test.ts.snap | 6 + tests/content.test.ts | 21 +++ vitest.config.ts | 14 ++ 5 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 tests/__snapshots__/content.test.ts.snap create mode 100644 tests/content.test.ts create mode 100644 vitest.config.ts diff --git a/package.json b/package.json index 64a0b4ed..53d252ec 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,13 @@ "lint": "eslint .", "postinstall": "nuxi prepare", "prepare": "esno scripts/prepare.ts", - "generate": "nuxi generate" + "generate": "nuxi generate", + "test:unit": "vitest", + "test": "nr test:unit" }, "devDependencies": { "@antfu/eslint-config": "^0.31.0", + "@antfu/ni": "^0.18.8", "@iconify-json/carbon": "^1.1.11", "@iconify-json/logos": "^1.1.19", "@iconify-json/ri": "^1.1.4", @@ -25,6 +28,7 @@ "@types/sanitize-html": "^2.6.2", "@types/wicg-file-system-access": "^2020.9.5", "@unocss/nuxt": "^0.46.5", + "@vitejs/plugin-vue": "^3.2.0", "@vue-macros/nuxt": "^0.1.1", "@vueuse/nuxt": "^9.6.0", "blurhash": "^2.0.4", @@ -46,6 +50,7 @@ "shiki": "^0.11.1", "theme-vitesse": "^0.6.0", "typescript": "^4.9.3", - "ufo": "^1.0.0" + "ufo": "^1.0.0", + "vitest": "^0.25.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 46e47751..7e875ff5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2,6 +2,7 @@ lockfileVersion: 5.4 specifiers: '@antfu/eslint-config': ^0.31.0 + '@antfu/ni': ^0.18.8 '@iconify-json/carbon': ^1.1.11 '@iconify-json/logos': ^1.1.19 '@iconify-json/ri': ^1.1.4 @@ -12,6 +13,7 @@ specifiers: '@types/sanitize-html': ^2.6.2 '@types/wicg-file-system-access': ^2020.9.5 '@unocss/nuxt': ^0.46.5 + '@vitejs/plugin-vue': ^3.2.0 '@vue-macros/nuxt': ^0.1.1 '@vueuse/nuxt': ^9.6.0 blurhash: ^2.0.4 @@ -34,9 +36,11 @@ specifiers: theme-vitesse: ^0.6.0 typescript: ^4.9.3 ufo: ^1.0.0 + vitest: ^0.25.3 devDependencies: '@antfu/eslint-config': 0.31.0_hsf322ms6xhhd4b5ne6lb74y4a + '@antfu/ni': 0.18.8 '@iconify-json/carbon': 1.1.11 '@iconify-json/logos': 1.1.19 '@iconify-json/ri': 1.1.4 @@ -47,6 +51,7 @@ devDependencies: '@types/sanitize-html': 2.6.2 '@types/wicg-file-system-access': 2020.9.5 '@unocss/nuxt': 0.46.5 + '@vitejs/plugin-vue': 3.2.0 '@vue-macros/nuxt': 0.1.1_nuxt@3.0.0 '@vueuse/nuxt': 9.6.0_nuxt@3.0.0 blurhash: 2.0.4 @@ -69,6 +74,7 @@ devDependencies: theme-vitesse: 0.6.0 typescript: 4.9.3 ufo: 1.0.0 + vitest: 0.25.3 packages: @@ -176,6 +182,11 @@ packages: find-up: 5.0.0 dev: true + /@antfu/ni/0.18.8: + resolution: {integrity: sha512-0m++AudwQq+wWAz/Ax7g+sh/wFW51HHQ6BtPLsuTAsFIzWB/bv/0COwZE7BRS+u0nqMb6Ks6nlk6cY1TpPDwHg==} + hasBin: true + dev: true + /@antfu/utils/0.5.2: resolution: {integrity: sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==} dev: true @@ -1050,6 +1061,16 @@ packages: engines: {node: '>=10.13.0'} dev: true + /@types/chai-subset/1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.4 + dev: true + + /@types/chai/4.3.4: + resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + dev: true + /@types/estree/1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true @@ -1906,6 +1927,11 @@ packages: acorn: 8.8.1 dev: true + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + /acorn/8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} @@ -2056,6 +2082,10 @@ packages: es-shim-unscopables: 1.0.0 dev: true + /assertion-error/1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + /ast-walker-scope/0.3.0: resolution: {integrity: sha512-bsOBv3jB+1kGaxwPHhkLiagS+75KfzEqtkNWvATgMGtXM6kJZG3PlG4fYQFMiHeLpoAkwc6G61w07+hEXx39aA==} engines: {node: '>=14.19.0'} @@ -2283,6 +2313,19 @@ packages: upper-case-first: 2.0.2 dev: true + /chai/4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.2 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2338,6 +2381,10 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true + /check-error/1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + /chokidar/3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -2706,6 +2753,13 @@ packages: ms: 2.1.2 dev: true + /deep-eql/4.1.2: + resolution: {integrity: sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -3861,6 +3915,10 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: true + /get-func-name/2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + /get-intrinsic/1.1.3: resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} dependencies: @@ -4700,6 +4758,12 @@ packages: is-unicode-supported: 1.3.0 dev: true + /loupe/2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + /lower-case/2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: @@ -5504,6 +5568,10 @@ packages: resolution: {integrity: sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==} dev: true + /pathval/1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + /perfect-debounce/0.1.3: resolution: {integrity: sha512-NOT9AcKiDGpnV/HBhI22Str++XWcErO/bALvHCuhv33owZW/CjH8KAFLZDCmu3727sihe0wTxpDhyGc6M8qacQ==} dev: true @@ -6496,6 +6564,12 @@ packages: engines: {node: '>=8'} dev: true + /strip-literal/0.4.2: + resolution: {integrity: sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==} + dependencies: + acorn: 8.8.1 + dev: true + /strip-literal/1.0.0: resolution: {integrity: sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==} dependencies: @@ -6624,6 +6698,20 @@ packages: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: true + /tinybench/2.3.1: + resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==} + dev: true + + /tinypool/0.3.0: + resolution: {integrity: sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy/1.0.2: + resolution: {integrity: sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==} + engines: {node: '>=14.0.0'} + dev: true + /tmp/0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -6702,6 +6790,11 @@ packages: prelude-ls: 1.2.1 dev: true + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + /type-fest/0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -7123,6 +7216,85 @@ packages: fsevents: 2.3.2 dev: true + /vite/3.2.4_@types+node@18.11.9: + resolution: {integrity: sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.11.9 + esbuild: 0.15.15 + postcss: 8.4.19 + resolve: 1.22.1 + rollup: 2.79.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest/0.25.3: + resolution: {integrity: sha512-/UzHfXIKsELZhL7OaM2xFlRF8HRZgAHtPctacvNK8H4vOcbJJAMEgbWNGSAK7Y9b1NBe5SeM7VTuz2RsTHFJJA==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.11.9 + acorn: 8.8.1 + acorn-walk: 8.2.0 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.2 + source-map: 0.6.1 + strip-literal: 0.4.2 + tinybench: 2.3.1 + tinypool: 0.3.0 + tinyspy: 1.0.2 + vite: 3.2.4_@types+node@18.11.9 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vscode-jsonrpc/6.0.0: resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} engines: {node: '>=8.0.0 || >=10.0.0'} diff --git a/tests/__snapshots__/content.test.ts.snap b/tests/__snapshots__/content.test.ts.snap new file mode 100644 index 00000000..549d3f8a --- /dev/null +++ b/tests/__snapshots__/content.test.ts.snap @@ -0,0 +1,6 @@ +// Vitest Snapshot v1 + +exports[`rich-content > plain 1`] = ` +"Hello +World" +`; diff --git a/tests/content.test.ts b/tests/content.test.ts new file mode 100644 index 00000000..ce8f6f26 --- /dev/null +++ b/tests/content.test.ts @@ -0,0 +1,21 @@ +import type { Emoji } from 'masto' +import { describe, expect, it } from 'vitest' +import { renderToString } from 'vue/server-renderer' +import { contentToVNode } from '~/composables/content' + +async function render(content: string, emojis?: Record) { + const vnode = contentToVNode(content, emojis) + const html = (await renderToString(vnode)) + .replace(//g, '') + return { + vnode, + html, + } +} + +describe('rich-content', () => { + it('plain', async () => { + const { html } = await render('Hello\nWorld') + expect(html).toMatchSnapshot() + }) +}) diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..f335e362 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,14 @@ +import { resolve } from 'path' +import { defineConfig } from 'vitest/config' +import Vue from '@vitejs/plugin-vue' + +export default defineConfig({ + resolve: { + alias: { + '~/': `${resolve(__dirname)}/`, + }, + }, + plugins: [ + Vue(), + ], +})