Skip to content

Latest commit

Β 

History

History
468 lines (379 loc) Β· 13.9 KB

File metadata and controls

468 lines (379 loc) Β· 13.9 KB
id samples-django
title Sample User Data CRUD App (Django)
sidebar_label Django + Postgres
description The following sample app showcases how to use the Django framework and the Keploy Platform.
tags
python
quickstart
samples
examples
tutorial
python-framework
postgres
keyword
Django Framework
Postgres
SQL
Python
API Test generator
Auto case generation

Using Docker Compose 🐳

πŸͺ„ Dive into the world of User CRUD Apps and see how seamlessly Keploy integrated with Django and PostgreSQL. Buckle up, it's gonna be a fun ride! 🎒

import Link from '@docusaurus/Link' import InstallReminder from '@site/src/components/InstallReminder'; import SectionDivider from '@site/src/components/SectionDivider'; import ProductTier from '@site/src/components/ProductTier';

Clone a sample user data CRUD app πŸ§ͺ

git clone https://github.com/keploy/samples-python.git && cd samples-python/django-postgres/django_postgres

We will be using Docker compose to run the application as well as Postgres on Docker container.

Lights, Camera, Record! πŸŽ₯

Start Postgres Instance

Start the Postgres instance using the docker-compose file-

docker compose up -d postgres

Change the database configuration in django_postgres/settings.py file to:

DATABASES = {
  'default': {
      'ENGINE': 'django.db.backends.postgresql',
      'NAME': 'usersdb',
      'USER': 'postgres',
      'PASSWORD': 'postgres',
      'HOST': 'mypostgres',
      'PORT': '5432',
  }
}

Build the app image:

docker build -t django-app:1.0 .

Capture the test-cases-

keploy record -c "docker run -p 8000:8000 --name djangoApp --network keploy-network django-app:1.0"

πŸ”₯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 --location 'http://127.0.0.1:8000/user/' \
--header 'Content-Type: application/json' \
--data-raw '    {
      "name": "Jane Smith",
      "email": "jane.smith@example.com",
      "password": "smith567",
      "website": "www.janesmith.com"
  }'

2. Make a GET request

curl --location 'http://127.0.0.1:8000/user/'

3. Make a PUT request

curl --location --request PUT 'http://127.0.0.1:8000/user/<USER_ID>' \
--header 'Content-Type: application/json' \
--data-raw '    {
      "name": "Jane Smith",
      "email": "smith.jane@example.com",
      "password": "smith567",
      "website": "www.smithjane.com"
  }'

4. Make a GET request

curl --location 'http://127.0.0.1:8000/user/<USER_ID>'

5. Make a DELETE request

 curl --location --request DELETE 'http://127.0.0.1:8000/user/<USER_ID>'

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: GET
    proto_major: 1
    proto_minor: 1
    url: http://127.0.0.1:8000/user/
    header:
      Accept: "*/*"
      Host: 127.0.0.1:8000
      User-Agent: curl/7.81.0
    body: ""
    body_type: ""
    timestamp: 2023-11-05T12:49:22.444698436+05:30
  resp:
    status_code: 200
    header:
      Allow: POST, OPTIONS, GET
      Content-Length: "31"
      Content-Type: application/json
      Cross-Origin-Opener-Policy: same-origin
      Date: Sun, 05 Nov 2023 07:19:22 GMT
      Referrer-Policy: same-origin
      Server: WSGIServer/0.2 CPython/3.10.12
      Vary: Accept, Cookie
      X-Content-Type-Options: nosniff
      X-Frame-Options: DENY
    body: '{"message": "No Users Found!!"}'
    body_type: ""
    status_message: ""
    proto_major: 0
    proto_minor: 0
    timestamp: 2023-11-05T12:49:24.85684599+05:30
  objects: []
  assertions:
    noise:
      - header.Date
      - header.Allow
      - header.Vary
  created: 1699168764
curl: |
  curl --request GET \
  --url http://127.0.0.1:8000/user/ \
  --header 'User-Agent: curl/7.81.0' \
  --header 'Accept: */*' \
  --header 'Host: 127.0.0.1:8000' \

