sorcery 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sorcery might be problematic. Click here for more details.

Files changed (65) hide show
  1. data/Gemfile +4 -2
  2. data/Gemfile.lock +16 -13
  3. data/README.rdoc +28 -27
  4. data/Rakefile +5 -0
  5. data/VERSION +1 -1
  6. data/lib/sorcery.rb +12 -0
  7. data/lib/sorcery/controller.rb +29 -17
  8. data/lib/sorcery/controller/submodules/activity_logging.rb +20 -7
  9. data/lib/sorcery/controller/submodules/brute_force_protection.rb +9 -2
  10. data/lib/sorcery/controller/submodules/http_basic_auth.rb +8 -3
  11. data/lib/sorcery/controller/submodules/oauth.rb +95 -0
  12. data/lib/sorcery/controller/submodules/oauth/oauth1.rb +25 -0
  13. data/lib/sorcery/controller/submodules/oauth/oauth2.rb +23 -0
  14. data/lib/sorcery/controller/submodules/oauth/providers/facebook.rb +64 -0
  15. data/lib/sorcery/controller/submodules/oauth/providers/twitter.rb +61 -0
  16. data/lib/sorcery/controller/submodules/remember_me.rb +14 -5
  17. data/lib/sorcery/controller/submodules/session_timeout.rb +6 -1
  18. data/lib/sorcery/engine.rb +9 -2
  19. data/lib/sorcery/model.rb +10 -3
  20. data/lib/sorcery/model/submodules/activity_logging.rb +12 -7
  21. data/lib/sorcery/model/submodules/brute_force_protection.rb +11 -4
  22. data/lib/sorcery/model/submodules/oauth.rb +53 -0
  23. data/lib/sorcery/model/submodules/remember_me.rb +5 -3
  24. data/lib/sorcery/model/submodules/reset_password.rb +16 -13
  25. data/lib/sorcery/model/submodules/user_activation.rb +38 -19
  26. data/lib/sorcery/model/temporary_token.rb +22 -0
  27. data/lib/sorcery/test_helpers.rb +84 -0
  28. data/sorcery.gemspec +69 -40
  29. data/spec/Gemfile +3 -2
  30. data/spec/Gemfile.lock +15 -2
  31. data/spec/rails3/app_root/.rspec +1 -0
  32. data/spec/rails3/{Gemfile → app_root/Gemfile} +5 -3
  33. data/spec/rails3/{Gemfile.lock → app_root/Gemfile.lock} +25 -2
  34. data/spec/rails3/{Rakefile → app_root/Rakefile} +0 -0
  35. data/spec/rails3/app_root/app/controllers/application_controller.rb +42 -1
  36. data/spec/rails3/app_root/app/models/authentication.rb +3 -0
  37. data/spec/rails3/app_root/app/models/user.rb +4 -1
  38. data/spec/rails3/app_root/config/application.rb +1 -3
  39. data/spec/rails3/app_root/config/routes.rb +1 -10
  40. data/spec/rails3/app_root/db/migrate/activation/20101224223622_add_activation_to_users.rb +6 -4
  41. data/spec/rails3/app_root/db/migrate/core/20101224223620_create_users.rb +4 -4
  42. data/spec/rails3/app_root/db/migrate/oauth/20101224223628_create_authentications.rb +14 -0
  43. data/spec/rails3/{controller_activity_logging_spec.rb → app_root/spec/controller_activity_logging_spec.rb} +13 -13
  44. data/spec/rails3/{controller_brute_force_protection_spec.rb → app_root/spec/controller_brute_force_protection_spec.rb} +16 -6
  45. data/spec/rails3/{controller_http_basic_auth_spec.rb → app_root/spec/controller_http_basic_auth_spec.rb} +3 -3
  46. data/spec/rails3/app_root/spec/controller_oauth2_spec.rb +117 -0
  47. data/spec/rails3/app_root/spec/controller_oauth_spec.rb +117 -0
  48. data/spec/rails3/{controller_remember_me_spec.rb → app_root/spec/controller_remember_me_spec.rb} +4 -4
  49. data/spec/rails3/{controller_session_timeout_spec.rb → app_root/spec/controller_session_timeout_spec.rb} +4 -4
  50. data/spec/rails3/{controller_spec.rb → app_root/spec/controller_spec.rb} +20 -13
  51. data/spec/rails3/app_root/spec/spec_helper.orig.rb +27 -0
  52. data/spec/rails3/app_root/spec/spec_helper.rb +61 -0
  53. data/spec/rails3/{user_activation_spec.rb → app_root/spec/user_activation_spec.rb} +60 -20
  54. data/spec/rails3/{user_activity_logging_spec.rb → app_root/spec/user_activity_logging_spec.rb} +4 -4
  55. data/spec/rails3/{user_brute_force_protection_spec.rb → app_root/spec/user_brute_force_protection_spec.rb} +7 -7
  56. data/spec/rails3/app_root/spec/user_oauth_spec.rb +39 -0
  57. data/spec/rails3/{user_remember_me_spec.rb → app_root/spec/user_remember_me_spec.rb} +4 -4
  58. data/spec/rails3/{user_reset_password_spec.rb → app_root/spec/user_reset_password_spec.rb} +21 -41
  59. data/spec/rails3/{user_spec.rb → app_root/spec/user_spec.rb} +68 -38
  60. metadata +127 -58
  61. data/spec/rails3/app_root/test/fixtures/users.yml +0 -9
  62. data/spec/rails3/app_root/test/performance/browsing_test.rb +0 -9
  63. data/spec/rails3/app_root/test/test_helper.rb +0 -13
  64. data/spec/rails3/app_root/test/unit/user_test.rb +0 -8
  65. data/spec/rails3/spec_helper.rb +0 -135
