Django - Unit testing a form containing recaptcha

Viewed 826

I am trying to write a unit test for a form containing recaptcha:

My contact view looks like this:

@check_recaptcha
def contact(request):
    if request.method == 'POST':
        f = ContactForm(request.POST)
        if f.is_valid() and request.recaptcha_is_valid:

            f.save(request)
            messages.add_message(request, messages.INFO, "Thanks for submitting feedback!")


            return redirect('contact')
    else:
        f = ContactForm()

    return render(request, 'cms/contact.html', {'form': f})

The decorator check_recaptcha() is defined like this:

def check_recaptcha(view_func):
    @wraps(view_func)
    def _wrapped_view(request, *args, **kwargs):
        request.recaptcha_is_valid = None

        if settings.DEBUG:
            request.recaptcha_is_valid = True
            return view_func(request, *args, **kwargs)

        if request.method == 'POST':
            recaptcha_response = request.POST.get('g-recaptcha-response')
            data = {
                'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
                'response': recaptcha_response
            }
            r = requests.post('https://www.google.com/recaptcha/api/siteverify', data=data)
            result = r.json()
            if result['success']:
                request.recaptcha_is_valid = True
            else:
                request.recaptcha_is_valid = False
                messages.error(request, 'Invalid reCAPTCHA. Please try again.')

        return view_func(request, *args, **kwargs)
    return _wrapped_view

And the code to test the contact form looks like this:

class TestContactForm(TestCase):

    def test_can_send_feedback(self):
        data = {
            "name": "tom",
            "email": "tom@test.com",
            "subject": "A test subject",
            "message": "Hello jerry",
        }

        response = self.client.post(reverse('contact'), data=data)
        self.assertEqual(Feedback.objects.count(), 1)
        self.assertEquals(response.status_code, 302)
        self.assertRedirects(response, reverse('contact'))

The test run perfectly fine if I remove request.recaptcha_is_valid condition in the contact view. Is there a way to get rid of captcha during testing?

2 Answers
Related