sorcery 0.1.4 → 0.3.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.
Files changed (111) hide show
  1. data/Gemfile +4 -2
  2. data/Gemfile.lock +16 -13
  3. data/README.rdoc +111 -78
  4. data/Rakefile +5 -0
  5. data/VERSION +1 -1
  6. data/lib/generators/sorcery_migration/sorcery_migration_generator.rb +24 -0
  7. data/lib/generators/sorcery_migration/templates/activity_logging.rb +17 -0
  8. data/lib/generators/sorcery_migration/templates/brute_force_protection.rb +11 -0
  9. data/lib/generators/sorcery_migration/templates/core.rb +16 -0
  10. data/lib/generators/sorcery_migration/templates/oauth.rb +14 -0
  11. data/lib/generators/sorcery_migration/templates/remember_me.rb +15 -0
  12. data/lib/generators/sorcery_migration/templates/reset_password.rb +13 -0
  13. data/lib/generators/sorcery_migration/templates/user_activation.rb +17 -0
  14. data/lib/sorcery/controller/adapters/sinatra.rb +97 -0
  15. data/lib/sorcery/controller/submodules/activity_logging.rb +20 -7
  16. data/lib/sorcery/controller/submodules/brute_force_protection.rb +9 -2
  17. data/lib/sorcery/controller/submodules/http_basic_auth.rb +18 -9
  18. data/lib/sorcery/controller/submodules/oauth/oauth1.rb +33 -0
  19. data/lib/sorcery/controller/submodules/oauth/oauth2.rb +24 -0
  20. data/lib/sorcery/controller/submodules/oauth/providers/facebook.rb +64 -0
  21. data/lib/sorcery/controller/submodules/oauth/providers/twitter.rb +61 -0
  22. data/lib/sorcery/controller/submodules/oauth.rb +95 -0
  23. data/lib/sorcery/controller/submodules/remember_me.rb +14 -5
  24. data/lib/sorcery/controller/submodules/session_timeout.rb +6 -1
  25. data/lib/sorcery/controller.rb +29 -17
  26. data/lib/sorcery/engine.rb +9 -2
  27. data/lib/sorcery/model/submodules/activity_logging.rb +13 -8
  28. data/lib/sorcery/model/submodules/brute_force_protection.rb +11 -8
  29. data/lib/sorcery/model/submodules/oauth.rb +53 -0
  30. data/lib/sorcery/model/submodules/remember_me.rb +5 -3
  31. data/lib/sorcery/model/submodules/reset_password.rb +16 -13
  32. data/lib/sorcery/model/submodules/user_activation.rb +38 -19
  33. data/lib/sorcery/model/temporary_token.rb +22 -0
  34. data/lib/sorcery/model.rb +10 -3
  35. data/lib/sorcery/sinatra.rb +14 -0
  36. data/lib/sorcery/test_helpers/rails.rb +57 -0
  37. data/lib/sorcery/test_helpers/sinatra.rb +131 -0
  38. data/lib/sorcery/test_helpers.rb +40 -0
  39. data/lib/sorcery.rb +20 -0
  40. data/sorcery.gemspec +144 -41
  41. data/spec/Gemfile +3 -2
  42. data/spec/Gemfile.lock +15 -2
  43. data/spec/rails3/app_root/.rspec +1 -0
  44. data/spec/rails3/{Gemfile → app_root/Gemfile} +4 -4
  45. data/spec/rails3/{Gemfile.lock → app_root/Gemfile.lock} +23 -3
  46. data/spec/rails3/app_root/app/controllers/application_controller.rb +42 -1
  47. data/spec/rails3/app_root/app/models/authentication.rb +3 -0
  48. data/spec/rails3/app_root/app/models/user.rb +4 -1
  49. data/spec/rails3/app_root/config/application.rb +1 -3
  50. data/spec/rails3/app_root/config/routes.rb +1 -10
  51. data/spec/rails3/app_root/db/migrate/activation/20101224223622_add_activation_to_users.rb +6 -4
  52. data/spec/rails3/app_root/db/migrate/core/20101224223620_create_users.rb +4 -4
  53. data/spec/rails3/app_root/db/migrate/oauth/20101224223628_create_authentications.rb +14 -0
  54. data/spec/rails3/{controller_activity_logging_spec.rb → app_root/spec/controller_activity_logging_spec.rb} +13 -13
  55. data/spec/rails3/{controller_brute_force_protection_spec.rb → app_root/spec/controller_brute_force_protection_spec.rb} +16 -6
  56. data/spec/rails3/{controller_http_basic_auth_spec.rb → app_root/spec/controller_http_basic_auth_spec.rb} +3 -3
  57. data/spec/rails3/app_root/spec/controller_oauth2_spec.rb +119 -0
  58. data/spec/rails3/app_root/spec/controller_oauth_spec.rb +122 -0
  59. data/spec/rails3/{controller_remember_me_spec.rb → app_root/spec/controller_remember_me_spec.rb} +4 -4
  60. data/spec/rails3/{controller_session_timeout_spec.rb → app_root/spec/controller_session_timeout_spec.rb} +6 -6
  61. data/spec/rails3/{controller_spec.rb → app_root/spec/controller_spec.rb} +20 -13
  62. data/spec/rails3/app_root/spec/spec_helper.orig.rb +27 -0
  63. data/spec/rails3/app_root/spec/spec_helper.rb +62 -0
  64. data/spec/rails3/{user_activation_spec.rb → app_root/spec/user_activation_spec.rb} +60 -20
  65. data/spec/rails3/{user_activity_logging_spec.rb → app_root/spec/user_activity_logging_spec.rb} +4 -4
  66. data/spec/rails3/{user_brute_force_protection_spec.rb → app_root/spec/user_brute_force_protection_spec.rb} +7 -7
  67. data/spec/rails3/app_root/spec/user_oauth_spec.rb +39 -0
  68. data/spec/rails3/{user_remember_me_spec.rb → app_root/spec/user_remember_me_spec.rb} +4 -4
  69. data/spec/rails3/{user_reset_password_spec.rb → app_root/spec/user_reset_password_spec.rb} +21 -41
  70. data/spec/rails3/app_root/spec/user_spec.rb +317 -0
  71. data/spec/sinatra/Gemfile +12 -0
  72. data/spec/sinatra/Gemfile.lock +134 -0
  73. data/spec/sinatra/Rakefile +10 -0
  74. data/spec/sinatra/authentication.rb +3 -0
  75. data/spec/sinatra/db/migrate/activation/20101224223622_add_activation_to_users.rb +17 -0
  76. data/spec/sinatra/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +17 -0
  77. data/spec/sinatra/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +11 -0
  78. data/spec/sinatra/db/migrate/core/20101224223620_create_users.rb +16 -0
  79. data/spec/sinatra/db/migrate/oauth/20101224223628_create_authentications.rb +14 -0
  80. data/spec/sinatra/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +15 -0
  81. data/spec/sinatra/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +13 -0
  82. data/spec/sinatra/filters.rb +21 -0
  83. data/spec/sinatra/myapp.rb +133 -0
  84. data/spec/sinatra/sorcery_mailer.rb +25 -0
  85. data/spec/sinatra/spec/controller_activity_logging_spec.rb +85 -0
  86. data/spec/sinatra/spec/controller_brute_force_protection_spec.rb +69 -0
  87. data/spec/sinatra/spec/controller_http_basic_auth_spec.rb +53 -0
  88. data/spec/sinatra/spec/controller_oauth2_spec.rb +119 -0
  89. data/spec/sinatra/spec/controller_oauth_spec.rb +121 -0
  90. data/spec/sinatra/spec/controller_remember_me_spec.rb +64 -0
  91. data/spec/sinatra/spec/controller_session_timeout_spec.rb +52 -0
  92. data/spec/sinatra/spec/controller_spec.rb +120 -0
  93. data/spec/sinatra/spec/spec.opts +4 -0
  94. data/spec/sinatra/spec/spec_helper.rb +44 -0
  95. data/spec/sinatra/spec/user_activation_spec.rb +188 -0
  96. data/spec/sinatra/spec/user_activity_logging_spec.rb +36 -0
  97. data/spec/sinatra/spec/user_brute_force_protection_spec.rb +76 -0
  98. data/spec/sinatra/spec/user_oauth_spec.rb +39 -0
  99. data/spec/sinatra/spec/user_remember_me_spec.rb +66 -0
  100. data/spec/sinatra/spec/user_reset_password_spec.rb +178 -0
  101. data/spec/{rails3 → sinatra/spec}/user_spec.rb +68 -38
  102. data/spec/sinatra/user.rb +6 -0
  103. data/spec/sinatra/views/test_login.erb +4 -0
  104. data/spec/untitled folder +18 -0
  105. metadata +201 -58
  106. data/spec/rails3/app_root/test/fixtures/users.yml +0 -9
  107. data/spec/rails3/app_root/test/performance/browsing_test.rb +0 -9
  108. data/spec/rails3/app_root/test/test_helper.rb +0 -13
  109. data/spec/rails3/app_root/test/unit/user_test.rb +0 -8
  110. data/spec/rails3/spec_helper.rb +0 -135
  111. /data/spec/rails3/{Rakefile → app_root/Rakefile} +0 -0
