From ba3820d861f352ab5e99cd2bf3eef931f32bdef9 Mon Sep 17 00:00:00 2001 From: Franck Trouillez Date: Fri, 6 Dec 2024 19:26:08 +0100 Subject: [PATCH] Ensure Faker::Internet.password method behavior is consistent with length parameters This change allows to make sure that the password respects the length specified in the parameters (i.e., if both `min_length` and `max_length` are set to 1, then the password should be 1 character long) --- lib/faker/default/internet.rb | 15 +++++---------- test/faker/default/test_faker_internet.rb | 14 +++++++++++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/lib/faker/default/internet.rb b/lib/faker/default/internet.rb index 6be04446c5..4fd8e5c5b1 100644 --- a/lib/faker/default/internet.rb +++ b/lib/faker/default/internet.rb @@ -106,7 +106,7 @@ def username(specifier: nil, separators: %w[. _]) # # @param min_length [Integer] The minimum length of the password # @param max_length [Integer] The maximum length of the password - # @param mix_case [Boolean] Toggles if uppercased letters are allowed. If true, at least one will be added. + # @param mix_case [Boolean] Toggles if uppercased and lowercased letters are allowed. If true, at least one of each will be added. Otherwise, only lowercased letters will be used. # @param special_characters [Boolean] Toggles if special characters are allowed. If true, at least one will be added. # # @return [String] @@ -144,21 +144,16 @@ def password(min_length: 8, max_length: 16, mix_case: true, special_characters: target_length = rand(min_length..max_length) - password = [] - character_bag = [] - - # use lower_chars by default and add upper_chars if mix_case lower_chars = self::LLetters - password << sample(lower_chars) - character_bag += lower_chars - digits = ('0'..'9').to_a - password << sample(digits) - character_bag += digits + + password = [] + character_bag = lower_chars + digits if mix_case upper_chars = self::ULetters password << sample(upper_chars) + password << sample(lower_chars) character_bag += upper_chars end diff --git a/test/faker/default/test_faker_internet.rb b/test/faker/default/test_faker_internet.rb index 7eff8e66b9..09eb4266af 100644 --- a/test/faker/default/test_faker_internet.rb +++ b/test/faker/default/test_faker_internet.rb @@ -194,6 +194,12 @@ def test_password_with_integer_arg end end + def test_password_with_specific_integer_arg + (1..32).each do |length| + assert_equal length, @tester.password(min_length: length, max_length: length, mix_case: false).length + end + end + def test_password_max_with_integer_arg (1..32).each do |min_length| max_length = min_length + 4 @@ -241,10 +247,12 @@ def test_password_with_min_length_and_max_length end def test_password_with_same_min_max_length - password = @tester.password(min_length: 5, max_length: 5) + (2..32).each do |length| + password = @tester.password(min_length: length, max_length: length) - assert_match(/\w+/, password) - assert_equal(5, password.length) + assert_match(/\w+/, password) + assert_equal(length, password.length) + end end def test_password_with_max_length_less_than_min_length