def test_help_text_low_strengh(self):
     self.validator = ZxcvbnPasswordValidator()
     self.assertEqual(
         self.validator.get_help_text(),
         "There is no specific rule for a great password, however if your"
         " password is too easy to guess, we will tell you how to make a "
         "better one. We expect a password that cannot be guessed by your"
         " familly or friends.")
 def test_help_text_i18n(self):
     self.validator = ZxcvbnPasswordValidator()
     self.assertEqual(
         self.validator.get_help_text(),
         "Il n'y a pas de règle absolue pour un bon mot de passe, "
         "cependant si votre mot de passe est trop facile à deviner,"
         " nous vous dirons comment l'améliorer. Nous nous attendons à un "
         "mot de passe qui ne ne peut pas être deviné par des aggresseurs "
         "depuis internet.")
 def test_high_strengh(self):
     self.validator = ZxcvbnPasswordValidator()
     self.assertRaises(ValidationError, self.validator.validate, 'password')
     self.assertRaises(ValidationError, self.validator.validate, '123')
     self.assertRaises(ValidationError, self.validator.validate, 'godzilla')
     self.assertIsNone(
         self.validator.validate(
             'Ho, you want a password ? This is a password :@'))
     self.assertIsNone(
         self.validator.validate(
             "123 je m'en vais au bois, 456 cueillir des cerises :)"))
     self.assertIsNone(
         self.validator.validate('A God, an alpha predator, Godzilla.'))
 def test_medium_strengh(self):
     self.validator = ZxcvbnPasswordValidator()
     with self.assertRaises(ValidationError) as error:
         self.assertIsNone(self.validator.validate('p@sswOrd1'))
     self.assertIn("Your password is too guessable",
                   error.exception.messages[0])
     self.assertIn("Predictable substitutions", str(error.exception))
     with self.assertRaises(ValidationError) as error:
         self.assertIsNone(self.validator.validate('123123123123'))
     self.assertIn("Your password is too guessable",
                   error.exception.messages[0])
     self.assertIn('Repeats like "abcabcabc"', str(error.exception))
     with self.assertRaises(ValidationError) as error:
         self.assertIsNone(self.validator.validate('g0dz1ll@'))
     self.assertIn("Your password is too guessable",
                   error.exception.messages[0])
     self.assertIn("This is similar to a commonly used password",
                   str(error.exception))
 def test_strengh_i18n(self):
     self.validator = ZxcvbnPasswordValidator()
     with self.assertRaises(ValidationError) as error:
         self.assertIsNone(self.validator.validate('g0dz1ll@'))
     self.assertIn("Votre mot de passe est trop facile à deviner",
                   error.exception.messages[0])
     self.assertIn("C'est similaire à un mot de passe courant",
                   str(error.exception))
     self.assertIn(
         "Le deviner prendrait moins d'une seconde à un attaquant",
         str(error.exception))
     with self.assertRaises(ValidationError) as error:
         self.assertIsNone(self.validator.validate('g0dze1ll@'))
     self.assertIn("prendrait 12 heures à un attaquant",
                   str(error.exception))
     with self.assertRaises(ValidationError) as error:
         self.assertIsNone(self.validator.validate('g0de1ll@'))
     self.assertIn("prendrait 1 heure à un attaquant", str(error.exception))
 def test_low_strengh(self):
     self.validator = ZxcvbnPasswordValidator()
     self.assertIsNone(self.validator.validate('password'))
     self.assertIsNone(self.validator.validate('123'))
     self.assertIsNone(self.validator.validate('godzilla'))
 def test_settings_not_in_range_low(self):
     with self.assertRaises(ImproperlyConfigured) as error:
         self.validator = ZxcvbnPasswordValidator()
     self.assertIn("need an integer between 0 and 4", str(error.exception))
 def test_settings_not_set(self):
     del settings.PASSWORD_MINIMAL_STRENGH
     self.validator = ZxcvbnPasswordValidator()
     self.assertEqual(self.validator.password_minimal_strengh,
                      DEFAULT_MINIMAL_STRENGH)
