Files
django-dav-events/dav_auth/tests/test_validators.py
heinzel 98a6fc3ce7
All checks were successful
buildbot/tox Build done.
try to make pylint happy
2022-06-08 00:08:09 +02:00

228 lines
8.5 KiB
Python

# -*- coding: utf-8 -*-
from django.core.exceptions import ValidationError
from django.test import SimpleTestCase
from ..validators import PasswordScoreValidator, CustomWordlistPasswordValidator, CharacterClassPasswordValidator
class PasswordScoreValidatorTestCase(SimpleTestCase):
def test_too_little_score(self):
passwords = [
'', # score = 0
'abcdefghijklmnopq', # score = 17
'Abcdefghijklmnop', # score = 16 + 1
'ABcdefghijklmno', # score = 15 + 2
'AB1defghijklmn', # score = 14 + 2 + 1
'AB12efghijklm', # score = 13 + 2 + 2
'AB12+fghijkl', # score = 12 + 2 + 2 + 1
'AB12+-ghijk', # score = 11 + 2 + 2 + 2
'AB12+-*hij', # score = 10 + 2 + 2 + 3
'AB12+-*hi/', # score = 10 + 2 + 2 + 3
'AB12+-*hi3', # score = 10 + 2 + 2 + 3
'AB12+-*hiC', # score = 10 + 2 + 2 + 3
'abcbbbgbbjklmnopqr', # score = 17
]
validator = PasswordScoreValidator(min_classes=0)
for password in passwords:
try:
validator.validate(password)
except ValidationError as e:
self.assertEqual('too_little_score', e.code)
else:
self.fail('%s: no validation error was raised' % password)
def test_too_few_classes(self):
passwords = [
'', # classes = 0
'abcdefgh', # classes = 1
'abcdef+-', # classes = 2
'abcd12gh', # classes = 2
'abcd12-+', # classes = 3
'abCDefgh', # classes = 2
'abCDef+-', # classes = 3
'abCD12gh', # classes = 3
'ABCD12-+', # classes = 3
]
validator = PasswordScoreValidator(min_score=0, min_classes=4)
for password in passwords:
try:
validator.validate(password)
except ValidationError as e:
self.assertEqual('too_few_classes', e.code)
else:
self.fail('%s: no validation error was raised' % password)
def test_valid(self):
passwords = [
'Abcdefghijklmnopq',
'ABcdefghijklmnop',
'AB1defghijklmno',
'AB12efghijklmn',
'AB12+fghijklm',
'AB12+-ghijkl',
'AB12+-*hijk',
'ab1defghijklmnopq',
'abcd+fghijklmnopq',
'AB1CDEFGHIJKLMNOPQ',
]
validator = PasswordScoreValidator()
for password in passwords:
try:
validator.validate(password)
except ValidationError as e:
self.fail(e)
class CustomWordlistPasswordValidatorTestCase(SimpleTestCase):
def test_invalid(self):
invalid_passwords = [
('passwort', [
'Das Passwort darf nicht die Zeichenfolge \'passwort\' enthalten.',
]),
('abcdDaVefgh', [
'Das Passwort darf nicht die Zeichenfolge \'dav\' enthalten.',
]),
('abcdsektIonefgh', [
'Das Passwort darf nicht die Zeichenfolge \'sektion\' enthalten.',
]),
('alpen12verein34KArlsruhE berge', [
'Das Passwort darf nicht die Zeichenfolge \'karlsruhe\' enthalten.',
'Das Passwort darf nicht die Zeichenfolge \'berge\' enthalten.',
]),
('heinzel@alpenverein-karlsruhe.de', [
'Das Passwort darf nicht die Zeichenfolge \'heinzel\' enthalten.',
'Das Passwort darf nicht die Zeichenfolge \'alpenverein\' enthalten.',
'Das Passwort darf nicht die Zeichenfolge \'karlsruhe\' enthalten.',
]),
]
validator = CustomWordlistPasswordValidator()
for password, expected_errors in invalid_passwords:
try:
validator.validate(password)
except ValidationError as e:
errors = e.messages
for expected_error in expected_errors:
self.assertIn(expected_error, errors)
for error in errors:
self.assertIn(error, expected_errors)
else:
self.fail('%s: no validation error was raised' % password)
def test_valid(self):
passwords = [
'',
'password',
'münchen',
]
validator = CustomWordlistPasswordValidator()
for password in passwords:
try:
validator.validate(password)
except ValidationError as e:
self.fail(e)
class CharacterClassPasswordValidatorTestCase(SimpleTestCase):
def setUp(self):
super().setUp()
self.validator = CharacterClassPasswordValidator()
def test_invalid(self):
invalid_passwords = [
('', [
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Ziffern enthalten.',
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
]),
('A+-', [
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Ziffern enthalten.',
]),
('1234567890*', [
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
]),
('34*/()', [
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
]),
('AA', [
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Ziffern enthalten.',
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
]),
('CD0.,', [
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Ziffern enthalten.',
]),
('EF56', [
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
]),
('8GH?!8', [
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
]),
('bbX', [
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Ziffern enthalten.',
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
]),
('$cd%', [
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Ziffern enthalten.',
]),
('ef90', [
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
]),
('1g=h3~', [
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
]),
('Gi&jH', [
'Das Passwort muss mindestens 2 Ziffern enthalten.',
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
]),
('IkK:i;', [
'Das Passwort muss mindestens 2 Ziffern enthalten.',
]),
('mKn4L8', [
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
]),
]
validator = self.validator
for password, expected_errors in invalid_passwords:
try:
validator.validate(password)
except ValidationError as e:
errors = e.messages
for expected_error in expected_errors:
self.assertIn(expected_error, errors)
for error in errors:
self.assertIn(error, expected_errors)
else:
self.fail('%s: no validation error was raised' % password)
def test_valid(self):
valid_passwords = ['abCD12+-']
validator = self.validator
for password in valid_passwords:
try:
validator.validate(password)
except ValidationError as e:
self.fail(e)