@@ -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,119 @@
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
+ Authentication.delete_all
36
+ end
37
+
38
+ it "auth_at_provider redirects correctly" do
39
+ create_new_user
40
+ get :auth_at_provider_test2
41
+ response.should be_a_redirect
42
+ 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")
43
+ end
44
+
45
+ it "'login_from_access_token' logins if user exists" do
46
+ sorcery_model_property_set(:authentications_class, Authentication)
47
+ create_new_external_user(:facebook)
48
+ get :test_login_from_access_token2
49
+ flash[:notice].should == "Success!"
50
+ end
51
+
52
+ it "'login_from_access_token' fails if user doesn't exist" do
53
+ sorcery_model_property_set(:authentications_class, Authentication)
54
+ create_new_user
55
+ get :test_login_from_access_token2
56
+ flash[:alert].should == "Failed!"
57
+ end
58
+ end
59
+
60
+ describe ApplicationController, "'create_from_provider!'" do
61
+ before(:each) do
62
+ stub_all_oauth2_requests!
63
+ User.delete_all
64
+ Authentication.delete_all
65
+ end
66
+
67
+ it "should create a new user" do
68
+ sorcery_model_property_set(:authentications_class, Authentication)
69
+ sorcery_controller_oauth_property_set(:facebook, :user_info_mapping, {:username => "name"})
70
+ lambda do
71
+ get :test_create_from_provider, :provider => "facebook"
72
+ end.should change(User, :count).by(1)
73
+ User.first.username.should == "Noam Ben Ari"
74
+ end
75
+
76
+ it "should support nested attributes" do
77
+ sorcery_model_property_set(:authentications_class, Authentication)
78
+ sorcery_controller_oauth_property_set(:facebook, :user_info_mapping, {:username => "hometown/name"})
79
+ lambda do
80
+ get :test_create_from_provider, :provider => "facebook"
81
+ end.should change(User, :count).by(1)
82
+ User.first.username.should == "Haifa, Israel"
83
+ end
84
+ end
85
+
86
+ describe ApplicationController, "OAuth with User Activation features" do
87
+ before(:all) do
88
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
89
+ sorcery_reload!([:user_activation,:oauth], :user_activation_mailer => ::SorceryMailer)
90
+ sorcery_controller_property_set(:oauth_providers, [:facebook])
91
+ sorcery_controller_oauth_property_set(:facebook, :key, "eYVNBjBDi33aa9GkA3w")
92
+ sorcery_controller_oauth_property_set(:facebook, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
93
+ sorcery_controller_oauth_property_set(:facebook, :callback_url, "http://blabla.com")
94
+ end
95
+
96
+ after(:all) do
97
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/activation")
98
+ end
99
+
100
+ after(:each) do
101
+ User.delete_all
102
+ end
103
+
104
+ it "should not send activation email to external users" do
105
+ old_size = ActionMailer::Base.deliveries.size
106
+ create_new_external_user(:facebook)
107
+ ActionMailer::Base.deliveries.size.should == old_size
108
+ end
109
+
110
+ it "should not send external users an activation success email" do
111
+ sorcery_model_property_set(:activation_success_email_method_name, nil)
112
+ create_new_external_user(:facebook)
113
+ old_size = ActionMailer::Base.deliveries.size
114
+ @user.activate!
115
+ ActionMailer::Base.deliveries.size.should == old_size
116
+ end
117
+ end
118
+
119
+ end
@@ -0,0 +1,122 @@
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.token
13
+ session[:request_token_secret] = @req_token.secret
14
+ OAuth::RequestToken.stub!(:new).and_return(@req_token)
15
+ response = OpenStruct.new()
16
+ 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
17
+ @acc_token.stub!(:get).and_return(response)
18
+ end
19
+
20
+ describe ApplicationController do
21
+ before(:all) do
22
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/oauth")
23
+ sorcery_reload!([:oauth])
24
+ sorcery_controller_property_set(:oauth_providers, [:twitter])
25
+ sorcery_controller_oauth_property_set(:twitter, :key, "eYVNBjBDi33aa9GkA3w")
26
+ sorcery_controller_oauth_property_set(:twitter, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
27
+ sorcery_controller_oauth_property_set(:twitter, :callback_url, "http://blabla.com")
28
+ end
29
+
30
+ after(:all) do
31
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/oauth")
32
+ end
33
+ # ----------------- OAuth -----------------------
34
+ describe ApplicationController, "'login_from_access_token'" do
35
+
36
+ before(:each) do
37
+ stub_all_oauth_requests!
38
+ end
39
+
40
+ after(:each) do
41
+ User.delete_all
42
+ Authentication.delete_all
43
+ end
44
+
45
+ it "auth_at_provider redirects correctly" do
46
+ create_new_user
47
+ get :auth_at_provider_test
48
+ response.should be_a_redirect
49
+ response.should redirect_to("http://myapi.com/oauth/authorize?oauth_callback=http%3A%2F%2Fblabla.com&oauth_token=")
50
+ end
51
+
52
+ it "logins if user exists" do
53
+ sorcery_model_property_set(:authentications_class, Authentication)
54
+ create_new_external_user(:twitter)
55
+ get :test_login_from_access_token, :oauth_verifier => "blablaRERASDFcxvSDFA"
56
+ flash[:notice].should == "Success!"
57
+ end
58
+
59
+ it "'login_from_access_token' fails if user doesn't exist" do
60
+ sorcery_model_property_set(:authentications_class, Authentication)
61
+ create_new_user
62
+ get :test_login_from_access_token, :oauth_verifier => "blablaRERASDFcxvSDFA"
63
+ flash[:alert].should == "Failed!"
64
+ end
65
+ end
66
+
67
+ describe ApplicationController, "'create_from_provider!'" do
68
+ before(:each) do
69
+ stub_all_oauth_requests!
70
+ User.delete_all
71
+ Authentication.delete_all
72
+ end
73
+
74
+ it "should create a new user" do
75
+ sorcery_model_property_set(:authentications_class, Authentication)
76
+ sorcery_controller_oauth_property_set(:twitter, :user_info_mapping, {:username => "screen_name"})
77
+ lambda do
78
+ get :test_create_from_provider, :provider => "twitter"
79
+ end.should change(User, :count).by(1)
80
+ User.first.username.should == "nbenari"
81
+ end
82
+
83
+ it "should support nested attributes" do
84
+ sorcery_model_property_set(:authentications_class, Authentication)
85
+ sorcery_controller_oauth_property_set(:twitter, :user_info_mapping, {:username => "status/text"})
86
+ lambda do
87
+ get :test_create_from_provider, :provider => "twitter"
88
+ end.should change(User, :count).by(1)
89
+ User.first.username.should == "coming soon to sorcery gem: twitter and facebook authentication support."
90
+ end
91
+ end
92
+
93
+ describe ApplicationController, "OAuth with User Activation features" do
94
+ before(:all) do
95
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
96
+ sorcery_reload!([:user_activation,:oauth], :user_activation_mailer => ::SorceryMailer)
97
+ end
98
+
99
+ after(:all) do
100
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/activation")
101
+ end
102
+
103
+ after(:each) do
104
+ User.delete_all
105
+ Authentication.delete_all
106
+ end
107
+
108
+ it "should not send activation email to external users" do
109
+ old_size = ActionMailer::Base.deliveries.size
110
+ create_new_external_user(:twitter)
111
+ ActionMailer::Base.deliveries.size.should == old_size
112
+ end
113
+
114
+ it "should not send external users an activation success email" do
115
+ sorcery_model_property_set(:activation_success_email_method_name, nil)
116
+ create_new_external_user(:twitter)
117
+ old_size = ActionMailer::Base.deliveries.size
118
+ @user.activate!
119
+ ActionMailer::Base.deliveries.size.should == old_size
120
+ end
121
+ end
122
+ end
@@ -6,7 +6,7 @@ describe ApplicationController do
6
6
  describe ApplicationController, "with remember me features" do
7
7
  before(:all) do
8
8
  ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/remember_me")
9
- plugin_model_configure([:remember_me])
9
+ sorcery_reload!([:remember_me])
10
10
  end
11
11
 
12
12
  before(:each) do
@@ -25,7 +25,7 @@ describe ApplicationController do
25
25
 
26
26
  it "should set cookie on remember_me!" do
27
27
  post :test_login_with_remember, :username => 'gizmo', :password => 'secret'
28
- cookies["remember_me_token"].should == assigns[:logged_in_user].remember_me_token
28
+ cookies["remember_me_token"].should == assigns[:current_user].remember_me_token
29
29
  end
30
30
 
31
31
  it "should clear cookie on forget_me!" do
@@ -50,11 +50,11 @@ describe ApplicationController do
50
50
  session[:user_id] = @user.id
51
51
  subject.remember_me!
52
52
  subject.instance_eval do
53
- @logged_in_user = nil
53
+ @current_user = nil
54
54
  end
55
55
  session[:user_id] = nil
56
56
  get :test_login_from_cookie
57
- assigns[:logged_in_user].should == @user
57
+ assigns[:current_user].should == @user
58
58
  end
59
59
 
60
60
  it "should not remember_me! when not asked to" do
@@ -5,8 +5,8 @@ describe ApplicationController do
5
5
  # ----------------- SESSION TIMEOUT -----------------------
6
6
  describe ApplicationController, "with session timeout features" do
7
7
  before(:all) do
8
- plugin_model_configure([:session_timeout])
9
- plugin_set_controller_config_property(:session_timeout,0.5)
8
+ sorcery_reload!([:session_timeout])
9
+ sorcery_controller_property_set(:session_timeout,0.5)
10
10
  create_new_user
11
11
  end
12
12
 
@@ -26,8 +26,8 @@ describe ApplicationController do
26
26
  end
27
27
 
28
28
  it "with 'session_timeout_from_last_action' should not logout if there was activity" do
29
- plugin_set_controller_config_property(:session_timeout_from_last_action, true)
30
- login_user
29
+ sorcery_controller_property_set(:session_timeout_from_last_action, true)
30
+ get :test_login, :username => 'gizmo', :password => 'secret'
31
31
  sleep 0.3
32
32
  get :test_should_be_logged_in
33
33
  session[:user_id].should_not be_nil
@@ -38,8 +38,8 @@ describe ApplicationController do
38
38
  end
39
39
 
40
40
  it "with 'session_timeout_from_last_action' should logout if there was no activity" do
41
- plugin_set_controller_config_property(:session_timeout_from_last_action, true)
42
- login_user
41
+ sorcery_controller_property_set(:session_timeout_from_last_action, true)
42
+ get :test_login, :username => 'gizmo', :password => 'secret'
43
43
  sleep 0.6
44
44
  get :test_should_be_logged_in
45
45
  session[:user_id].should be_nil
@@ -5,21 +5,21 @@ describe ApplicationController do
5
5
  # ----------------- PLUGIN CONFIGURATION -----------------------
6
6
  describe ApplicationController, "plugin configuration" do
7
7
  before(:all) do
8
- plugin_model_configure
8
+ sorcery_reload!
9
9
  end
10
10
 
11
11
  after(:each) do
12
12
  Sorcery::Controller::Config.reset!
13
- plugin_model_configure
13
+ sorcery_reload!
14
14
  end
15
15
 
16
16
  it "should enable configuration option 'user_class'" do
17
- plugin_set_controller_config_property(:user_class, TestUser)
17
+ sorcery_controller_property_set(:user_class, TestUser)
18
18
  Sorcery::Controller::Config.user_class.should equal(TestUser)
19
19
  end
20
20
 
21
21
  it "should enable configuration option 'not_authenticated_action'" do
22
- plugin_set_controller_config_property(:not_authenticated_action, :my_action)
22
+ sorcery_controller_property_set(:not_authenticated_action, :my_action)
23
23
  Sorcery::Controller::Config.not_authenticated_action.should equal(:my_action)
24
24
  end
25
25
 
@@ -34,7 +34,7 @@ describe ApplicationController do
34
34
 
35
35
  after(:each) do
36
36
  Sorcery::Controller::Config.reset!
37
- plugin_set_controller_config_property(:user_class, User)
37
+ sorcery_controller_property_set(:user_class, User)
38
38
  end
39
39
 
40
40
  it "should respond to the instance method login" do
@@ -49,8 +49,8 @@ describe ApplicationController do
49
49
  should respond_to(:logged_in?)
50
50
  end
51
51
 
52
- it "should respond to the instance method logged_in_user" do
53
- should respond_to(:logged_in_user)
52
+ it "should respond to the instance method current_user" do
53
+ should respond_to(:current_user)
54
54
  end
55
55
 
56
56
  it "login(username,password) should return the user when success and set the session with user.id" do
@@ -82,15 +82,15 @@ describe ApplicationController do
82
82
  subject.logged_in?.should be_false
83
83
  end
84
84
 
85
- it "logged_in_user should return the user instance if logged in" do
85
+ it "current_user should return the user instance if logged in" do
86
86
  create_new_user
87
87
  session[:user_id] = @user.id
88
- subject.logged_in_user.should == @user
88
+ subject.current_user.should == @user
89
89
  end
90
90
 
91
- it "logged_in_user should return false if not logged in" do
91
+ it "current_user should return false if not logged in" do
92
92
  session[:user_id] = nil
93
- subject.logged_in_user.should == false
93
+ subject.current_user.should == false
94
94
  end
95
95
 
96
96
  it "should respond to 'require_login'" do
@@ -99,17 +99,24 @@ describe ApplicationController do
99
99
 
100
100
  it "should call the configured 'not_authenticated_action' when authenticate before_filter fails" do
101
101
  session[:user_id] = nil
102
- plugin_set_controller_config_property(:not_authenticated_action, :test_not_authenticated_action)
102
+ sorcery_controller_property_set(:not_authenticated_action, :test_not_authenticated_action)
103
103
  get :test_logout
104
104
  response.body.should == "test_not_authenticated_action"
105
105
  end
106
106
 
107
107
  it "require_login before_filter should save the url that the user originally wanted" do
108
108
  get :some_action
109
- session[:user_wanted_url].should == "http://test.host/some_action"
109
+ session[:return_to_url].should == "http://test.host/application/some_action"
110
110
  response.should redirect_to("http://test.host/")
111
111
  end
112
112
 
113
+ it "on successful login the user should be redirected to the url he originally wanted" do
114
+ session[:return_to_url] = "http://test.host/some_action"
115
+ post :test_return_to, :username => 'gizmo', :password => 'secret'
116
+ response.should redirect_to("http://test.host/some_action")
117
+ flash[:notice].should == "haha!"
118
+ end
119
+
113
120
  end
114
121
 
115
122
  end
@@ -0,0 +1,27 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV["RAILS_ENV"] ||= 'test'
3
+ require File.expand_path("../../config/environment", __FILE__)
4
+ require 'rspec/rails'
5
+
6
+ # Requires supporting ruby files with custom matchers and macros, etc,
7
+ # in spec/support/ and its subdirectories.
8
+ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+ # == Mock Framework
12
+ #
13
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
14
+ #
15
+ # config.mock_with :mocha
16
+ # config.mock_with :flexmock
17
+ # config.mock_with :rr
18
+ config.mock_with :rspec
19
+
20
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
21
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
22
+
23
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
24
+ # examples within a transaction, remove the following line or assign false
25
+ # instead of true.
26
+ config.use_transactional_fixtures = true
27
+ end
@@ -0,0 +1,62 @@
1
+ $: << File.join(File.dirname(__FILE__), '..', '..', 'lib' )
2
+
3
+ require 'simplecov'
4
+ SimpleCov.root File.join(File.dirname(__FILE__), "..", "..", "app_root" )
5
+ SimpleCov.start do
6
+ add_filter "/config/"
7
+
8
+ add_group 'Controllers', 'app/controllers'
9
+ add_group 'Models', 'app/models'
10
+ add_group 'Helpers', 'app/helpers'
11
+ add_group 'Libraries', 'lib'
12
+ add_group 'Plugins', 'vendor/plugins'
13
+ add_group 'Migrations', 'db/migrate'
14
+ end
15
+
16
+ require 'spork'
17
+
18
+ Spork.prefork do
19
+ # Set the default environment to sqlite3's in_memory database
20
+ ENV['RAILS_ENV'] ||= 'in_memory'
21
+ ENV['RAILS_ROOT'] = 'app_root'
22
+
23
+ # Load the Rails environment and testing framework
24
+ require "#{File.dirname(__FILE__)}/../config/environment"
25
+ #require "#{File.dirname(__FILE__)}/../../init" # for plugins
26
+ require 'rspec/rails'
27
+
28
+ RSpec.configure do |config|
29
+ config.use_transactional_fixtures = true
30
+ config.use_instantiated_fixtures = false
31
+ config.include RSpec::Rails::ControllerExampleGroup, :example_group => { :file_path => /controller(.)*_spec.rb$/ }
32
+
33
+ config.before(:suite) do
34
+ ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/core")
35
+ end
36
+
37
+ config.after(:suite) do
38
+ ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/core")
39
+ end
40
+ end
41
+
42
+ #----------------------------------------------------------------
43
+ # needed when running individual specs
44
+ require File.join(File.dirname(__FILE__), '..','app','models','user')
45
+ require File.join(File.dirname(__FILE__), '..','app','models','authentication')
46
+
47
+ class TestUser < ActiveRecord::Base
48
+ activate_sorcery!
49
+ end
50
+
51
+ class TestMailer < ActionMailer::Base
52
+
53
+ end
54
+
55
+ include ::Sorcery::TestHelpers
56
+ include ::Sorcery::TestHelpers::Rails
57
+
58
+ end
59
+
60
+ Spork.each_run do
61
+ # This code will be run each time you run your specs.
62
+ end