This is how mocks.yml generated would look like:-

  version: api.keploy.io/v1beta2
  kind: Postgres
  name: mocks
  spec:
      metadata: {}
      postgresrequests:
          - header: [Q]
          identifier: ClientRequest
          length: 8
          query:
              string: SELECT "application_user"."id", "application_user"."name", "application_user"."email", "application_user"."password", "application_user"."website" FROM "application_user"
          msg_type: 81
          auth_type: 0
      postgresresponses:
          - header: [T, C, Z]
          identifier: ServerResponse
          length: 8
          authentication_md5_password:
              salt:
                  - 0
                  - 0
                  - 0
                  - 0
          command_complete:
              - command_tag:
                  - 83
                  - 69
                  - 76
                  - 69
                  - 67
                  - 84
                  - 32
                  - 48
          ready_for_query:
              txstatus: 73
          row_description: {fields: [{name: [105, 100], table_oid: 24705, table_attribute_number: 1, data_type_oid: 2950, data_type_size: 16, type_modifier: -1, format: 0}, {name: [110, 97, 109, 101], table_oid: 24705, table_attribute_number: 2, data_type_oid: 1043, data_type_size: -1, type_modifier: 54, format: 0}, {name: [101, 109, 97, 105, 108], table_oid: 24705, table_attribute_number: 3, data_type_oid: 1043, data_type_size: -1, type_modifier: 258, format: 0}, {name: [112, 97, 115, 115, 119, 111, 114, 100], table_oid: 24705, table_attribute_number: 4, data_type_oid: 1043, data_type_size: -1, type_modifier: 54, format: 0}, {name: [119, 101, 98, 115, 105, 116, 101], table_oid: 24705, table_attribute_number: 5, data_type_oid: 1043, data_type_size: -1, type_modifier: 54, format: 0}]}
          msg_type: 90
          auth_type: 0
      reqtimestampmock: 2023-11-05T12:49:22.471612071+05:30
      restimestampmock: 2023-11-05T12:49:22.47169658+05:30

Want to see if everything works as expected?

Run Tests

Time to put things to the test πŸ§ͺ

keploy test -c "docker run -p 8000:8000 --rm --network keploy-network --name djangoApp django-app:1.0" --delay 10

The --delay flag? Oh, that's just giving your app a little breather (in seconds) before the test cases come knocking.

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 🐧

πŸͺ„ Dive into the world of User CRUD Apps and see how seamlessly Keploy integrated with Django and PostgreSQL. Buckle up, it's gonna be a fun ride! 🎒

We'll be running our sample application right on Linux, but just to make things a tad more thrilling, we'll have the database (PostgreSQL) chill on Docker. Ready? Let's get the party started!πŸŽ‰

Clone a sample user data CRUD app πŸ§ͺ

git clone https://github.com/keploy/samples-python.git && cd samples-python/django-postgres/django_postgres

πŸ“Ό Roll the Tape - Recording Time!

Using the docker-compose file we will start our Postgres instance:-

docker compose up -d postgres

Now let's get the app up and running:

#To setup the virtual environment, run:
python3 -m virtualenv venv
source venv/bin/activate

#To install dependencies, run:
pip3 install -r requirements.txt

# To create the required tables in the database, run:
python3 manage.py makemigrations
python3 manage.py migrate

Ready, set, record! Here's how:

sudo -E PATH=$PATH keploy record -c "python3 manage.py runserver"

Keep an eye out for the -c flag! It's the command charm to run the app.

Alright, magician! With the app alive and kicking, let's weave some test cases. The spell? Making some API calls! Postman, Hoppscotch, or the classic curl - pick your wand.

Generate testcases

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

1. Make a POST request

curl --location 'http://127.0.0.1:8000/user/' \
--header 'Content-Type: application/json' \
--data-raw '    {
      "name": "Jane Smith",
      "email": "jane.smith@example.com",
      "password": "smith567",
      "website": "www.janesmith.com"
  }'

2. Make a GET request

curl --location 'http://127.0.0.1:8000/user/'

3. Make a PUT request