@@ -38,9 +38,7 @@ module AppRoot
38
38
 
39
39
  # Configure sensitive parameters which will be filtered from the log file.
40
40
  config.filter_parameters += [:password]
41
-
42
- config.root = File.expand_path('../..', __FILE__)
43
-
41
+
44
42
  config.action_mailer.delivery_method = :test
45
43
 
46
44
  config.active_support.deprecation = :stderr
@@ -1,14 +1,5 @@
1
1
  AppRoot::Application.routes.draw do
2
2
  root :to => "application#index"
3
- match '/test_login', :to => "application#test_login"
4
- match '/test_logout', :to => "application#test_logout"
5
- match '/some_action', :to => "application#some_action"
6
- match '/test_logout_with_remember', :to => "application#test_logout_with_remember"
7
- match '/test_login_with_remember', :to => 'application#test_login_with_remember'
8
- match '/test_login_with_remember_in_login', :to => 'application#test_login_with_remember_in_login'
9
- match '/test_login_from_cookie', :to => 'application#test_login_from_cookie'
10
- match '/test_should_be_logged_in', :to => 'application#test_should_be_logged_in'
11
- match '/test_http_basic_auth', :to => 'application#test_http_basic_auth'
12
3
  # The priority is based upon order of creation:
13
4
  # first created -> highest priority.
14
5
 
@@ -64,5 +55,5 @@ AppRoot::Application.routes.draw do
64
55
 
65
56
  # This is a legacy wild controller route that's not recommended for RESTful applications.
66
57
  # Note: This route will make all actions in every controller accessible via GET requests.
67
- # match ':controller(/:action(/:id(.:format)))'
58
+ match ':controller(/:action(/:id(.:format)))'
68
59
  end
@@ -1,15 +1,17 @@
1
1
  class AddActivationToUsers < ActiveRecord::Migration
2
2
  def self.up
3
3
  add_column :users, :activation_state, :string, :default => nil
4
- add_column :users, :activation_code, :string, :default => nil
4
+ add_column :users, :activation_token, :string, :default => nil
5
+ add_column :users, :activation_token_expires_at, :datetime, :default => nil
5
6
 
6
- add_index :users, :activation_code
7
+ add_index :users, :activation_token
7
8
  end
8
9
 
9
10
  def self.down
10
- remove_index :users, :activation_code
11
+ remove_index :users, :activation_token
11
12
 
12
- remove_column :users, :activation_code
13
+ remove_column :users, :activation_token_expires_at
14
+ remove_column :users, :activation_token
13
15
  remove_column :users, :activation_state
