Search code examples
djangodjango-unittest

How to make a request to local URL as part of automated tests?


I'm writing an automated test in Django to check that a webhook is working on the application. The test sends a bunch of JSON to the webhook and will check that the call has been logged in the database. The problem I'm hitting however is that the test calls the http://localhost URL and the data is thus saved in my local dev database and not in the temporary database created by the test. So I now have no way to check the call has been received.

Whats the right solution for this?

from django.test import TestCase
import requests
from monzo.models import Transaction, RequestLog

class WebhookChecks(TestCase):
    fixtures = ['db.json', ]
    def test_simple_expense(self):

        my_json = '{"type": "transaction.created", REMOVED FOR SECURITY }'

        url = 'http://localhost/some_url/webhook/'
        headers = {'Content-Type': 'application/json'}
        r = requests.post(url, data=my_json, headers=headers)

        if not "200" in str(r):
            print("Something didn't work out. Error: "+str(r))

        self.assertTrue("200" in str(r))



Solution

  • Use Djangos Client with which you can perform requests in your tests.

    Example:

    from django.test import Client
    
    c = Client()
    c.get('/some_url/..')
    

    Another way is to use Djangos LiveServerTestCase.

    You can use self.live_server_url instead of directly writing http://localhost.

    This testcase sets up a live server which listens to localhost.