# Installation & Configuration

## Dependencies

```bash
pnpm add -D @nuxt/test-utils vitest @vue/test-utils happy-dom playwright-core
```

## Nuxt Config

Add the test utils module for Vitest integration in DevTools (optional):

```ts
// nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    '@nuxt/test-utils/module',
  ],
})
```

## Vitest Config (Project-Based Setup)

Use Vitest projects for fine-grained control over which tests run in which environment:

```ts
// vitest.config.ts
import { defineConfig } from 'vitest/config'
import { defineVitestProject } from '@nuxt/test-utils/config'

export default defineConfig({
  test: {
    projects: [
      {
        test: {
          name: 'unit',
          include: ['test/unit/*.{test,spec}.ts'],
          environment: 'node',
        },
      },
      {
        test: {
          name: 'e2e',
          include: ['test/e2e/*.{test,spec}.ts'],
          environment: 'node',
        },
      },
      await defineVitestProject({
        test: {
          name: 'nuxt',
          include: ['test/nuxt/*.{test,spec}.ts'],
          environment: 'nuxt',
        },
      }),
    ],
  },
})
```

**Important:** Requires `"type": "module"` in `package.json`, or rename to `vitest.config.m{ts,js}`.

## Alternative: Simple Setup

If all tests should run in the Nuxt environment:

```ts
// vitest.config.ts
import { defineVitestConfig } from '@nuxt/test-utils/config'

export default defineVitestConfig({
  test: {
    environment: 'nuxt',
    // environmentOptions: {
    //   nuxt: {
    //     domEnvironment: 'happy-dom', // 'happy-dom' (default) or 'jsdom'
    //     overrides: {
    //       // other Nuxt config
    //     }
    //   }
    // }
  },
})
```

Opt out of the Nuxt environment per test file with a comment:

```ts
// @vitest-environment node
import { test } from 'vitest'

test('my test', () => {
  // runs without Nuxt environment
})
```

## Recommended Test Directory Structure

```
test/
├── e2e/          # End-to-end tests (node environment)
│   └── ssr.test.ts
├── nuxt/         # Tests needing Nuxt runtime (nuxt environment)
│   ├── components.test.ts
│   └── composables.test.ts
└── unit/         # Pure unit tests (node environment)
    └── utils.test.ts
```

## Running Tests

```bash
# Run all tests
npx vitest

# Run only unit tests
npx vitest --project unit

# Run only Nuxt tests
npx vitest --project nuxt

# Run tests in watch mode
npx vitest --watch
```

## Environment Variables

Use a `.env.test` file for test-specific environment variables.

## TypeScript Support

Test files in `test/nuxt/` and `tests/nuxt/` are automatically included in the Nuxt app TypeScript context, so they recognize `~/`, `@/`, `#imports` aliases and auto-imports.

To add other directories to the Nuxt TypeScript context:

```ts
// nuxt.config.ts
export default defineNuxtConfig({
  typescript: {
    tsConfig: {
      include: [
        // relative to generated .nuxt/tsconfig.json
        '../test/other-nuxt-context/**/*',
      ],
    },
  },
})
```