14
16
  end
15
17
  end
@@ -1,10 +1,10 @@
1
1
  class CreateUsers < ActiveRecord::Migration
2
2
  def self.up
3
3
  create_table :users do |t|
4
- t.string :username
5
- t.string :email, :null => false
6
- t.string :crypted_password
7
- t.string :salt
4
+ t.string :username, :null => false
5
+ t.string :email, :default => nil
6
+ t.string :crypted_password, :default => nil
7
+ t.string :salt, :default => nil
8
8
 
9
9
  t.timestamps
10
10
  end
@@ -0,0 +1,14 @@
1
+ class CreateAuthentications < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :authentications do |t|
4
+ t.integer :user_id, :null => false
5
+ t.string :provider, :uid, :null => false
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :authentications
13
+ end
14
+ end
@@ -12,7 +12,7 @@ describe ApplicationController do
12
12
  # ----------------- ACTIVITY LOGGING -----------------------
13
13
  describe ApplicationController, "with activity logging features" do
14
14
  before(:all) do
15
- plugin_model_configure([:activity_logging])
15
+ sorcery_reload!([:activity_logging])
16
16
  end
17
17
 
18
18
  before(:each) do
@@ -23,12 +23,12 @@ describe ApplicationController do
23
23
  User.delete_all
24
24
  end
25
25
 
26
- it "should respond to 'logged_in_users'" do
27
- subject.should respond_to(:logged_in_users)
26
+ it "should respond to 'current_users'" do
27
+ subject.should respond_to(:current_users)
28
28
  end
29
29
 
30
- it "'logged_in_users' should be empty when no users are logged in" do
31
- subject.logged_in_users.size.should == 0
30
+ it "'current_users' should be empty when no users are logged in" do
31
+ subject.current_users.size.should == 0
32
32
  end
33
33
 
34
34
  it "should log login time on login" do
@@ -56,14 +56,14 @@ describe ApplicationController do
56
56
  User.first.last_activity_at.to_s(:db).should <= (now+2).to_s(:db)
57
57
  end
58
58
 
59
- it "'logged_in_users' should hold the user object when 1 user is logged in" do
59
+ it "'current_users' should hold the user object when 1 user is logged in" do
60
60
  login_user
61
61
  get :some_action
62
- subject.logged_in_users.size.should == 1
63
- subject.logged_in_users[0].should == @user
62
+ subject.current_users.size.should == 1
63
+ subject.current_users[0].should == @user
64
64
  end
65
65
 
66
- it "'logged_in_users' should show all logged_in_users, whether they have logged out before or not." do
66
+ it "'current_users' should show all current_users, whether they have logged out before or not." do
67
67
  user1 = create_new_user({:username => 'gizmo1', :email => "bla1@bla.com", :password => 'secret1'})
68
68
  login_user(user1)
69
69
  get :some_action
@@ -75,10 +75,10 @@ describe ApplicationController do
75
75
  user3 = create_new_user({:username => 'gizmo3', :email => "bla3@bla.com", :password => 'secret3'})
76
76
  login_user(user3)
77
77
  get :some_action
78
- subject.logged_in_users.size.should == 3
79
- subject.logged_in_users[0].should == user1
80
- subject.logged_in_users[1].should == user2
81
- subject.logged_in_users[2].should == user3
78
+ subject.current_users.size.should == 3
79
+ subject.current_users[0].should == user1
80
+ subject.current_users[1].should == user2
81
+ subject.current_users[2].should == user3
82
82
  end
83
83
  end
84
84
  end
@@ -12,13 +12,13 @@ describe ApplicationController do
12
12
  # ----------------- SESSION TIMEOUT -----------------------
13
13
  describe ApplicationController, "with brute force protection features" do
14
14
  before(:all) do
15
- plugin_model_configure([:brute_force_protection])
15
+ sorcery_reload!([:brute_force_protection])
16
16
  create_new_user
17
17
  end
18
18
 
19
19
  after(:each) do
20
20
  Sorcery::Controller::Config.reset!
21
- plugin_set_controller_config_property(:user_class, User)
21
+ sorcery_controller_property_set(:user_class, User)
22
22
  end
