How to test an HTMX Get request?
Asked Answered
M

1

5

I'm working with Django and HTMX. One of my views receives a GET request and returns a whole page. However, if that GET request is from an HTMX element, the view will return a fragment:

from django.shortcuts import render

def view_example(request):
    if request.htmx:
        return render(request, 'fragment.html')
    else:
        return render(request, 'page.html')

In page.html an HTMX element triggers a GET request that expects this fragment. It works - my functional tests see the result of the HTMX request. When I view it in the browser it also works. It doesn't work in my unit tests, though!

I'm trying to test the two different types of responses:

from django.test import TestCase

class TestRequests(TestCase):
    def test_page(self):
        response = self.client.get('/')
        self.assertTemplateUsed(response, 'page.html')

    def test_fragment(self):
        headers = {'Hx-Request': 'true'}
        response = self.client.get('/', **headers)
        self.assertTemplateUsed(response, 'fragment.html')

test_page passes, as expected, but test_fragment fails:

AssertionError: False is not true : Template 'fragment.html' was not a template used to render the response. Actual template(s) used: page.html

How do I simulate an HTMX request so that I can test my fragment logic?

Marianamariand answered 2/6, 2022 at 8:54 Comment(1)
headers = {'HTTP_HX-Request': 'true'} works.Marianamariand
T
6

Django-HTMX's header checking is case sensitive (it's a dict key lookup). You have to set HX-Request header with capital HX:

def test_fragment(self):
    headers = {'HTTP_HX-Request': 'true'}
    response = self.client.get('/', **headers)
    self.assertTemplateUsed(response, 'fragment.html')
Treadmill answered 2/6, 2022 at 9:46 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.