Using Docker Compose π³β
A sample url shortener app to test Keploy integration capabilities using Gin and MongoDB
Donβt have Keploy installed yet?
Before running this sample, make sure Keploy is installed on your system.
π Go to Installation GuideClone a sample URL shortener app π§ͺβ
git clone https://github.com/keploy/samples-go.git && cd samples-go/gin-mongo
go mod download
We will be using Docker compose to run the application as well as MongoDb 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 "ginMongoApp"
Getting logs like this? Perfect! π

π₯ Challenge time! Generate some test cases. How? Just make some API calls. Postman, Hoppscotch or even curl - take your pick!
Let's make URLs short and sweet:
Generate shortened urlβ
curl --request POST \
--url http://localhost:8080/url \
--header 'content-type: application/json' \
--data '{
"url": "https://google.com"
}'
Here's a peek of what you get:
{
"ts": 1645540022,
"url": "http://localhost:8080/Lhr4BWAi"
}
π Woohoo! With a simple API call, you've crafted a test case with a mock! Dive into the Keploy directory and feast your eyes on the newly minted test-1.yml
and mocks.yml
version: api.keploy.io/v1beta2
kind: Http
name: test-1
spec:
metadata: {}
req:
method: POST
proto_major: 1
proto_minor: 1
url: http://localhost:8080/url
header:
Accept: "*/*"
Content-Length: "33"
Content-Type: application/json
Host: localhost:8080
User-Agent: curl/7.77.0
body: |-
{
"url": "https://google.com"
}
body_type: ""
resp:
status_code: 200
header:
Content-Length: "65"
Content-Type: application/json; charset=utf-8
Date: Sun, 01 Oct 2023 15:15:47 GMT
body: '{"ts":1696173347979970488,"url":"http://localhost:8080/Lhr4BWAi"}'
body_type: ""
status_message: ""
proto_major: 0
proto_minor: 0
objects: []
assertions:
noise:
- header.Date
created: 1696173352
this is how the generated mock.yml will look like:
version: api.keploy.io/v1beta2
kind: Mongo
name: mocks
spec:
metadata:
operation: '{ OpMsg flags: 0, sections: [{ SectionSingle msg: {"update":"url-shortener","ordered":true,"writeConcern":{"w":"majority"},"lsid":{"id":{"$binary":{"base64":"eRaUQwDxR2qw3Jcbpn0Gfw==","subType":"04"}}},"$db":"keploy"} }, { SectionSingle identifier: updates , msgs: [ {"q":{"_id":"Lhr4BWAi"},"u":{"$set":{"_id":"Lhr4BWAi","created":{"$date":{"$numberLong":"1696173347975"}},"updated":{"$date":{"$numberLong":"1696173347975"}},"url":"https://google.com"}},"upsert":true} ] }], checksum: 0 }'
requests:
- header:
length: 301
requestId: 11
responseTo: 0
Opcode: 2013
message:
flagBits: 0
sections:
- '{ SectionSingle msg: {"update":"url-shortener","ordered":true,"writeConcern":{"w":"majority"},"lsid":{"id":{"$binary":{"base64":"eRaUQwDxR2qw3Jcbpn0Gfw==","subType":"04"}}},"$db":"keploy"} }'
- '{ SectionSingle identifier: updates , msgs: [ {"q":{"_id":"Lhr4BWAi"},"u":{"$set":{"_id":"Lhr4BWAi","created":{"$date":{"$numberLong":"1696173347975"}},"updated":{"$date":{"$numberLong":"1696173347975"}},"url":"https://google.com"}},"upsert":true} ] }'
checksum: 0
read_delay: 41060962050
responses:
- header:
length: 60
requestId: 14
responseTo: 11
Opcode: 2013
message:
flagBits: 0
sections:
- '{ SectionSingle msg: {"n":{"$numberInt":"1"},"nModified":{"$numberInt":"1"},"ok":{"$numberDouble":"1.0"}} }'
checksum: 0
read_delay: 2506709
created: 1696173347
Time to perform more API magic! Follow the breadcrumbs... or the shortened URLs:
Redirect to original url from shortened urlβ
curl --request GET --url http://localhost:8080/Lhr4BWAi
Or just type http://localhost:8080/Lhr4BWAi
in your browser. Your choice!
Spotted the new test and mock files in your project? High five! π

