Skip to main content
Version: 3.0.0

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!

Don’t have Keploy installed yet?

Before running this sample, make sure Keploy is installed on your system.

👉 Go to Installation Guide

Prerequisites

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/docs to 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 Guide

Prerequisites

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" --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 keploy folder will be created containing the recorded test data. Additionally, a keploy.yml file will be created as the configuration file.

Test the Application using Keploy

keploy test -c "docker compose up" --container-name "nodeMongoApp" --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.

Questions? 🤔💭

For any support please join keploy slack community to get help from fellow users, or book a demo if you're exploring enterprise use cases.