Skip to content

With Vitest ​

Vitest is the recommended test runner for grammY Testing. The library uses ESM natively and Vitest handles it without any special configuration.

Setup ​

sh
npm install --save-dev vitest grammy-testing grammy

Minimal vitest.config.ts:

ts
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    globals: false, // optional: set true to skip importing describe/it/expect
  },
});

No transform plugins, no special flags. Vitest's default ESM support handles everything.

Writing tests ​

ts
// bot.spec.ts
import { prepareBot } from 'grammy-testing';
import { describe, expect, it } from 'vitest';

import { createBot } from './bot';

describe('my bot', () => {
  it('replies to /start', async () => {
    const { chats } = await prepareBot(createBot());
    const user = chats.newUser();

    await user.sendCommand('/start');

    expect(user.replies.lastOrThrow().text).toBe('Welcome!');
  });
});

Coverage ​

Add @vitest/coverage-v8 and configure a coverage threshold:

sh
npm install --save-dev @vitest/coverage-v8
ts
// vitest.config.ts
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    coverage: {
      provider: 'v8',
      include: ['src/**/*.ts'],
      thresholds: {
        lines: 80,
        functions: 80,
      },
    },
  },
});

Run:

sh
npx vitest run --coverage

Global setup ​

For shared setup (e.g. a common bot factory), use a setup.ts file:

ts
// vitest.config.ts
export default defineConfig({
  test: {
    setupFiles: ['./tests/setup.ts'],
  },
});

package.json scripts ​

json
{
  "scripts": {
    "test": "vitest",
    "test:run": "vitest run",
    "test:coverage": "vitest run --coverage"
  }
}

Released under the MIT License.