Want to see if everything works as expected?
Run Tests πββοΈβ
Time to put things to the test π§ͺ
keploy test -c "docker compose up" --container-name "ginMongoApp" --delay 10
The
--delay
flag? Oh, that's just giving your app a little breather (in seconds) before the test cases come knocking.
Your results should be looking all snazzy, like this:

Did you spot that the ts (timestamp) is showing some differences? Yep, time has a way of doing that! π°οΈ
Worry not, just add the ever-changing fields (like our ts here) to the noise parameter to dodge those assertions.
Pro tip: Add
body.ts
to noise intest-x.yaml
.

Run that keploy test
command once more and watch as everything falls into place with all tests passing! π
Final thoughts? Dive deeper! Try different API calls, tweak the DB response in the mocks.yml
, or fiddle with the request or response in test-x.yml
. Run the tests again and see the magic unfold!β¨π©βπ»π¨βπ»β¨
Wrapping it up πβ
Congrats on the journey so far! You've seen Keploy's power, flexed your coding muscles, and had a bit of fun too! Now, go out there and keep exploring, innovating, and creating! Remember, with the right tools and a sprinkle of fun, anything's possible.ππ
Happy coding! β¨π©βπ»π¨βπ»β¨
Running App Locally on Linux/WSL π§β
A Sample url shortener app to test Keploy integration capabilities using Echo and PostgreSQL
Donβt have Keploy installed yet?
Before running this sample, make sure Keploy is installed on your system.
π Go to Installation GuideClone a sample URL shortener app π§ͺβ
git clone https://github.com/keploy/samples-go.git && cd samples-go/gin-mongo
go mod download
We'll be running our sample application right on Linux, but just to make things a tad more thrilling, we'll have the database (MongoDB) chill on Docker. Ready? Let's get the party started! π
If you are using WSL on Windows then use below to start wsl in the user's home directory:
wsl ~
First things first, update the MongoDB URL to localhost:27017
on line 21 of our trusty main.go
file.

π Kickstart MongoDBβ
Let's breathe life into your mongo container. A simple spell should do the trick:
docker compose up mongo
πΌ Recording Time!β
Ready, set, record! Here's how:
keploy record -c "go run main.go handler.go"
Keep an eye out for the -c
flag! It's the command charm to run the app. Whether you're using go run main.go handler.go
or the binary path like ./test-app-url-shortener
, it's your call.
If you're seeing logs that resemble the ones below, you're on the right track:

