Skip to main content

Tests

This document outlines the guidelines for writing tests in ttoss packages.

Quick Setup

For a fast automated setup, use the @ttoss/monorepo CLI tool to scaffold the complete test structure:

# Setup unit tests only (recommended for most packages)
npx @ttoss/monorepo setup-tests path/to/package

# Setup unit tests in current directory
npx @ttoss/monorepo setup-tests

# Setup both unit and e2e tests
npx @ttoss/monorepo setup-tests path/to/package --e2e

This command creates the directory structure, configuration files, installs required dependencies (jest and @ttoss/config), and adds test scripts to your package.json.

After setup, verify everything is working:

pnpm test

You should see a sample test pass. The setup creates a setup.test.ts file in tests/unit/tests/ that you can delete once you start writing your own tests.

For manual setup or to understand the structure, continue reading the sections below.

Runners

We use Jest as our test runner and React Testing Library for testing React components.

Categories

We divide our tests into two categories: unit tests and e2e tests. Unit tests are for testing individual functions, and e2e tests are for testing the entire application.

We write unit tests in the tests/unit/tests folder and e2e tests in the tests/e2e/tests folder, both ending with the .test.ts or .test.tsx extension.

File Structure

The inital file structure for tests in your package should be as follows:

tests/
e2e/
tests/
myFunction.test.ts
babel.config.cjs
jest.config.ts
unit/
tests/
myOtherFunction.test.ts
babel.config.cjs
jest.config.ts
tsconfig.json
jest.config.ts

Manual Configuration

If you prefer to set up tests manually or need to customize the automated setup, follow these steps:

Installation

First, install the required dependencies:

pnpm add -D jest @ttoss/config

For more details, see @ttoss/config installation instructions.

Configuration Files

  1. Define the root Jest configuration in jest.config.ts at the package root. This sets up Jest projects:

    import { jestRootConfig } from '@ttoss/config';

    export default jestRootConfig({
    coverageThreshold: {
    global: {
    lines: 50,
    functions: 50,
    branches: 50,
    statements: 50,
    },
    },
    });
  2. Create a jest.config.ts file in tests/unit/ for unit tests:

    import { jestUnitConfig } from '@ttoss/config';

    export default jestUnitConfig();
  3. Create tests/tsconfig.json to enable TypeScript path aliases:

    {
    "extends": "@ttoss/config/tsconfig.test.json",
    "compilerOptions": {
    "paths": {
    "src/*": ["../src/*"],
    "tests/*": ["./*"]
    }
    }
    }

    This way, you can import files from the src folder in your tests. For example:

    import { myFunction } from 'src/myFunction';
  4. (Optional) For e2e tests, create tests/e2e/jest.config.ts:

    import { jestE2EConfig } from '@ttoss/config';

    export default jestE2EConfig();
  5. Create Babel configuration files for Jest transpilation. Add tests/unit/babel.config.cjs (and tests/e2e/babel.config.cjs if using e2e tests):

    const { babelConfig } = require('@ttoss/config');

    const config = babelConfig({});

    module.exports = config;
  6. Add test scripts to package.json:

    {
    "scripts": {
    "test": "jest --projects tests/unit",
    "e2e": "jest --projects tests/e2e"
    }
    }

Running Tests

After setup, write your tests in tests/unit/tests/ (and tests/e2e/tests/ for e2e tests) with .test.ts or .test.tsx extensions.

Run unit tests:

pnpm test

Run e2e tests:

pnpm e2e

Test Coverage Requirements

Minimum Coverage Baseline

All packages must maintain minimum 10% test coverage as a baseline requirement. This ensures basic testing discipline while remaining achievable for all team members.

Coverage Improvement Strategy

  • Package-specific goals: Each package can set higher coverage targets based on complexity and criticality
  • Incremental improvement: Increase coverage gradually when the team has capacity
  • Flexible timeline: No rigid schedule—improve when sustainable for the team
  • Focus on critical paths: Prioritize testing of core functionality and user flows

Coverage Tracking

@ttoss/config has already configured coverage collection.

Integration with Pull Requests

  • Baseline maintenance: PRs should not decrease overall package coverage below 10%
  • New feature testing: New features should include appropriate test coverage
  • Coverage reporting: Use coverage reports to guide testing priorities