To run tests requiring a database, start the test databases using Docker, see Docker.
- Create a
.envrc
in the root directory of the project with this content:
export TEST_POSTGRES_URI="postgres://prisma:prisma@localhost:5432/tests"
export TEST_POSTGRES_ISOLATED_URI="postgres://prisma:prisma@localhost:5435/tests"
export TEST_POSTGRES_URI_MIGRATE="postgres://prisma:prisma@localhost:5432/tests-migrate"
export TEST_POSTGRES_SHADOWDB_URI_MIGRATE="postgres://prisma:prisma@localhost:5432/tests-migrate-shadowdb"
export TEST_MYSQL_URI="mysql://root:root@localhost:3306/tests"
export TEST_MYSQL_ISOLATED_URI="mysql://root:root@localhost:3307/tests"
export TEST_MYSQL_URI_MIGRATE="mysql://root:root@localhost:3306/tests-migrate"
export TEST_MYSQL_SHADOWDB_URI_MIGRATE="mysql://root:root@localhost:3306/tests-migrate-shadowdb"
export TEST_MARIADB_URI="mysql://prisma:prisma@localhost:4306/tests"
export TEST_MSSQL_URI="mssql://SA:Pr1sm4_Pr1sm4@localhost:1433/master" # for `mssql` lib used in some tests
export TEST_MSSQL_JDBC_URI="sqlserver://localhost:1433;database=master;user=SA;password=Pr1sm4_Pr1sm4;trustServerCertificate=true;"
export TEST_MSSQL_JDBC_URI_MIGRATE="sqlserver://localhost:1433;database=tests-migrate;user=SA;password=Pr1sm4_Pr1sm4;trustServerCertificate=true;"
export TEST_MSSQL_SHADOWDB_JDBC_URI_MIGRATE="sqlserver://localhost:1433;database=tests-migrate-shadowdb;user=SA;password=Pr1sm4_Pr1sm4;trustServerCertificate=true;"
export TEST_MONGO_URI="mongodb://root:prisma@localhost:27018/tests?authSource=admin"
export TEST_MONGO_URI_MIGRATE="mongodb://root:prisma@localhost:27017/tests-migrate?authSource=admin"
export TEST_COCKROACH_URI=postgresql://prisma@localhost:26257/
- Load the environment variables with:
direnv allow
- We use the Jest test framework. Its CLI is powerful and removes the need for npm scripts mostly. For most cases this is what you need to know:
Note: the following command pnpm run test
can be used inside the packages folders like packages/client
. In the base folder you can only run pnpm run test
without extra arguments.
pnpm run test <fileNamePattern> -t <testNamePattern>
and to update snapshots use the -u option like this (the --
are required, anything after the dashes will be passed to Jest):
pnpm run test <fileNamePattern> -- -u
-
In
integration-tests
Jest'seach
feature is used. If you only want to run a subset of the test cases, simply leverage the-t
flag on the command line (see above point). For example inpackages/cli
here is how you would run Just thefindOne where PK
cases for sqlite integration:pnpm run jest integration.sqlite -t 'findOne where PK'
Something is broken? You built a new feature? It's time to write a test! But where?
Everything related to working with specific frameworks like Next.js or deploying to Netlify should be covered by an End-to-End Test.
Everything that is more basic functionality like a specific query or feature, that doesn't need a platform specific test (yet) should get a test in the prisma/prisma
repo.
Rule of thumb: If you can write a test in prisma/prisma
, prefer that over a test in prisma/e2e-tests
.
In the prisma/prisma
repository we have a few places where you can write tests:
cli
- Tests for
prisma studio
,prisma version
,prisma format
,prisma generate
,prisma doctor
, loading .env files, testing the built cli
- Tests for
client
src/__tests__/*.test.ts
- Unit testssrc/__tests__/integration/happy/**
- Integration tests for the happy pathsrc/__tests__/integration/errors/**
- Integration tests for error casessrc/__tests__/types/**
- Tests for generated Client TS Types
debug
- Unit tests for
debug
package
- Unit tests for
engine-core
- Unit tests for
engine-core
package
- Unit tests for
generator-helper
- Integration tests for generator interface implementation
migrate
- Unit and integration tests for
migrate
anddb
commands
- Unit and integration tests for
react-prisma
- Doesn't have tests
sdk
- Convert credentials to connection string and back
- Dotenv expansion
- Engine commands (
getDMMF
,getConfig
) (snapshots) - getGenerators (central function for generation)
- introspection (snapshots)
integration-tests
(Prisma Client & Introspection)- Integration tests for basic query and mutation functionality
- All databases that we support are covered here:
- mariadb
- mssql (SQL Server)
- mysql
- postgresql
- sqlite
- While these tests also test the client itself, they're rather just our base to make sure that basic query engine functionality actually works in the Prisma Client
- When you want to test very specific queries for a new feature, you can write an integration test in the
client
package, as that's usually easier
If the users did their homework and provide a reproduction repository, you usually just want to turn that into an integration test in the client
package.
If it's about an ugly error, that could be handled nicer, it should go into integration/errors
.
If it's about making sure, that a specific feature works as intended, you can create a new test case in integration/happy
.
The integration/happy/minimal
test is always a good start if you just want to test the JS interface of the client.
In case you want to test the actually generated client, have a look at the integration/happy/blog
test as an example.
By creating a Pull Request the following pipelines will be triggered
They are both running the same tests but with different Node.js version and will need to be successful before merging.