For testing, we use vitest. We prefer to define globals and run tests under the happy-dom environment.

The @react-email/render package’s renderAsync does a fair bit of magic to simulate edge and other environments that are not supported by happy-dom. For this use case, we override the environment on a per-file basis for its tests

We do not strictly enforce testing coverage, but encourage it. A good rule of thumb is that if you need to simulate use cases to check whether a specific portion of code works, you should split it into a function with a matching unit test.

After you have gone through the setup run pnpm test inside any package. This will run the tests only once. We have two scripts defined on our packages for testing:

  • pnpm test: Runs all the tests once. If you run it on the root, it will run the tests for all packages using turborepo
  • pnpm test:watch: Runs all the tests and watches for changes. Vitest automatically only runs the tests that are affected by the code you’ve changed.