23
23
 
24
24
  it "should count login retries" do
@@ -27,7 +27,7 @@ describe ApplicationController do
27
27
  end
28
28
 
29
29
  it "should reset the counter on a good login" do
30
- plugin_set_model_config_property(:consecutive_login_retries_amount_allowed, 5)
30
+ sorcery_model_property_set(:consecutive_login_retries_amount_limit, 5)
31
31
  3.times {get :test_login, :username => 'gizmo', :password => 'blabla'}
32
32
  get :test_login, :username => 'gizmo', :password => 'secret'
33
33
  User.find_by_username('gizmo').failed_logins_count.should == 0
@@ -35,14 +35,14 @@ describe ApplicationController do
35
35
 
36
36
  it "should lock user when number of retries reached the limit" do
37
37
  User.find_by_username('gizmo').lock_expires_at.should be_nil
38
- plugin_set_model_config_property(:consecutive_login_retries_amount_allowed, 1)
38
+ sorcery_model_property_set(:consecutive_login_retries_amount_limit, 1)
39
39
  get :test_login, :username => 'gizmo', :password => 'blabla'
40
40
  User.find_by_username('gizmo').lock_expires_at.should_not be_nil
41
41
  end
42
42
 
43
43
  it "should unlock after lock time period passes" do
44
- plugin_set_model_config_property(:consecutive_login_retries_amount_allowed, 2)
45
- plugin_set_model_config_property(:login_lock_time_period, 0.2)
44
+ sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
45
+ sorcery_model_property_set(:login_lock_time_period, 0.2)
46
46
  get :test_login, :username => 'gizmo', :password => 'blabla'
47
47
  get :test_login, :username => 'gizmo', :password => 'blabla'
48
48
  User.find_by_username('gizmo').lock_expires_at.should_not be_nil
@@ -51,5 +51,15 @@ describe ApplicationController do
51
51
  User.find_by_username('gizmo').lock_expires_at.should be_nil
52
52
  end
53
53
 
54
+ it "should not unlock if time period is 0 (permanent lock)" do
55
+ sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
56
+ sorcery_model_property_set(:login_lock_time_period, 0)
57
+ get :test_login, :username => 'gizmo', :password => 'blabla'
58
+ get :test_login, :username => 'gizmo', :password => 'blabla'
59
+ unlock_date = User.find_by_username('gizmo').lock_expires_at
60
+ sleep 1
61
+ get :test_login, :username => 'gizmo', :password => 'blabla'
62
+ User.find_by_username('gizmo').lock_expires_at.to_s.should == unlock_date.to_s
63
+ end
54
64
  end
55
65
  end
@@ -5,7 +5,7 @@ describe ApplicationController do
5
5
  # ----------------- HTTP BASIC AUTH -----------------------
6
6
  describe ApplicationController, "with http basic auth features" do
7
7
  before(:all) do
8
- plugin_model_configure([:http_basic_auth])
8
+ sorcery_reload!([:http_basic_auth])
9
9
  create_new_user
10
10
  end
11
11
 
@@ -31,12 +31,12 @@ describe ApplicationController do
31
31
  end
32
32
 
33
33
  it "should allow configuration option 'controller_to_realm_map'" do
34
- plugin_set_controller_config_property(:controller_to_realm_map, {"1" => "2"})
34
+ sorcery_controller_property_set(:controller_to_realm_map, {"1" => "2"})
35
35
  Sorcery::Controller::Config.controller_to_realm_map.should == {"1" => "2"}
36
36
  end
37
37
 
38
38
  it "should display the correct realm name configured for the controller" do
39
- plugin_set_controller_config_property(:controller_to_realm_map, {"application" => "Salad"})
39
+ sorcery_controller_property_set(:controller_to_realm_map, {"application" => "Salad"})
40
40
  get :test_http_basic_auth
41
41
  response.headers["WWW-Authenticate"].should == "Basic realm=\"Salad\""
42
42
  end
