Skip to main content
Version: 3.0.0

Sample Movie API with Sanic and MongoDB

Introduction

This application is a simple movie management API built using Python's Sanic framework and MongoDB for data storage. It allows you to perform basic CRUD (Create, Read, Update, Delete) operations on Movie records.

Don’t have Keploy installed yet?

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

👉 Go to Installation Guide

Get Started! 🎬

Clone the app 🧪

git clone https://github.com/keploy/samples-python.git && cd samples-python/sanic-mongo

Download the requirements.txt file and DB setup

Head to the folder of the application and run

pip3 install -r requirements.txt

Open a different terminal and setup your MongoDB through docker

sudo docker network create keploy-network
docker run -p 27017:27017 -d --rm --name mongoDB --net keploy-network mongo

Lights, Camera, Record! 🎥

Capture the test-cases-

keploy record -c "python3 server.py"

You should be able to see this in your terminal

Sample Keploy record sanic mongo

🔥Make some API calls. Postman, Hoppscotch or even curl - take your pick!

Let's make URLs short and sweet:

Generate testcases

To generate testcases we just need to make some API calls.

  1. Make a POST request:
  curl -X "POST" "http://127.0.0.1:8000/add_movie" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json; charset=utf-8' \
-d '{
"name": "Whiplash"
}'
  1. Make a GET request:
  curl -X "GET" "http://127.0.0.1:8000/movies" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json; charset=utf-8'
  1. Make a DELETE request:
  curl -X "DELETE" "http://127.0.0.1:8000/movies" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json; charset=utf-8'

And once you are done, you can stop the recording and 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 tests directory and mocks.yml.

This is an example of what your mocks would look like

version: api.keploy.io/v1beta1
kind: Mongo
name: mock-0
spec:
metadata:
operation: '{ OpQuery flags: [], fullCollectionName: admin.$cmd, numberToSkip: 0, numberToReturn: -1, query: {"ismaster": {"$numberInt":"1"},"helloOk": true,"client": {"driver": {"name": "PyMongo|Motor","version": "4.6.3|3.4.0"},"os": {"type": "Linux","name": "Linux","architecture": "x86_64","version": "5.15.146.1-microsoft-standard-WSL2"},"platform": "CPython 3.10.12.final.0|asyncio"}}, returnFieldsSelector: }'
type: config
requests:
- header:
length: 303
requestId: 1804289383
responseTo: 0
Opcode: 2004
message:
flags: 0
collection_name: admin.$cmd
number_to_skip: 0
number_to_return: -1
query: '{"ismaster":{"$numberInt":"1"},"helloOk":true,"client":{"driver":{"name":"PyMongo|Motor","version":"4.6.3|3.4.0"},"os":{"type":"Linux","name":"Linux","architecture":"x86_64","version":"5.15.146.1-microsoft-standard-WSL2"},"platform":"CPython 3.10.12.final.0|asyncio"}}'
return_fields_selector: ""
responses:
- header:
length: 329
requestId: 13
responseTo: 1804289383
Opcode: 1
message:
response_flags: 8
cursor_id: 0
starting_from: 0
number_returned: 1
documents:
- '{"helloOk":true,"ismaster":true,"topologyVersion":{"processId":{"$oid":"667b1d2066b0c1d16885b016"},"counter":{"$numberLong":"0"}},"maxBsonObjectSize":{"$numberInt":"16777216"},"maxMessageSizeBytes":{"$numberInt":"48000000"},"maxWriteBatchSize":{"$numberInt":"100000"},"localTime":{"$date":{"$numberLong":"1719344783026"}},"logicalSessionTimeoutMinutes":{"$numberInt":"30"},"connectionId":{"$numberInt":"4"},"minWireVersion":{"$numberInt":"0"},"maxWireVersion":{"$numberInt":"21"},"readOnly":false,"ok":{"$numberDouble":"1.0"}}'
read_delay: 560917
created: 1719344783
reqTimestampMock: 2024-06-26T01:16:23.025984506+05:30
resTimestampMock: 2024-06-26T01:16:23.026710262+05:30

Time to put things to the test 🧪:

 keploy test -c "python server.py"

This is how your terminal would look like :

Sample Keploy Test Sanic Mongo

You can experiment with different API calls, modify the database response in mocks.yml, or adjust the request or response in test-x.yml. Then, run the tests again to see the change in response

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.