Skip to content

Commit

Permalink
Merge pull request #283 from grrrisu/master
Browse files Browse the repository at this point in the history
create_from provider with block
  • Loading branch information
NoamB committed May 11, 2012
2 parents 90f751d + 45ee1ef commit d09facd
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 1 deletion.
10 changes: 10 additions & 0 deletions lib/sorcery/controller/submodules/external.rb
Expand Up @@ -72,6 +72,10 @@ def access_token(provider)
# #
# And this will cause 'moishe' to be set as the value of :username field. # And this will cause 'moishe' to be set as the value of :username field.
# Note: Be careful. This method skips validations model. # Note: Be careful. This method skips validations model.
# Instead you can pass a block, if the block returns false the user will not be created
#
# create_from(provider) {|user| user.some_check }
#
def create_from(provider) def create_from(provider)
provider = provider.to_sym provider = provider.to_sym
@provider = Config.send(provider) @provider = Config.send(provider)
Expand All @@ -91,11 +95,17 @@ def create_from(provider)
attrs.each do |k,v| attrs.each do |k,v|
@user.send(:"#{k}=", v) @user.send(:"#{k}=", v)
end end

if block_given?
return false unless yield @user
end

@user.save(:validate => false) @user.save(:validate => false)
user_class.sorcery_config.authentications_class.create!({config.authentications_user_id_attribute_name => @user.id, config.provider_attribute_name => provider, config.provider_uid_attribute_name => @user_hash[:uid]}) user_class.sorcery_config.authentications_class.create!({config.authentications_user_id_attribute_name => @user.id, config.provider_attribute_name => provider, config.provider_uid_attribute_name => @user_hash[:uid]})
end end
@user @user
end end

end end
end end
end end
Expand Down
14 changes: 14 additions & 0 deletions spec/rails3/app/controllers/application_controller.rb
Expand Up @@ -186,6 +186,20 @@ def test_create_from_provider
redirect_to "blu", :alert => "Failed!" redirect_to "blu", :alert => "Failed!"
end end
end end

def test_create_from_provider_with_block
provider = params[:provider]
login_from(provider)
@user = create_from(provider) do |user|
# check uniqueness of username
User.where(:username => user.username).empty?
end
if @user
redirect_to "bla", :notice => "Success!"
else
redirect_to "blu", :alert => "Failed!"
end
end


protected protected


Expand Down
14 changes: 14 additions & 0 deletions spec/rails3_mongo_mapper/app/controllers/application_controller.rb
Expand Up @@ -101,6 +101,20 @@ def test_create_from_provider
end end
end end


def test_create_from_provider_with_block
provider = params[:provider]
login_from(provider)
@user = create_from(provider) do |user|
# check uniqueness of username
User.where(:username => user.username).empty?
end
if @user
redirect_to "bla", :notice => "Success!"
else
redirect_to "blu", :alert => "Failed!"
end
end

protected protected




Expand Down
14 changes: 14 additions & 0 deletions spec/rails3_mongoid/app/controllers/application_controller.rb
Expand Up @@ -106,6 +106,20 @@ def test_create_from_provider
end end
end end


def test_create_from_provider_with_block
provider = params[:provider]
login_from(provider)
@user = create_from(provider) do |user|
# check uniqueness of username
User.where(:username => user.username).empty?
end
if @user
redirect_to "bla", :notice => "Success!"
else
redirect_to "blu", :alert => "Failed!"
end
end

protected protected




Expand Down
21 changes: 20 additions & 1 deletion spec/shared_examples/controller_oauth2_shared_examples.rb
Expand Up @@ -32,6 +32,25 @@
end.should change(User, :count).by(1) end.should change(User, :count).by(1)
User.first.username.should == "Noam Ben Ari" User.first.username.should == "Noam Ben Ari"
User.first.created_at.should_not be_nil User.first.created_at.should_not be_nil
end end

describe "with a block" do

before(:each) do
user = User.new(:username => 'Noam Ben Ari')
user.save!(:validate => false)
user.authentications.create(:provider => 'twitter', :uid => '456')
end

it "should not create user" do
sorcery_model_property_set(:authentications_class, Authentication)
sorcery_controller_external_property_set(:facebook, :user_info_mapping, {:username => "name"})
lambda do
# test_create_from_provider_with_block in controller will check for uniqueness of username
get :test_create_from_provider_with_block, :provider => "facebook"
end.should_not change(User, :count)
end

end
end end
end end
18 changes: 18 additions & 0 deletions spec/shared_examples/controller_oauth_shared_examples.rb
Expand Up @@ -33,5 +33,23 @@
User.first.username.should == "coming soon to sorcery gem: twitter and facebook authentication support." User.first.username.should == "coming soon to sorcery gem: twitter and facebook authentication support."
User.first.created_at.should_not be_nil User.first.created_at.should_not be_nil
end end

describe "with a block" do

before(:each) do
user = User.new(:username => 'nbenari')
user.save!(:validate => false)
user.authentications.create(:provider => 'github', :uid => '456')
end

it "should not create user" do
sorcery_model_property_set(:authentications_class, Authentication)
sorcery_controller_external_property_set(:twitter, :user_info_mapping, {:username => "screen_name"})
lambda do
get :test_create_from_provider_with_block, :provider => "twitter"
end.should_not change(User, :count)
end

end
end end
end end

0 comments on commit d09facd

Please sign in to comment.