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?