Search code examples
pythondjangoajaxdjango-testingdjango-tests

Testing Ajax on Django


I'm trying to write a test for an Ajax get a request in Django. Here's how I tried.

from django.test import TestCase
from django.urls import reverse
from .models import ResourcePost, User
from register.models import DonorProfile
from django.utils import timezone

class getResourcePostTests(TestCase):
    def setUp(self):
        ResourcePost.objects.create(
            title="test1",
            description="test",
            quantity=10,
            dropoff_time_1=timezone.now(),
            dropoff_time_2=timezone.now(),
            dropoff_time_3=timezone.now(),
            date_created=timezone.now(),
            donor=createdonor_1(),
            resource_category="FOOD",
            status="AVAILABLE",
        )
        ...
                   
    def test_getResourcePost(self):
        rescource_post_1 = ResourcePost.objects.get(title="test1")
        rescource_post_2 = ResourcePost.objects.get(title="test2")
        rescource_post_3 = ResourcePost.objects.get(title="test3")

        response = self.client.get(reverse('donation:getResourcePosts'))
        self.assertEqual(response.status_code, 200)

Here is my view for the ajax call:

@login_required
def getResourcePost(request):
    user = request.user

    curr_user_rc_1 = user.helpseekerprofile.rc_1
    curr_user_rc_2 = user.helpseekerprofile.rc_2
    curr_user_rc_3 = user.helpseekerprofile.rc_3

    posts = ResourcePost.objects.all()
    passingList = []
    for post in posts:
        if post.date_created >= user.helpseekerprofile.message_timer_before and (
            post.resource_category == curr_user_rc_1
            or post.resource_category == curr_user_rc_2
            or post.resource_category == curr_user_rc_3
        ):
            notiPost = {
                "id": post.id,
                "title": post.title,
                "description": post.description,
            }
            passingList.append(notiPost)
    context = {"resource_posts": passingList}

    return JsonResponse(context)

This is my ajax code:

  $(document).ready(function () {
    setInterval(() => {
      $.ajax({
        type: 'GET',
        url: "{% url 'donation:getResourcePosts' %}",
        success: function (response) {
          $("#display").html('<i class="fas fa-bell"></i>')
          let postCounter = 0
          for (i = 0; i < response.resource_posts.length; i++) {
            postCounter += 1
          }
          if (postCounter > 0) {
            $("#display").append('<span class="message-number">' + postCounter + '</span>')
          }
        },
        error: function (response) {
          console.log("No DATA FOUND")
        }
      })
    }, 1000 * 2)
  })

I keep getting fail because the reponse is 302.

  1. Why am I not getting 200? How can I fix this to get 200?
  2. The variables rescource_post_X come up as variables not used. How do I use them? Should I use them?

Thank you!


Solution

  • The @login_required decorator is redirecting your request to the login page