class ZxcvbnPasswordValidatorTest(TestCase):
    def setUp(self):
        self.validator = get_default_password_validators()[0]

    def test_settings_not_set(self):
        del settings.PASSWORD_MINIMAL_STRENGH
        self.validator = ZxcvbnPasswordValidator()
        self.assertEqual(self.validator.password_minimal_strengh,
                         DEFAULT_MINIMAL_STRENGH)

    @override_settings(PASSWORD_MINIMAL_STRENGH="4")
    def test_settings_not_int(self):
        with self.assertRaises(ImproperlyConfigured) as error:
            self.validator = ZxcvbnPasswordValidator()
        self.assertIn("need an integer between 0 and 4", str(error.exception))
        self.assertIn("(not a str)", str(error.exception))

    @override_settings(PASSWORD_MINIMAL_STRENGH=5)
    def test_settings_not_in_range_high(self):
        with self.assertRaises(ImproperlyConfigured) as error:
            self.validator = ZxcvbnPasswordValidator()
        self.assertIn("need an integer between 0 and 4", str(error.exception))

    @override_settings(PASSWORD_MINIMAL_STRENGH=-1)
    def test_settings_not_in_range_low(self):
        with self.assertRaises(ImproperlyConfigured) as error:
            self.validator = ZxcvbnPasswordValidator()
        self.assertIn("need an integer between 0 and 4", str(error.exception))

    @override_settings(LANGUAGE_CODE='en-us')
    def test_validate_too_short(self):
        with self.assertRaises(ValidationError) as error:
            self.validator.validate('d@1sR')
        self.assertIn('Add another word or two.', str(error.exception))
        with self.assertRaises(ValidationError) as error:
            self.validator.validate('d5G=}78')
        self.assertIn('Add another word or two.', str(error.exception))

    @override_settings(LANGUAGE_CODE='en-us')
    @override_settings(PASSWORD_MINIMAL_STRENGH=4)
    def test_validate_user_similarity(self):
        user = User.objects.create(
            username='******',
            first_name='Test',
            last_name='Client',
            email='*****@*****.**',
            password='******',
        )
        self.assertIsNone(self.validator.validate('*****@*****.**'))

        with self.assertRaises(ValidationError) as error:
            self.validator.validate('*****@*****.**', user=user)
        self.assertIn("Your password is too guessable",
                      error.exception.messages[0])

    @override_settings(PASSWORD_MINIMAL_STRENGH=0)
    def test_low_strengh(self):
        self.validator = ZxcvbnPasswordValidator()
        self.assertIsNone(self.validator.validate('password'))
        self.assertIsNone(self.validator.validate('123'))
        self.assertIsNone(self.validator.validate('godzilla'))

    @override_settings(PASSWORD_MINIMAL_STRENGH=2)
    @override_settings(LANGUAGE_CODE='en-us')
    def test_medium_strengh(self):
        self.validator = ZxcvbnPasswordValidator()
        with self.assertRaises(ValidationError) as error:
            self.assertIsNone(self.validator.validate('p@sswOrd1'))
        self.assertIn("Your password is too guessable",
                      error.exception.messages[0])
        self.assertIn("Predictable substitutions", str(error.exception))
        with self.assertRaises(ValidationError) as error:
            self.assertIsNone(self.validator.validate('123123123123'))
        self.assertIn("Your password is too guessable",
                      error.exception.messages[0])
        self.assertIn('Repeats like "abcabcabc"', str(error.exception))
        with self.assertRaises(ValidationError) as error:
            self.assertIsNone(self.validator.validate('g0dz1ll@'))
        self.assertIn("Your password is too guessable",
                      error.exception.messages[0])
        self.assertIn("This is similar to a commonly used password",
                      str(error.exception))

    @override_settings(PASSWORD_MINIMAL_STRENGH=4)
    @override_settings(LANGUAGE_CODE='fr')
    def test_strengh_i18n(self):
        self.validator = ZxcvbnPasswordValidator()
        with self.assertRaises(ValidationError) as error:
            self.assertIsNone(self.validator.validate('g0dz1ll@'))
        self.assertIn("Votre mot de passe est trop facile à deviner",
                      error.exception.messages[0])
        self.assertIn("C'est similaire à un mot de passe courant",
                      str(error.exception))
        self.assertIn(
            "Le deviner prendrait moins d'une seconde à un attaquant",
            str(error.exception))
        with self.assertRaises(ValidationError) as error:
            self.assertIsNone(self.validator.validate('g0dze1ll@'))
        self.assertIn("prendrait 12 heures à un attaquant",
                      str(error.exception))
        with self.assertRaises(ValidationError) as error:
            self.assertIsNone(self.validator.validate('g0de1ll@'))
        self.assertIn("prendrait 1 heure à un attaquant", str(error.exception))

    @override_settings(PASSWORD_MINIMAL_STRENGH=4)
    def test_high_strengh(self):
        self.validator = ZxcvbnPasswordValidator()
        self.assertRaises(ValidationError, self.validator.validate, 'password')
        self.assertRaises(ValidationError, self.validator.validate, '123')
        self.assertRaises(ValidationError, self.validator.validate, 'godzilla')
        self.assertIsNone(
            self.validator.validate(
                'Ho, you want a password ? This is a password :@'))
        self.assertIsNone(
            self.validator.validate(
                "123 je m'en vais au bois, 456 cueillir des cerises :)"))
        self.assertIsNone(
            self.validator.validate('A God, an alpha predator, Godzilla.'))

    @override_settings(LANGUAGE_CODE='en-us')
    def test_help_text(self):
        self.assertEqual(
            self.validator.get_help_text(),
            "There is no specific rule for a great password, however if your"
            " password is too easy to guess, we will tell you how to make a "
            "better one. We expect a password that cannot be guessed without"
            " access to our database.")

    @override_settings(LANGUAGE_CODE='en-us')
    @override_settings(PASSWORD_MINIMAL_STRENGH=0)
    def test_help_text_accept_all(self):
        self.validator = ZxcvbnPasswordValidator()
        self.assertEqual(
            self.validator.get_help_text(),
            "We expect nothing: you can use any password you want.")

    @override_settings(LANGUAGE_CODE='en-us')
    @override_settings(PASSWORD_MINIMAL_STRENGH=1)
    def test_help_text_low_strengh(self):
        self.validator = ZxcvbnPasswordValidator()
        self.assertEqual(
            self.validator.get_help_text(),
            "There is no specific rule for a great password, however if your"
            " password is too easy to guess, we will tell you how to make a "
            "better one. We expect a password that cannot be guessed by your"
            " familly or friends.")

    @override_settings(LANGUAGE_CODE='fr')
    @override_settings(PASSWORD_MINIMAL_STRENGH=2)
    def test_help_text_i18n(self):
        self.validator = ZxcvbnPasswordValidator()
        self.assertEqual(
            self.validator.get_help_text(),
            "Il n'y a pas de règle absolue pour un bon mot de passe, "
            "cependant si votre mot de passe est trop facile à deviner,"
            " nous vous dirons comment l'améliorer. Nous nous attendons à un "
            "mot de passe qui ne ne peut pas être deviné par des aggresseurs "
            "depuis internet.")
 def test_help_text_accept_all(self):
     self.validator = ZxcvbnPasswordValidator()
     self.assertEqual(
         self.validator.get_help_text(),
         "We expect nothing: you can use any password you want.")