> Portal Navigation:
>
> - Append `.md` to any URL under `https://dev.wix.com/docs/` to get its markdown version.
> - Pages are either content pages (article or reference text) or menu pages (a list of links to child pages).
> - To get a menu page, truncate any URL to a parent path and append `.md` (e.g. `https://dev.wix.com/docs/sdk.md`, `https://dev.wix.com/docs/sdk/core-modules.md`).
> - Top-level index of all portals: https://dev.wix.com/docs/llms.txt
> - Full concatenated docs: https://dev.wix.com/docs/llms-full.txt
## Resource: Write Unit Tests for a Wix CLI Project
## Article: Write Unit Tests for a Wix CLI Project
## Article Link: https://dev.wix.com/docs/wix-cli/guides/development/app-development/write-unit-tests-for-a-wix-cli-project.md
## Article Content:
# Write Unit Tests for a Wix CLI Project
This article explains how to write unit tests for a CLI project using [Vitest](https://vitest.dev/) and `@testing-library/react`.
> **Note:** While this article's flow uses Vitest specifically, the CLI is framework-agnostic and supports any testing library.
This article covers:
- Preparing your project for unit testing with Vitest.
- Writing unit tests for your project.
## Before you begin
+ You must have a project that was [created using the Wix CLI](https://dev.wix.com/docs/wix-cli/guides/about-the-wix-cli.md).
+ You must be logged into your Wix account. If you don't have one, [sign up for a Wix account](https://manage.wix.com/account/custom-apps).
## Step 1 | Configure your project for tests
1. Run the following command to install the required packages:
```bash
npm add vitest jsdom @testing-library/jest-dom @testing-library/user-event @testing-library/react@12 -D
```
> **Note**: Since the Wix CLI uses React 16 for dashboard extensions, we currently only support version 12 of `@testing-library/react`.
2. Create or update your `vitest.config.js` file with the following configuration:
```javascript
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
include: ['src/**/*.(test|spec).ts?(x)'],
exclude: ['build', 'node_modules'],
environment: 'jsdom',
maxConcurrency: 7,
setupFiles: './tests/setup.ts',
},
});
```
3. Create a test setup file at `tests/setup.ts`. This file is used for general test configuration with Vitest:
```javascript
import { expect, afterEach } from 'vitest';
import { cleanup } from '@testing-library/react';
import * as matchers from '@testing-library/jest-dom/matchers';
expect.extend(matchers);
afterEach(() => {
cleanup();
});
```
4. Add the following script to your `package.json` file to trigger unit tests:
```json
{
"name": "your-wix-cli-project",
"version": "1.0.0",
"private": true,
"scripts": {
"wix": "wix",
"test:unit": "vitest run"
// ...
},
}
```
## Step 2 | Write unit tests
Depending on your project's functionality, testing your project's react components may involve mocking Wix JavaScript SDK APIs, backend interactions, or both.
### Test a react component without the SDK or backend interactions
To test a react component like a dashboard page, check that aspects of the component would be rendered correctly.
For example, given the following dashboard page:
```javascript
import React, { type FC } from 'react';
import { EmptyState, Page } from '@wix/design-system';
import '@wix/design-system/styles.global.css';
const Index: FC = () => {
return (
);
};
export default Index;
```
You can test whether the "Dashboard Page" text would be present on the page when rendered.
```javascript
import React from 'react';
import { describe, expect, it } from 'vitest';
import { render } from '@testing-library/react';
import Page from './page';
describe('Index Page', () => {
it('should render the page', async () => {
const { findByText } = render();
await findByText('Dashboard Page');
});
});
```
### Test a component that involves an SDK API call
If your component's code calls a Wix JavaScript SDK API, render the component and manually mock the API.
The following example demonstrates how to mock the Dashboard API's [`showToast()`](https://dev.wix.com/docs/sdk/host-modules/dashboard/show-toast.md) method.
```javascript
import React from 'react';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { render } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { dashboard } from '@wix/dashboard';
import Page from './page';
vi.mock('@wix/dashboard');
describe('Index Page', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('should show toast', async () => {
const { findByText } = render();
const toastBtn = await findByText('Show a toast');
await userEvent.click(toastBtn);
expect(dashboard.showToast).toBeCalledWith({ message: 'Your first toast message' });
expect(dashboard.showToast).toHaveBeenCalledOnce();
});
});
```
### Test a component that involves backend interactions
If your project interacts with a backend, mock those interactions using Vitest.
For example, if you have a page that calls the CRM backend to retrieve user contacts:
```javascript
import React, { useEffect, useState, type FC } from 'react';
import { contacts } from '@wix/crm';
import {
Page,
Card,
Box,
Loader,
Text,
Table,
WixDesignSystemProvider,
} from '@wix/design-system';
import '@wix/design-system/styles.global.css';
const Index: FC = () => {
const [userContacts, setUserContacts] = useState();
const [isLoading, setIsLoading] = useState(true);
const [err, setErr] = useState(null);
useEffect(() => {
const fetchContacts = async () => {
try {
const result = await contacts.queryContacts({});
setUserContacts(result.items);
} catch (queryError) {
setErr(queryError);
} finally {
setIsLoading(false);
}
};
fetchContacts();
}, []);
return (
{isLoading && (
)}
{err && Error: {err.message}}
{(userContacts?.length || 0) > 0 && (
row._id },
{
title: 'First Name',
render: (row) => row.info?.name?.first,
},
{
title: 'Last Name',
render: (row) => row.info?.name?.last,
},
]}
/>
)}
);
};
export default Index;
```
You would mock the backend interactions with the API using `vitest` as follows:
```javascript
import React from 'react';
import { randomUUID } from 'node:crypto';
import { describe, expect, it, vi } from 'vitest';
import { render } from '@testing-library/react';
import Page from './page';
vi.mock('@wix/crm', () => ({
contacts: {
queryContacts: async () => ({
items: [
{
_id: randomUUID(),
info: {
name: {
first: 'John',
last: 'Doe'
},
},
}
],
}),
},
}));
describe('test page', () => {
it('should display contact', async () => {
const { findByText } = render();
const firstNameEl = await findByText('John');
expect(firstNameEl).toBeDefined();
const lastNameEl = await findByText('Doe');
expect(lastNameEl).toBeDefined();
});
});
```
## See also
- [Wix CLI integration in CI/CD workflows](https://dev.wix.com/docs/wix-cli/guides/development/development-overview.md)