curl --location --request PUT 'http://127.0.0.1:8000/user/<USER_ID>' \
--header 'Content-Type: application/json' \
--data-raw '    {
      "name": "Jane Smith",
      "email": "smith.jane@example.com",
      "password": "smith567",
      "website": "www.smithjane.com"
  }'

4. Make a GET request

curl --location 'http://127.0.0.1:8000/user/<USER_ID>'

5. Make a DELETE request

 curl --location --request DELETE 'http://127.0.0.1:8000/user/<USER_ID>'

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: GET
    proto_major: 1
    proto_minor: 1
    url: http://127.0.0.1:8000/user/
    header:
      Accept: "*/*"
      Host: 127.0.0.1:8000
      User-Agent: curl/7.81.0
    body: ""
    body_type: ""
    timestamp: 2023-11-05T12:49:22.444698436+05:30
  resp:
    status_code: 200
    header:
      Allow: POST, OPTIONS, GET
      Content-Length: "31"
      Content-Type: application/json
      Cross-Origin-Opener-Policy: same-origin
      Date: Sun, 05 Nov 2023 07:19:22 GMT
      Referrer-Policy: same-origin
      Server: WSGIServer/0.2 CPython/3.10.12
      Vary: Accept, Cookie
      X-Content-Type-Options: nosniff
      X-Frame-Options: DENY
    body: '{"message": "No Users Found!!"}'
    body_type: ""
    status_message: ""
    proto_major: 0
    proto_minor: 0
    timestamp: 2023-11-05T12:49:24.85684599+05:30
  objects: []
  assertions:
    noise:
      - header.Date
      - header.Allow
      - header.Vary
  created: 1699168764
curl: |
  curl --request GET \
  --url http://127.0.0.1:8000/user/ \
  --header 'User-Agent: curl/7.81.0' \
  --header 'Accept: */*' \
  --header 'Host: 127.0.0.1:8000' \

This is how mocks.yml generated would look like:-

  version: api.keploy.io/v1beta2
  kind: Postgres
  name: mocks
  spec:
      metadata: {}
      postgresrequests:
          - header: [Q]
          identifier: ClientRequest
          length: 8
          query:
              string: SELECT "application_user"."id", "application_user"."name", "application_user"."email", "application_user"."password", "application_user"."website" FROM "application_user"
          msg_type: 81
          auth_type: 0
      postgresresponses:
          - header: [T, C, Z]
          identifier: ServerResponse
          length: 8
          authentication_md5_password:
              salt:
                  - 0
                  - 0
                  - 0
                  - 0
          command_complete:
              - command_tag:
                  - 83
                  - 69
                  - 76
                  - 69
                  - 67
                  - 84
                  - 32
                  - 48
          ready_for_query:
              txstatus: 73
          row_description: {fields: [{name: [105, 100], table_oid: 24705, table_attribute_number: 1, data_type_oid: 2950, data_type_size: 16, type_modifier: -1, format: 0}, {name: [110, 97, 109, 101], table_oid: 24705, table_attribute_number: 2, data_type_oid: 1043, data_type_size: -1, type_modifier: 54, format: 0}, {name: [101, 109, 97, 105, 108], table_oid: 24705, table_attribute_number: 3, data_type_oid: 1043, data_type_size: -1, type_modifier: 258, format: 0}, {name: [112, 97, 115, 115, 119, 111, 114, 100], table_oid: 24705, table_attribute_number: 4, data_type_oid: 1043, data_type_size: -1, type_modifier: 54, format: 0}, {name: [119, 101, 98, 115, 105, 116, 101], table_oid: 24705, table_attribute_number: 5, data_type_oid: 1043, data_type_size: -1, type_modifier: 54, format: 0}]}
          msg_type: 90
          auth_type: 0
      reqtimestampmock: 2023-11-05T12:49:22.471612071+05:30
      restimestampmock: 2023-11-05T12:49:22.47169658+05:30

Want to see if everything works as expected?

Run Tests

Time to put things to the test πŸ§ͺ

sudo -E PATH=$PATH keploy test -c "python3 manage.py runserver" --delay 10

The --delay flag? Oh, that's just giving your app a little breather (in seconds) before the test cases come knocking.

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 .