|
2 | 2 | from captcha.conf import settings
|
3 | 3 | from captcha.fields import CaptchaField, CaptchaTextInput
|
4 | 4 | from captcha.models import CaptchaStore, get_safe_now
|
| 5 | +from captcha.backends.db import DBStore |
| 6 | +from captcha.backends.session import SessionStore |
5 | 7 | from django.conf import settings as django_settings
|
6 | 8 | from django.core.exceptions import ImproperlyConfigured
|
7 | 9 | from django.core.urlresolvers import reverse
|
8 | 10 | from django.test import TestCase
|
9 | 11 | from django.utils.translation import ugettext_lazy
|
| 12 | +from django.test.utils import override_settings |
| 13 | +import django |
10 | 14 | import datetime
|
11 | 15 | import json
|
12 | 16 | import re
|
|
27 | 31 |
|
28 | 32 | class CaptchaCase(TestCase):
|
29 | 33 | urls = 'captcha.tests.urls'
|
30 |
| - |
| 34 | + |
31 | 35 | def setUp(self):
|
32 |
| - |
33 | 36 | self.stores = {}
|
34 | 37 | self.__current_settings_output_format = settings.CAPTCHA_OUTPUT_FORMAT
|
35 | 38 | self.__current_settings_dictionary = settings.CAPTCHA_WORDS_DICTIONARY
|
@@ -332,5 +335,100 @@ def test_image_size(self):
|
332 | 335 | settings.CAPTCHA_IMAGE_SIZE = __current_test_mode_setting
|
333 | 336 |
|
334 | 337 |
|
| 338 | +class StoresCase(TestCase): |
| 339 | + urls = 'captcha.tests.urls' |
| 340 | + |
| 341 | + # store tests |
| 342 | + def test_db_store(self): |
| 343 | + store = DBStore() |
| 344 | + key = store.generate_key() |
| 345 | + record = store.get(hashkey=key) |
| 346 | + self.assertEqual(record['hashkey'], key) |
| 347 | + self.assertNotEqual(record._captcha.get('challenge'), None) |
| 348 | + self.assertNotEqual(record._captcha.get('response'), None) |
| 349 | + record.delete() |
| 350 | + try: |
| 351 | + store.get(hashkey=key) |
| 352 | + self.fail('Record deletion error') |
| 353 | + except: |
| 354 | + pass |
| 355 | + |
| 356 | + key = store.generate_key() |
| 357 | + cap = CaptchaStore.objects.get(hashkey=key) |
| 358 | + cap.expiration = get_safe_now() - datetime.timedelta(minutes=1) |
| 359 | + cap.save() |
| 360 | + try: |
| 361 | + store.get(hashkey=key, allow_expired=False) |
| 362 | + self.fail() |
| 363 | + except: |
| 364 | + pass |
| 365 | + |
| 366 | + store.remove_expired() |
| 367 | + try: |
| 368 | + store.get(hashkey=key) |
| 369 | + self.fail('remove_expired failed') |
| 370 | + except: |
| 371 | + pass |
| 372 | + |
| 373 | + def test_session_store(self): |
| 374 | + store = SessionStore() |
| 375 | + key = store.generate_key() |
| 376 | + record = store.get(hashkey=key) |
| 377 | + self.assertEqual(record.session_key, key) |
| 378 | + self.assertNotEqual(record.get('challenge'), None) |
| 379 | + self.assertNotEqual(record.get('response'), None) |
| 380 | + record.delete() |
| 381 | + try: |
| 382 | + store.get(hashkey=key) |
| 383 | + self.fail('Record deletion error') |
| 384 | + except: |
| 385 | + pass |
| 386 | + |
| 387 | + key = store.generate_key() |
| 388 | + cap = store.get(hashkey=key) |
| 389 | + cap.set_expiry(-1 * 60) |
| 390 | + cap.save() |
| 391 | + try: |
| 392 | + store.get(hashkey=key, allow_expired=False) |
| 393 | + self.fail() |
| 394 | + except: |
| 395 | + pass |
| 396 | + |
| 397 | + if not django.get_version() < '1.5': |
| 398 | + # django lower than 1.5 can't remove expired sessions |
| 399 | + store.remove_expired() |
| 400 | + try: |
| 401 | + store.get(hashkey=key) |
| 402 | + self.fail('remove_expired failed') |
| 403 | + except: |
| 404 | + pass |
| 405 | + |
| 406 | + # view tests |
| 407 | + def testFormSubmit(self): |
| 408 | + settings.CAPTCHA_STORE='SESSION' |
| 409 | + r = self.client.get(reverse('captcha-test')) |
| 410 | + self.assertEqual(r.status_code, 200) |
| 411 | + |
| 412 | + store = SessionStore() |
| 413 | + hash_ = re.findall(r'value="([0-9a-z]+)"', str(r.content))[0] |
| 414 | + response = store.get(hashkey=hash_)['response'] |
| 415 | + |
| 416 | + r = self. client. post( reverse( 'captcha-test'), dict( captcha_0=hash_, captcha_1=response, subject='xxx', sender='[email protected]')) |
| 417 | + self.assertEqual(r.status_code, 200) |
| 418 | + self.assertTrue(str(r.content).find('Form validated') > 0) |
| 419 | + |
| 420 | + r = self. client. post( reverse( 'captcha-test'), dict( captcha_0=hash_, captcha_1=response, subject='xxx', sender='[email protected]')) |
| 421 | + self.assertEqual(r.status_code, 200) |
| 422 | + self.assertFalse(str(r.content).find('Form validated') > 0) |
| 423 | + |
| 424 | + def testWrongSubmit(self): |
| 425 | + settings.CAPTCHA_STORE='SESSION' |
| 426 | + for urlname in ('captcha-test', 'captcha-test-model-form'): |
| 427 | + r = self.client.get(reverse(urlname)) |
| 428 | + self.assertEqual(r.status_code, 200) |
| 429 | + r = self. client. post( reverse( urlname), dict( captcha_0='abc', captcha_1='wrong response', subject='xxx', sender='[email protected]')) |
| 430 | + self.assertFormError(r, 'form', 'captcha', ugettext_lazy('Invalid CAPTCHA')) |
| 431 | + |
| 432 | + |
335 | 433 | def trivial_challenge():
|
336 | 434 | return 'trivial', 'trivial'
|
0 commit comments