diff --git a/lib/faker/default/internet.rb b/lib/faker/default/internet.rb index e97bbc3113..fe77f217a9 100644 --- a/lib/faker/default/internet.rb +++ b/lib/faker/default/internet.rb @@ -530,6 +530,35 @@ def uuid '%08x-%04x-%04x-%04x-%04x%08x' % ary # rubocop:disable Style/FormatString end + ## + # Produces a random string of alphabetic characters, (no digits) + # + # @param length [Integer] The length of the string to generate + # @param padding [Boolean] Toggles if a final equal '=' will be added. + # @param urlsafe [Boolean] Toggles charset to '-' and '_' instead of '+' and '/'. + # + # @return [String] + # + # @example + # Faker::Internet.base64 + # #=> "r_hbZ2DSD-ZACzZT" + # @example + # Faker::Internet.base64(length: 4, padding: true, urlsafe: false) + # #=> "x1/R=" + # + # @faker.version 2.11.0 + def base64(length: 16, padding: false, urlsafe: true) + char_range = [ + Array('0'..'9'), + Array('A'..'Z'), + Array('a'..'z'), + urlsafe ? %w[- _] : %w[+ /] + ].flatten + s = Array.new(length) { sample(char_range) }.join + s += '=' if padding + s + end + ## # Produces a randomized hash of internet user details # @example diff --git a/test/faker/default/test_faker_internet.rb b/test/faker/default/test_faker_internet.rb index c9e11533aa..fa49e1bf5f 100644 --- a/test/faker/default/test_faker_internet.rb +++ b/test/faker/default/test_faker_internet.rb @@ -333,6 +333,13 @@ def test_uuid assert_match(/\A\h{8}-\h{4}-4\h{3}-\h{4}-\h{12}\z/, uuid) end + def test_base64 + assert_match(/[[[:alnum:]]\-_]{16}/, @tester.base64) + assert_match(/[[[:alnum:]]\-_]{4}/, @tester.base64(length: 4)) + assert_match(/[[[:alnum:]]\-_]{16}=/, @tester.base64(padding: true)) + assert_match(/[[[:alnum:]]+\/]{16}/, @tester.base64(urlsafe: false)) + end + def test_user_with_args user = @tester.user('username', 'email', 'password') assert user[:username].match(/[a-z]+((_|\.)[a-z]+)?/)