diff --git a/lib/faker/default/internet.rb b/lib/faker/default/internet.rb index 3ecdcd9838..688b9f8976 100644 --- a/lib/faker/default/internet.rb +++ b/lib/faker/default/internet.rb @@ -63,9 +63,12 @@ def email(name: nil, separators: nil, domain: nil) # Faker::Internet.username(specifier: 20, separators: ['_']) #=> "nikki_sawaynnikki_saway" def username(specifier: nil, separators: %w[. _]) with_locale(:en) do - return shuffle(specifier.scan(/[[:word:]]+/)).join(sample(separators)).downcase if specifier.respond_to?(:scan) - case specifier + when ::String + names = specifier&.gsub("'", '')&.split + shuffled_names = shuffle(names) + + return shuffled_names.join(sample(separators)).downcase when Integer # If specifier is Integer and has large value, Argument error exception is raised to overcome memory full error raise ArgumentError, 'Given argument is too large' if specifier > 10**6 diff --git a/test/faker/default/test_faker_internet.rb b/test/faker/default/test_faker_internet.rb index f8a2a6574c..129640a71a 100644 --- a/test/faker/default/test_faker_internet.rb +++ b/test/faker/default/test_faker_internet.rb @@ -36,6 +36,14 @@ def test_email_name_with_non_permitted_characters end end + def test_email_with_apostrophes + name = "Alexis O'Connell" + + deterministically_verify -> { @tester.email(name: name) } do |result| + assert_email_regex 'Alexis', 'OConnell', result + end + end + def test_email_with_separators deterministically_verify -> { @tester.email(name: 'jane doe', separators: '+') } do |result| name, domain = result.split('@') @@ -83,6 +91,10 @@ def test_username assert_match(/[a-z]+((_|\.)[a-z]+)?/, @tester.username) end + def test_username_with_apostrophes + assert_match(/\A[a-z]+([_\.][a-z]+)*\z/, @tester.username(specifier: "Alexis O'Connell")) + end + def test_user_name_alias assert_equal @tester.method(:username), @tester.method(:user_name) end diff --git a/test/faker/default/test_faker_omniauth.rb b/test/faker/default/test_faker_omniauth.rb index f028e1e4ca..1cfba9126d 100644 --- a/test/faker/default/test_faker_omniauth.rb +++ b/test/faker/default/test_faker_omniauth.rb @@ -20,7 +20,7 @@ def test_omniauth_google assert_equal 'google_oauth2', provider assert_equal 9, auth[:uid].length assert_equal 2, word_count(info[:name]) - assert_match email_regex(info[:first_name], info[:last_name]), info[:email] + assert_email_regex info[:first_name], info[:last_name], info[:email] assert_equal info[:name].split.first, info[:first_name] assert_equal info[:name].split.last, info[:last_name] assert_instance_of String, info[:image] @@ -62,7 +62,7 @@ def test_omniauth_google_with_name assert_instance_of String, info[:name] assert_equal 2, word_count(info[:name]) assert_equal custom_name, info[:name] - assert_match email_regex(first_name, last_name), info[:email] + assert_email_regex first_name, last_name, info[:email] assert_equal first_name, info[:first_name] assert_equal last_name, info[:last_name] assert_equal custom_name, extra_raw_info[:name] @@ -108,7 +108,7 @@ def test_omniauth_facebook assert_equal 'facebook', provider assert_equal 7, uid.length - assert_match email_regex(info[:first_name], info[:last_name]), info[:email] + assert_email_regex info[:first_name], info[:last_name], info[:email] assert_equal 2, word_count(info[:name]) assert_instance_of String, info[:first_name] assert_instance_of String, info[:last_name] @@ -154,7 +154,7 @@ def test_omniauth_facebook_with_name assert_equal last_name, info[:last_name] assert_equal last_name, extra_raw_info[:last_name] - assert_match email_regex(first_name, last_name), info[:email] + assert_email_regex first_name, last_name, info[:email] assert_equal url, extra_raw_info[:link] assert_equal username, extra_raw_info[:username] @@ -308,7 +308,7 @@ def test_omniauth_linkedin assert_equal 'linkedin', auth[:provider] assert_equal 6, auth[:uid].length assert_equal 2, word_count(info[:name]) - # assert_match email_regex(first_name, last_name), info[:email] + assert_email_regex first_name, last_name, info[:email] assert_equal info[:name], info[:nickname] assert_instance_of String, info[:first_name] assert_instance_of String, info[:last_name] @@ -341,7 +341,7 @@ def test_omniauth_linkedin end def test_omniauth_linkedin_with_name - custom_name = 'Happy Gilmore' + custom_name = "Alexis O'Connell" first_name, last_name = custom_name.split auth = @tester.linkedin(name: custom_name) info = auth[:info] @@ -349,7 +349,7 @@ def test_omniauth_linkedin_with_name assert_equal 2, word_count(info[:name]) assert_instance_of String, info[:name] assert_equal custom_name, info[:name] - assert_match email_regex(first_name, last_name), info[:email] + assert_email_regex first_name, last_name, info[:email] assert_equal custom_name, info[:nickname] assert_equal first_name, info[:first_name] assert_equal last_name, info[:last_name] @@ -388,7 +388,7 @@ def test_omniauth_github assert_equal 'github', provider assert_equal 8, uid.length assert_equal uid, extra_raw_info[:id] - assert_match email_regex(info[:first_name], info[:last_name]), info[:email] + assert_email_regex info[:first_name], info[:last_name], info[:email] assert_equal info[:email], extra_raw_info[:email] assert_equal 2, word_count(name) assert_instance_of String, name @@ -438,14 +438,13 @@ def test_omniauth_github_with_name auth = @tester.github(name: custom_name) info = auth[:info] extra_raw_info = auth[:extra][:raw_info] - expected_email_regex = email_regex(info[:first_name], info[:last_name]) assert_equal custom_name, info[:name] assert_equal 2, word_count(info[:name]) assert_instance_of String, info[:name] assert_equal custom_name, extra_raw_info[:name] - assert_match expected_email_regex, info[:email] - assert_match expected_email_regex, extra_raw_info[:email] + assert_email_regex info[:first_name], info[:last_name], info[:email] + assert_email_regex info[:first_name], info[:last_name], extra_raw_info[:email] assert_equal login, info[:nickname] end @@ -482,7 +481,7 @@ def test_omniauth_apple assert_equal 'apple', auth[:provider] assert_instance_of String, auth[:uid] assert_equal 44, auth[:uid].length - assert_match email_regex(first_name, last_name), info[:email] + assert_email_regex first_name, last_name, info[:email] assert_equal auth[:uid], info[:sub] assert_instance_of String, info[:first_name] assert_instance_of String, info[:last_name] @@ -513,7 +512,7 @@ def test_omniauth_auth0 assert_equal 'auth0', auth[:provider] assert_instance_of String, auth[:uid] assert_equal 30, auth[:uid].length - assert_match email_regex(first_name, last_name), info[:email] + assert_email_regex first_name, last_name, info[:email] assert_equal auth[:uid], info[:name] assert_instance_of String, info[:image] assert_instance_of String, info[:nickname] @@ -545,8 +544,4 @@ def boolean?(test) def gender?(test) %w[female male].include?(test) end - - def email_regex(first_name, last_name) - /(#{first_name}(.|_)#{last_name}|#{last_name}(.|_)#{first_name})@(.*).(example|test)/i - end end diff --git a/test/support/assert_email_regex.rb b/test/support/assert_email_regex.rb new file mode 100644 index 0000000000..054906df37 --- /dev/null +++ b/test/support/assert_email_regex.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +def assert_email_regex(first_name, last_name, email) + sanitized_first_name = first_name&.gsub("'", '') + sanitized_last_name = last_name&.gsub("'", '') + + regex = email_regex(sanitized_first_name, sanitized_last_name) + + assert_match(regex, email) +end + +def email_regex(first_name, last_name) + /(#{first_name}([_.])?#{last_name}|#{last_name}([_.])?#{first_name})@(.*)\.(example|test)/i +end diff --git a/test/test_helper.rb b/test/test_helper.rb index fab1465b52..5d615e92e6 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -10,6 +10,7 @@ end require_relative 'support/assert_not_english' +require_relative 'support/assert_email_regex' require 'minitest/autorun' require 'test/unit' require 'rubygems'