@@ -0,0 +1,117 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ def stub_all_oauth2_requests!
4
+ @client = OAuth2::Client.new("key","secret", :site => "http://myapi.com")
5
+ OAuth2::Client.stub!(:new).and_return(@client)
6
+ @acc_token = OAuth2::AccessToken.new(@client, "", "asd", nil, {})
7
+ @webby = @client.web_server
8
+ OAuth2::Strategy::WebServer.stub!(:new).and_return(@webby)
9
+ @webby.stub!(:get_access_token).and_return(@acc_token)
10
+ @acc_token.stub!(:get).and_return({"id"=>"123", "name"=>"Noam Ben Ari", "first_name"=>"Noam", "last_name"=>"Ben Ari", "link"=>"http://www.facebook.com/nbenari1", "hometown"=>{"id"=>"110619208966868", "name"=>"Haifa, Israel"}, "location"=>{"id"=>"106906559341067", "name"=>"Pardes Hanah, Hefa, Israel"}, "bio"=>"I'm a new daddy, and enjoying it!", "gender"=>"male", "email"=>"nbenari@gmail.com", "timezone"=>2, "locale"=>"en_US", "languages"=>[{"id"=>"108405449189952", "name"=>"Hebrew"}, {"id"=>"106059522759137", "name"=>"English"}, {"id"=>"112624162082677", "name"=>"Russian"}], "verified"=>true, "updated_time"=>"2011-02-16T20:59:38+0000"}.to_json)
11
+ end
12
+
13
+ describe ApplicationController do
14
+ before(:all) do
15
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/oauth")
16
+ sorcery_reload!([:oauth])
17
+ sorcery_controller_property_set(:oauth_providers, [:facebook])
18
+ sorcery_controller_oauth_property_set(:facebook, :key, "eYVNBjBDi33aa9GkA3w")
19
+ sorcery_controller_oauth_property_set(:facebook, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
20
+ sorcery_controller_oauth_property_set(:facebook, :callback_url, "http://blabla.com")
21
+ end
22
+
23
+ after(:all) do
24
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/oauth")
25
+ end
26
+ # ----------------- OAuth -----------------------
27
+ describe ApplicationController, "with OAuth features" do
28
+
29
+ before(:each) do
30
+ stub_all_oauth2_requests!
31
+ end
32
+
33
+ after(:each) do
34
+ User.delete_all
35
+ end
36
+
37
+ it "auth_at_provider redirects correctly" do
38
+ create_new_user
39
+ get :auth_at_provider_test2
40
+ response.should be_a_redirect
41
+ response.should redirect_to("http://myapi.com/oauth/authorize?client_id=key&redirect_uri=http%3A%2F%2Fblabla.com&scope=email%2Coffline_access&type=web_server")
42
+ end
43
+
44
+ it "'login_from_access_token' logins if user exists" do
45
+ sorcery_model_property_set(:authentications_class, Authentication)
46
+ create_new_external_user(:facebook)
47
+ get :test_login_from_access_token2
48
+ flash[:notice].should == "Success!"
49
+ end
50
+
51
+ it "'login_from_access_token' fails if user doesn't exist" do
52
+ sorcery_model_property_set(:authentications_class, Authentication)
53
+ create_new_user
54
+ get :test_login_from_access_token2
55
+ flash[:alert].should == "Failed!"
56
+ end
57
+ end
58
+
59
+ describe ApplicationController, "'create_from_provider!'" do
60
+ before(:each) do
61
+ stub_all_oauth2_requests!
62
+ User.delete_all
63
+ end
64
+
65
+ it "should create a new user" do
66
+ sorcery_controller_property_set(:authentications_class, Authentication)
67
+ sorcery_controller_oauth_property_set(:facebook, :user_info_mapping, {:username => "name"})
68
+ lambda do
69
+ get :test_create_from_provider, :provider => "facebook"
70
+ end.should change(User, :count).by(1)
71
+ User.first.username.should == "Noam Ben Ari"
72
+ end
73
+
74
+ it "should support nested attributes" do
75
+ sorcery_controller_property_set(:authentications_class, Authentication)
76
+ sorcery_controller_oauth_property_set(:facebook, :user_info_mapping, {:username => "hometown/name"})
77
+ lambda do
78
+ get :test_create_from_provider, :provider => "facebook"
79
+ end.should change(User, :count).by(1)
80
+ User.first.username.should == "Haifa, Israel"
81
+ end
82
+ end
83
+
84
+ describe ApplicationController, "OAuth with User Activation features" do
85
+ before(:all) do
86
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
87
+ sorcery_reload!([:user_activation,:oauth], :user_activation_mailer => ::SorceryMailer)
88
+ sorcery_controller_property_set(:oauth_providers, [:facebook])
89
+ sorcery_controller_oauth_property_set(:facebook, :key, "eYVNBjBDi33aa9GkA3w")
90
+ sorcery_controller_oauth_property_set(:facebook, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
91
+ sorcery_controller_oauth_property_set(:facebook, :callback_url, "http://blabla.com")
92
+ end
93
+
94
+ after(:all) do
95
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/activation")
96
+ end
97
+
98
+ after(:each) do
99
+ User.delete_all
100
+ end
101
+
102
+ it "should not send activation email to external users" do
103
+ old_size = ActionMailer::Base.deliveries.size
104
+ create_new_external_user(:facebook)
105
+ ActionMailer::Base.deliveries.size.should == old_size
106
+ end
107
+
108
+ it "should not send external users an activation success email" do
109
+ sorcery_model_property_set(:activation_success_email_method_name, nil)
110
+ create_new_external_user(:facebook)
111
+ old_size = ActionMailer::Base.deliveries.size
112
+ @user.activate!
113
+ ActionMailer::Base.deliveries.size.should == old_size
114
+ end
115
+ end
116
+
117
+ end
@@ -0,0 +1,117 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'ostruct'
3
+
4
+ def stub_all_oauth_requests!
5
+ @consumer = OAuth::Consumer.new("key","secret", :site => "http://myapi.com")
6
+ OAuth::Consumer.stub!(:new).and_return(@consumer)
7
+
8
+ @req_token = OAuth::RequestToken.new(@consumer)
9
+ @consumer.stub!(:get_request_token).and_return(@req_token)
10
+ @acc_token = OAuth::AccessToken.new(@consumer)
11
+ @req_token.stub!(:get_access_token).and_return(@acc_token)
12
+ session[:request_token] = @req_token
13
+ response = OpenStruct.new()
14
+ response.body = {"following"=>false, "listed_count"=>0, "profile_link_color"=>"0084B4", "profile_image_url"=>"http://a1.twimg.com/profile_images/536178575/noamb_normal.jpg", "description"=>"Programmer/Heavy Metal Fan/New Father", "status"=>{"text"=>"coming soon to sorcery gem: twitter and facebook authentication support.", "truncated"=>false, "favorited"=>false, "source"=>"web", "geo"=>nil, "in_reply_to_screen_name"=>nil, "in_reply_to_user_id"=>nil, "in_reply_to_status_id_str"=>nil, "created_at"=>"Sun Mar 06 23:01:12 +0000 2011", "contributors"=>nil, "place"=>nil, "retweeted"=>false, "in_reply_to_status_id"=>nil, "in_reply_to_user_id_str"=>nil, "coordinates"=>nil, "retweet_count"=>0, "id"=>44533012284706816, "id_str"=>"44533012284706816"}, "show_all_inline_media"=>false, "geo_enabled"=>true, "profile_sidebar_border_color"=>"a8c7f7", "url"=>nil, "followers_count"=>10, "screen_name"=>"nbenari", "profile_use_background_image"=>true, "location"=>"Israel", "statuses_count"=>25, "profile_background_color"=>"022330", "lang"=>"en", "verified"=>false, "notifications"=>false, "profile_background_image_url"=>"http://a3.twimg.com/profile_background_images/104087198/04042010339.jpg", "favourites_count"=>5, "created_at"=>"Fri Nov 20 21:58:19 +0000 2009", "is_translator"=>false, "contributors_enabled"=>false, "protected"=>false, "follow_request_sent"=>false, "time_zone"=>"Greenland", "profile_text_color"=>"333333", "name"=>"Noam Ben Ari", "friends_count"=>10, "profile_sidebar_fill_color"=>"C0DFEC", "id"=>123, "id_str"=>"91434812", "profile_background_tile"=>false, "utc_offset"=>-10800}.to_json
15
+ @acc_token.stub!(:get).and_return(response)
16
+ end
17
+
18
+ describe ApplicationController do
19
+ before(:all) do
20
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/oauth")
21
+ sorcery_reload!([:oauth])
22
+ sorcery_controller_property_set(:oauth_providers, [:twitter])
23
+ sorcery_controller_oauth_property_set(:twitter, :key, "eYVNBjBDi33aa9GkA3w")
24
+ sorcery_controller_oauth_property_set(:twitter, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
25
+ sorcery_controller_oauth_property_set(:twitter, :callback_url, "http://blabla.com")
26
+ end
27
+
28
+ after(:all) do
29
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/oauth")
30
+ end
31
+ # ----------------- OAuth -----------------------
32
+ describe ApplicationController, "'login_from_access_token'" do
33
+
34
+ before(:each) do
35
+ stub_all_oauth_requests!
36
+ end
37
+
38
+ after(:each) do
39
+ User.delete_all
40
+ end
41
+
42
+ it "auth_at_provider redirects correctly" do
43
+ create_new_user
44
+ get :auth_at_provider_test
45
+ response.should be_a_redirect
46
+ response.should redirect_to("http://myapi.com/oauth/authorize?oauth_callback=http%3A%2F%2Fblabla.com&oauth_token=")
47
+ end
48
+
49
+ it "logins if user exists" do
50
+ sorcery_model_property_set(:authentications_class, Authentication)
51
+ create_new_external_user(:twitter)
52
+ get :test_login_from_access_token, :oauth_verifier => "blablaRERASDFcxvSDFA"
53
+ flash[:notice].should == "Success!"
54
+ end
55
+
56
+ it "'login_from_access_token' fails if user doesn't exist" do
57
+ sorcery_model_property_set(:authentications_class, Authentication)
58
+ create_new_user
59
+ get :test_login_from_access_token, :oauth_verifier => "blablaRERASDFcxvSDFA"
60
+ flash[:alert].should == "Failed!"
61
+ end
62
+ end
63
+
64
+ describe ApplicationController, "'create_from_provider!'" do
65
+ before(:each) do
66
+ stub_all_oauth_requests!
67
+ User.delete_all
68
+ end
69
+
70
+ it "should create a new user" do
71
+ sorcery_controller_property_set(:authentications_class, Authentication)
72
+ sorcery_controller_oauth_property_set(:twitter, :user_info_mapping, {:username => "screen_name"})
73
+ lambda do
74
+ get :test_create_from_provider, :provider => "twitter"
75
+ end.should change(User, :count).by(1)
76
+ User.first.username.should == "nbenari"
77
+ end
78
+
79
+ it "should support nested attributes" do
80
+ sorcery_controller_property_set(:authentications_class, Authentication)
81
+ sorcery_controller_oauth_property_set(:twitter, :user_info_mapping, {:username => "status/text"})
82
+ lambda do
83
+ get :test_create_from_provider, :provider => "twitter"
84
+ end.should change(User, :count).by(1)
85
+ User.first.username.should == "coming soon to sorcery gem: twitter and facebook authentication support."
86
+ end
87
+ end
88
+
89
+ describe ApplicationController, "OAuth with User Activation features" do
90
+ before(:all) do
91
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
92
+ sorcery_reload!([:user_activation,:oauth], :user_activation_mailer => ::SorceryMailer)
93
+ end
94
+
95
+ after(:all) do
96
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/activation")
97
+ end
98
+
99
+ after(:each) do
100
+ User.delete_all
101
+ end
102
+
103
+ it "should not send activation email to external users" do
104
+ old_size = ActionMailer::Base.deliveries.size
105
+ create_new_external_user(:twitter)
106
+ ActionMailer::Base.deliveries.size.should == old_size
107
+ end
108
+
109
+ it "should not send external users an activation success email" do
110
+ sorcery_model_property_set(:activation_success_email_method_name, nil)
111
+ create_new_external_user(:twitter)
112
+ old_size = ActionMailer::Base.deliveries.size
113
+ @user.activate!
114
+ ActionMailer::Base.deliveries.size.should == old_size
115
+ end
116
+ end
117
+ end