Don't make additional SQL query on remembering user (#2335)

* Don't save when remembering user on sign in (WIP)

* Specs for AuthorizationService
This commit is contained in:
Anna Buianova 2019-04-08 17:12:19 +03:00 committed by Ben Halpern
parent f23235eab9
commit 4ef7635ae0
3 changed files with 55 additions and 4 deletions

View file

@ -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")

View file

@ -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)

View file

@ -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