Added vitest (#5)

* Moved eslint and @nuxt/eslint to devDependencies

* Added vitest to project and 1 test

* Tweaked Sonar workflow in order to run tests and coverage

* Removed offending config line
This commit is contained in:
Liviu Burcusel 2025-10-24 17:20:05 +02:00 committed by GitHub
parent c98879430b
commit 3b58a25ccf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 942 additions and 15 deletions

View file

@ -18,6 +18,18 @@ jobs:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup node environment
uses: actions/setup-node@v4
with:
node-version: "22"
cache: "npm"
- name: Install dependencies
run: npm ci
- name: Run tests and generate coverage
run: npm run coverage
continue-on-error: true
env:
CI: true
- name: SonarQube Scan
uses: SonarSource/sonarqube-scan-action@v6
env:

View file

@ -7,5 +7,6 @@ export default withNuxt(eslintPluginPrettierRecommended, {
rules: {
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-require-imports": "off",
"@typescript-eslint/no-unused-vars": "warn",
},
});

846
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -9,19 +9,27 @@
"preview": "nuxt preview",
"postinstall": "nuxt prepare",
"lint": "eslint .",
"lint-files": "eslint --ext .js,.ts,.vue"
"lint-files": "eslint --ext .js,.ts,.vue",
"vitest": "vitest",
"test": "vitest run",
"coverage": "vitest run --coverage"
},
"dependencies": {
"@nuxt/eslint": "^1.9.0",
"eslint": "^9.38.0",
"nuxt": "^4.1.3",
"vue": "^3.5.22",
"vue-router": "^4.6.3"
},
"devDependencies": {
"@nuxt/eslint": "^1.9.0",
"@vitejs/plugin-vue": "^6.0.1",
"@vitest/coverage-v8": "^4.0.1",
"@vue/test-utils": "^2.4.6",
"eslint": "^9.38.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.4",
"happy-dom": "^20.0.8",
"prettier": "^3.6.2",
"typescript": "^5.9.3"
"typescript": "^5.9.3",
"vitest": "^4.0.1"
}
}

View file

@ -8,5 +8,5 @@ sonar.sources=app, tests
sonar.inclusions=app/**/*.ts, app/**/*.js, app/**/*.vue, app/**/*.css, app/**/*.scss, tests/**/*.spec.ts
sonar.exclusions=**/node_modules/**, **/coverage/**, *.config.ts
sonar.coverage.exclusions=tests/**, *.config.ts
# sonar.javascript.lcov.reportPaths=coverage/lcov.info
sonar.javascript.lcov.reportPaths=coverage/lcov.info
# sonar.testExecutionReportPaths=coverage/sonar-report.xml

18
tests/app.test.ts Normal file
View file

@ -0,0 +1,18 @@
import { describe, expect, it } from "vitest";
import type { VueWrapper } from "@vue/test-utils";
import { mount } from "@vue/test-utils";
import App from "../app/app.vue";
describe("app.vue", () => {
const wrapper: VueWrapper = mount(App, {
global: {
stubs: {
NuxtRouteAnnouncer: true,
NuxtWelcome: true,
},
},
});
it("renders without crashing", () => {
expect(wrapper.exists()).toBe(true);
});
});

10
tests/setup.ts Normal file
View file

@ -0,0 +1,10 @@
import { vi } from "vitest";
Object.defineProperty(global, "import", {
value: {
meta: {
glob: vi.fn(() => ({})),
},
},
writable: true,
});

View file

@ -14,11 +14,5 @@
{
"path": "./.nuxt/tsconfig.node.json"
}
],
"compilerOptions": {
"paths": {
"~/*": ["./src/*"],
"@/*": ["./src/*"]
}
}
]
}

44
vitest.config.ts Normal file
View file

@ -0,0 +1,44 @@
import { defineConfig } from "vitest/config";
import vue from "@vitejs/plugin-vue";
import { resolve } from "path";
export default defineConfig({
plugins: [vue()],
test: {
globals: true,
setupFiles: ["./tests/setup.ts"],
environment: "happy-dom",
include: ["tests/**/*.test.ts"],
coverage: {
provider: "v8",
reporter: ["text", "html", "lcov"],
clean: true,
cleanOnRerun: true,
exclude: [
"node_modules/**",
"dist/**",
"coverage/**",
"**/*.test.ts",
"tests/mocks/**",
// Exclude Nuxt generated files
".nuxt/**",
".output/**",
// Exclude TypeScript declaration files
"**/*.d.ts",
// Exclude config files
"*.config.*",
"assets/icons/**",
],
},
name: "GFiesta",
},
resolve: {
alias: {
"~": resolve(__dirname, "./app"),
"@": resolve(__dirname, "./app"),
},
},
});