102 lines
3.8 KiB
Python
102 lines
3.8 KiB
Python
import json
|
|
from django.test import TestCase
|
|
from django.core.cache import caches
|
|
from utils.slider_captcha import (
|
|
generate_slider_captcha,
|
|
verify_slider_captcha,
|
|
SliderCaptchaError
|
|
)
|
|
|
|
default_cache = caches['default']
|
|
|
|
|
|
class TestGenerateSliderCaptcha(TestCase):
|
|
def test_generate_returns_required_keys(self):
|
|
result = generate_slider_captcha()
|
|
self.assertIn('captcha_key', result)
|
|
self.assertIn('bg_image', result)
|
|
self.assertIn('slider_image', result)
|
|
self.assertIn('y_position', result)
|
|
|
|
def test_generate_returns_valid_captcha_key(self):
|
|
result = generate_slider_captcha()
|
|
captcha_key = result['captcha_key']
|
|
self.assertIsInstance(captcha_key, str)
|
|
self.assertEqual(len(captcha_key), 36)
|
|
|
|
def test_generate_returns_base64_images(self):
|
|
result = generate_slider_captcha()
|
|
self.assertTrue(result['bg_image'].startswith('data:image/png;base64,'))
|
|
self.assertTrue(result['slider_image'].startswith('data:image/png;base64,'))
|
|
|
|
def test_generate_stores_position_in_cache(self):
|
|
result = generate_slider_captcha()
|
|
captcha_key = result['captcha_key']
|
|
cached_data = default_cache.get(f'slider_captcha_{captcha_key}')
|
|
self.assertIsNotNone(cached_data)
|
|
self.assertIn('x_position', cached_data)
|
|
self.assertIn('y_position', cached_data)
|
|
self.assertIn('timestamp', cached_data)
|
|
|
|
|
|
class TestVerifySliderCaptcha(TestCase):
|
|
def setUp(self):
|
|
self.captcha_data = generate_slider_captcha()
|
|
self.captcha_key = self.captcha_data['captcha_key']
|
|
cached = default_cache.get(f'slider_captcha_{self.captcha_key}')
|
|
self.correct_x = cached['x_position']
|
|
|
|
def test_verify_correct_position(self):
|
|
result = verify_slider_captcha(self.captcha_key, self.correct_x)
|
|
self.assertTrue(result)
|
|
|
|
def test_verify_wrong_position(self):
|
|
result = verify_slider_captcha(self.captcha_key, self.correct_x + 50)
|
|
self.assertFalse(result)
|
|
|
|
def test_verify_expired_captcha(self):
|
|
default_cache.delete(f'slider_captcha_{self.captcha_key}')
|
|
with self.assertRaises(SliderCaptchaError):
|
|
verify_slider_captcha(self.captcha_key, self.correct_x)
|
|
|
|
def test_verify_tolerance(self):
|
|
result = verify_slider_captcha(self.captcha_key, self.correct_x + 3)
|
|
self.assertTrue(result)
|
|
|
|
def test_verify_clears_cache_after_success(self):
|
|
verify_slider_captcha(self.captcha_key, self.correct_x)
|
|
cached = default_cache.get(f'slider_captcha_{self.captcha_key}')
|
|
self.assertIsNone(cached)
|
|
|
|
|
|
class TestVerifySliderTrajectory(TestCase):
|
|
def setUp(self):
|
|
self.captcha_data = generate_slider_captcha()
|
|
self.captcha_key = self.captcha_data['captcha_key']
|
|
cached = default_cache.get(f'slider_captcha_{self.captcha_key}')
|
|
self.correct_x = cached['x_position']
|
|
|
|
def test_verify_with_valid_trajectory(self):
|
|
from utils.slider_captcha import verify_slider_trajectory
|
|
|
|
trajectory = [
|
|
{'x': 0, 'y': 150, 't': 0},
|
|
{'x': 50, 'y': 152, 't': 100},
|
|
{'x': 100, 'y': 148, 't': 200},
|
|
{'x': 150, 'y': 151, 't': 300},
|
|
{'x': self.correct_x, 'y': 150, 't': 400},
|
|
]
|
|
result = verify_slider_trajectory(self.captcha_key, self.correct_x, trajectory)
|
|
self.assertTrue(result)
|
|
|
|
def test_verify_with_suspicious_trajectory(self):
|
|
from utils.slider_captcha import verify_slider_trajectory
|
|
|
|
trajectory = [
|
|
{'x': 0, 'y': 150, 't': 0},
|
|
{'x': 100, 'y': 150, 't': 100},
|
|
{'x': 200, 'y': 150, 't': 200},
|
|
]
|
|
result = verify_slider_trajectory(self.captcha_key, self.correct_x, trajectory)
|
|
self.assertFalse(result)
|