diff --git a/app/models/user.rb b/app/models/user.rb index 13968360c..058fec29e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -207,6 +207,11 @@ class User < ApplicationRecord "users-#{id}" end + def set_remember_fields + self.remember_token ||= self.class.remember_token if respond_to?(:remember_token) + self.remember_created_at ||= Time.now.utc + end + def estimate_default_language! identity = identities.find_by(provider: "twitter") if email.end_with?(".jp") diff --git a/app/services/authorization_service.rb b/app/services/authorization_service.rb index 2faea802d..a24c4a769 100644 --- a/app/services/authorization_service.rb +++ b/app/services/authorization_service.rb @@ -59,8 +59,7 @@ class AuthorizationService ) user.name = auth.info.nickname if user.name.blank? user.skip_confirmation! - user.remember_me! - user.remember_me = true + user.set_remember_fields add_social_identity_data(user) user.saw_onboarding = false user.save! @@ -69,8 +68,7 @@ class AuthorizationService end def update_user(user) - user.remember_me! - user.remember_me = true + user.set_remember_fields user.github_username = auth.info.nickname if auth.provider == "github" && auth.info.nickname != user.github_username user.twitter_username = auth.info.nickname if auth.provider == "twitter" && auth.info.nickname != user.twitter_username add_social_identity_data(user) diff --git a/spec/services/authorization_service_spec.rb b/spec/services/authorization_service_spec.rb new file mode 100644 index 000000000..5a3e4f6b7 --- /dev/null +++ b/spec/services/authorization_service_spec.rb @@ -0,0 +1,48 @@ +require "rails_helper" + +RSpec.describe AuthorizationService do + before { mock_auth_hash } + + describe "new user" do + let(:auth) { OmniAuth.config.mock_auth[:github] } + let(:service) { described_class.new(auth) } + + it "creates a new user" do + expect do + service.get_user + end.to change(User, :count).by(1) + end + + it "sets remember_me for the new user" do + user = service.get_user + user.reload + expect(user.remember_me).to be_truthy + expect(user.remember_token).to be_truthy + expect(user.remember_created_at).to be_truthy + end + end + + describe "existing user" do + let(:auth) { OmniAuth.config.mock_auth[:twitter] } + let(:user) { create(:user) } + + before { OmniAuth.config.mock_auth[:twitter].info.email = user.email } + + it "doesn't create a duplicate user" do + service = described_class.new(auth) + expect do + service.get_user + end.not_to change(User, :count) + end + + it "sets remember_me for the existing user" do + user.update_columns(remember_token: nil, remember_created_at: nil) + service = described_class.new(auth) + service.get_user + user.reload + expect(user.remember_me).to be_truthy + expect(user.remember_token).to be_truthy + expect(user.remember_created_at).to be_truthy + end + end +end