Alright! With the app alive and kicking, let's weave some test cases. Making some API calls! Postman, Hoppscotch, or the classic curl - pick your wand.
Generate shortened urlβ
β¨ A pinch of URL magic:
curl --request POST \
--url http://localhost:8080/url \
--header 'content-type: application/json' \
--data '{
"url": "https://google.com"
}'
And... voila! A shortened URL appears:
{
"ts": 1645540022,
"url": "http://localhost:8080/Lhr4BWAi"
}
Give yourself a pat on the back! With that simple spell, you've conjured up a test case with a mock! Explore the Keploy directory and you'll discover your handiwork in test-1.yml
and mocks.yml
.
version: api.keploy.io/v1beta2
kind: Http
name: test-1
spec:
metadata: {}
req:
method: POST
proto_major: 1
proto_minor: 1
url: http://localhost:8080/url
header:
Accept: "*/*"
Content-Length: "33"
Content-Type: application/json
Host: localhost:8080
User-Agent: curl/7.77.0
body: |-
{
"url": "https://google.com"
}
body_type: ""
resp:
status_code: 200
header:
Content-Length: "65"
Content-Type: application/json; charset=utf-8
Date: Sun, 01 Oct 2023 15:15:47 GMT
body: '{"ts":1696173347979970488,"url":"http://localhost:8080/Lhr4BWAi"}'
body_type: ""
status_message: ""
proto_major: 0
proto_minor: 0
objects: []
assertions:
noise:
- header.Date
created: 1696173352
this is how the generated mock.yml will look like:
version: api.keploy.io/v1beta2
kind: Mongo
name: mocks
spec:
metadata:
operation: '{ OpMsg flags: 0, sections: [{ SectionSingle msg: {"update":"url-shortener","ordered":true,"writeConcern":{"w":"majority"},"lsid":{"id":{"$binary":{"base64":"eRaUQwDxR2qw3Jcbpn0Gfw==","subType":"04"}}},"$db":"keploy"} }, { SectionSingle identifier: updates , msgs: [ {"q":{"_id":"Lhr4BWAi"},"u":{"$set":{"_id":"Lhr4BWAi","created":{"$date":{"$numberLong":"1696173347975"}},"updated":{"$date":{"$numberLong":"1696173347975"}},"url":"https://google.com"}},"upsert":true} ] }], checksum: 0 }'
requests:
- header:
length: 301
requestId: 11
responseTo: 0
Opcode: 2013
message:
flagBits: 0
sections:
- '{ SectionSingle msg: {"update":"url-shortener","ordered":true,"writeConcern":{"w":"majority"},"lsid":{"id":{"$binary":{"base64":"eRaUQwDxR2qw3Jcbpn0Gfw==","subType":"04"}}},"$db":"keploy"} }'
- '{ SectionSingle identifier: updates , msgs: [ {"q":{"_id":"Lhr4BWAi"},"u":{"$set":{"_id":"Lhr4BWAi","created":{"$date":{"$numberLong":"1696173347975"}},"updated":{"$date":{"$numberLong":"1696173347975"}},"url":"https://google.com"}},"upsert":true} ] }'
checksum: 0
read_delay: 41060962050
responses:
- header:
length: 60
requestId: 14
responseTo: 11
Opcode: 2013
message:
flagBits: 0
sections:
- '{ SectionSingle msg: {"n":{"$numberInt":"1"},"nModified":{"$numberInt":"1"},"ok":{"$numberDouble":"1.0"}} }'
checksum: 0
read_delay: 2506709
created: 1696173347
Time to perform more API magic! Follow the breadcrumbs... or the shortened URLs:
Redirect to original url from shortened urlβ
curl --request GET \ --url http://localhost:8080/Lhr4BWAi
Or just type http://localhost:8080/Lhr4BWAi
in your browser. Your choice!
Spotted the new test and mock files in your project? High five! π

Want to see if everything works as expected?
πββοΈ Run Testsβ
Time to put things to the test π§ͺ
keploy test -c "docker compose up" --container-name "ginMongoApp" --delay 10
The
--delay
flag? Oh, that's just giving your app a little breather (in seconds) before the test cases come knocking.
Your results should be looking all snazzy, like this:

Did you spot that, the ts (timestamp) is showing some differences? Yep, time has a way of doing that! π°οΈ
Worry not, just add the ever-changing fields (like our ts here) to the noise parameter to dodge those assertions.
Pro tip: Add
body.ts
to noise intest-x.yaml
.

Run that keploy test
command once more and watch as everything falls into place with all tests passing! π
Final thoughts? Dive deeper! Try different API calls, tweak the DB response in the mocks.yml
, or fiddle with the request or response in test-x.yml
. Run the tests again and see the magic unfold! β¨π©βπ»π¨βπ»β¨
π Wrapping it upβ
Congrats on the journey so far! You've seen Keploy's power, flexed your coding muscles, and had a bit of fun too! Now, go out there and keep exploring, innovating, and creating! Remember, with the right tools and a sprinkle of fun, anything's possible. ππ
Hope this helps you out, if you still have any questions, reach out to us .