Express + PostgreSQL + Prisma Sample Application
Running App Locally on Linux/WSL
A sample Task Management application and see how seamlessly Keploy integrates with Express, PostgreSQL and Prisma ORM. Buckle up, it's gonna be a fun ride!
This section runs on Linux or WSL. On macOS, or on Windows without WSL, use the Docker Compose steps instead — natively there, Keploy captures PostgreSQL calls only as raw bytes, which usually don't replay.
Don’t have Keploy installed yet?
Before running this sample, make sure Keploy is installed on your system.
👉 Go to Installation GuidePrerequisites
Ensure you have the following installed:
- Docker
- Node.js and npm
- Keploy CLI
Clone the repository and move to express-postgresql-prisma folder
git clone https://github.com/keploy/samples-typescript.git
cd samples-typescript/express-postgresql-prisma
Install the dependencies
npm install
Set up environment variables:
cp .env.example .env
Start PostgreSQL Container
docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres
Note: PostgreSQL Password is
mysecretpassword
Update the .env file with your PostgreSQL connection string:
PORT=3000
DATABASE_URL="postgresql://postgres:mysecretpassword@localhost:5432/postgres"
Migrate the database:
npm run generate
npm run migrate init
root@Linus:~/samples-typescript/express-postgresql-prisma# npm run migrate init
> task-manager@1.0.0 migrate
> prisma migrate dev --name init
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "postgres", schema "public" at "localhost:5432"
Applying migration `20240730015533_initial_migration`
Applying migration `20240731010434_due_date_type_change_to_string`
The following migration(s) have been applied:
migrations/
└─ 20240730015533_initial_migration/
└─ migration.sql
└─ 20240731010434_due_date_type_change_to_string/
└─ migration.sql
Your database is now in sync with your schema.
✔ Generated Prisma Client (v5.17.0) to ./node_modules/@prisma/clie
nt in 50ms
┌─────────────────────────────────────────────────────────┐
│ Update available 5.17.0 -> 5.19.0 │
│ Run the following to update │
│ npm i --save-dev prisma@latest │
│ npm i @prisma/client@latest │
└─────────────────────────────────────────────────────────┘
Start the application:
npm run dev
Server is listening at PORT 3000
Server: http://localhost:3000
API Docs: http://localhost:3000/api/docs
Note: The application will run on
http://localhost:3000.
Now we walkthrough how to leverage Keploy to automatically generate test cases for the application, and later test the application using Keploy.
Generate Test Cases
Note: Build the application first using
npm run build
keploy record -c "npm start"
root@Linus:~/samples-typescript/express-postgresql-prisma# keploy record -c "npm start"
🐰 Keploy: 2024-08-28T09:48:30+05:30 INFO config file not found; proceeding with flags only
▓██▓ ▄
▓▓▓▓██▓█▓▄
████████▓▒
▀▓▓███▄ ▄▄ ▄ ▌
▄▌▌▓▓████▄ ██ ▓█▀ ▄▌▀▄ ▓▓▌▄ ▓█ ▄▌▓▓▌▄ ▌▌ ▓
▓█████████▌▓▓ ██▓█▄ ▓█▄▓▓ ▐█▌ ██ ▓█ █▌ ██ █▌ █▓
▓▓▓▓▀▀▀▀▓▓▓▓▓▓▌ ██ █▓ ▓▌▄▄ ▐█▓▄▓█▀ █▓█ ▀█▄▄█▀ █▓█
▓▌ ▐█▌ █▌
▓
version: 2.3.0-beta14
🐰 Keploy: 2024-08-28T09:48:30+05:30 INFO Generated config file based on the flags that are used
🐰 Keploy: 2024-08-28T09:48:32+05:30 INFO keploy initialized and probes added to the kernel.
🐰 Keploy: 2024-08-28T09:48:32+05:30 INFO Keploy has taken control of the DNS resolution mechanism, your application may misbehave if you have provided wrong domain name in your application code.
🐰 Keploy: 2024-08-28T09:48:32+05:30 INFO Proxy started at port:16789
🐰 Keploy: 2024-08-28T09:48:32+05:30 INFO starting TCP DNS server at addr :26789
🐰 Keploy: 2024-08-28T09:48:32+05:30 INFO starting UDP DNS server at addr :26789
> task-manager@1.0.0 start
> node dist/index.js
Server is listening at PORT 3000
Server: http://localhost:3000
API Docs: http://localhost:3000/api/docs
The above command will start recording the API calls made to the application and will generate a test case in the testcases/ directory.
💡 You can use Postman or any other API testing tool to test the API calls. Additionally, the application will run a swagger UI on
http://localhost:3000/api/docsto visualize the API calls.
Test the Application
keploy test -c "npm start"
Running App using Docker Compose 🐳
A sample Task Management application and see how seamlessly Keploy integrates with Express, PostgreSQL and Prisma ORM. Buckle up, it's gonna be a fun ride!
Don’t have Keploy installed yet?
Before running this sample, make sure Keploy is installed on your system.
👉 Go to Installation GuidePrerequisites
Ensure you have the following installed:
- Docker
- Node.js and npm
- Keploy CLI
Clone the repository and move to express-postgresql-prisma folder
git clone https://github.com/keploy/samples-typescript.git
cd samples-typescript/express-postgresql-prisma
Install the dependencies
npm install
Set up environment variables:
cp .env.example .env
We will be using Docker compose to run the application as well as PostreSql on Docker container.
Lights, Camera, Record! 🎥 Fire up the application and mongoDB instance with Keploy. Keep an eye on the two key flags: -c: Command to run the app (e.g., docker compose up).
--container-name: The container name in the docker-compose.yml for traffic interception.
keploy record -c "docker compose up" --container-name "express-postgresql-prisma-app-1" --build-delay 50
🔥 Challenge time! Generate some test cases. How? Just make some API calls. Postman, Hoppscotch or even curl - take your pick!
Interact with Application
Make API Calls using Postman or cURL command. Keploy with capture those calls to generate the test-suites containing testcases and data mocks.
API Routes
Add Task
- URL:
/api/v1/task/add - Method:
POST - Description: Add a new task.
- Request Body:
{
"author": "John Doe",
"title": "Complete the report",
"description": "Complete the quarterly report by end of the week",
"dueDate": "2024-08-01",
"status": "Pending",
"priority": 3
}
Using curl
curl -X 'POST' \
'http://localhost:3000/api/v1/task/add' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"author": "John Doe",
"title": "Complete the report",
"description": "Complete the quarterly report by end of the week",
"dueDate": "2024-08-01",
"status": "Pending",
"priority": 3
}'
View All Tasks
Using curl
curl -X 'GET' \
'http://localhost:3000/api/v1/task/view' \
-H 'accept: application/json'
View Task by ID
- URL:
/api/v1/task/view/:id - Method:
GET - Description: Retrieve a specific task by its ID.
- Request Params:
id(task ID)
Using curl
curl -X 'GET' \
'http://localhost:3000/api/v1/task/view/1' \
-H 'accept: application/json'
Change Task Priority
- URL:
/api/v1/task/change-priority/:id - Method:
PUT - Description: Update the priority of a specific task.
- Request Params:
id(task ID) - Request Body:
{
"priority": 3
}
Using curl
curl -X 'PUT' \
'http://localhost:3000/api/v1/task/change-priority/1' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"priority": 3
}'
Update Task
- URL:
/api/v1/task/update/:id - Method:
PUT - Description: Update details of a specific task.
- Request Params:
id(task ID) - Request Body:
{
"author": "John Doe",
"title": "Complete the report",
"description": "Complete the quarterly report by end of the week",
"dueDate": "2024-08-01",
"status": "Pending",
"priority": 3
}
Using curl
curl -X 'PUT' \
'http://localhost:3000/api/v1/task/update/2' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"author": "John Doe",
"title": "Complete the report",
"description": "Complete the quarterly report by end of the week",
"dueDate": "2024-08-01",
"status": "Pending",
"priority": 3
}'
Delete Task
- URL:
/api/v1/task/delete/:id - Method:
DELETE - Description: Delete a specific task.
- Request Params:
id(task ID)
Using curl
curl -X 'DELETE' \
'http://localhost:3000/api/v1/task/delete/1' \
-H 'accept: application/json'
🐰 Test Data and Configuration: After recording the interactions, a
keployfolder will be created containing the recorded test data. Additionally, akeploy.ymlfile will be created as the configuration file.
Test the Application using Keploy
keploy test -c "docker compose up" --container-name "express-postgresql-prisma-app-1" --build-delay 50 --delay 10
The --delay flag? Oh, that's just giving your app a little breather (in seconds) before the test cases come knocking.
Keploy will replay the recorded interactions and validate the responses against the expected results.
Node.js v22.7.0
🐰 Keploy: 2024-08-28T10:14:14+05:30 WARN To enable storing mocks in cloud please use disableMockUpload flag/configuration
<=========================================>
COMPLETE TESTRUN SUMMARY.
Total tests: 7
Total test passed: 7
Total test failed: 0
Total time taken: "5.66 s"
Test Suite Name Total Test Passed Failed Time Taken
"test-set-0" 7 7 0 "5.66 s"
<=========================================>
🐰 Keploy: 2024-08-28T10:14:14+05:30 INFO calculating coverage for the test run and inserting it into the report
🐰 Keploy: 2024-08-28T10:14:14+05:30 INFO [Total Coverage Percentage: 86.16%]
🐰 Keploy: 2024-08-28T10:14:14+05:30 INFO stopping Keploy {"reason": "replay completed successfully"}
🐰 Keploy: 2024-08-28T10:14:14+05:30 INFO proxy stopped...
🐰 Keploy: 2024-08-28T10:14:17+05:30 INFO eBPF resources released successfully...
Voila! 🎉 You have successfully tested the application using Keploy. Keploy also generates coverage reports for the test-suites.
Related
- Sample JavaScript Apps — browse more JS samples.
- Node.js Express Mongoose Sample — Express with a different datastore.
- NodeJS - JWT Sample Application — Node app on Postgres.
- NextJs Sample Application — another Postgres-backed JS app.