reflex 0.0.2

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 (88) hide show
  1. data/.document +5 -0
  2. data/.gitignore +24 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +193 -0
  5. data/Rakefile +146 -0
  6. data/VERSION +1 -0
  7. data/cucumber.yml +7 -0
  8. data/features/connect_to_provider.feature +18 -0
  9. data/features/social_authentication.feature +50 -0
  10. data/features/step_definitions/reflex_steps.rb +93 -0
  11. data/features/step_definitions/web_steps.rb +192 -0
  12. data/features/support/env.rb +57 -0
  13. data/features/support/mocha.rb +16 -0
  14. data/features/support/mock_controller/oauth_authorize.html.erb +15 -0
  15. data/features/support/mocks.rb +21 -0
  16. data/features/support/paths.rb +39 -0
  17. data/features/support/rails_root/.gitignore +8 -0
  18. data/features/support/rails_root/Rakefile +10 -0
  19. data/features/support/rails_root/app/controllers/application_controller.rb +20 -0
  20. data/features/support/rails_root/app/controllers/user_sessions_controller.rb +24 -0
  21. data/features/support/rails_root/app/controllers/users_controller.rb +46 -0
  22. data/features/support/rails_root/app/helpers/application_helper.rb +3 -0
  23. data/features/support/rails_root/app/helpers/user_sessions_helper.rb +2 -0
  24. data/features/support/rails_root/app/helpers/users_helper.rb +2 -0
  25. data/features/support/rails_root/app/models/user.rb +7 -0
  26. data/features/support/rails_root/app/models/user_session.rb +2 -0
  27. data/features/support/rails_root/app/views/layouts/application.html.erb +23 -0
  28. data/features/support/rails_root/app/views/user_sessions/new.html.erb +23 -0
  29. data/features/support/rails_root/app/views/users/_form.html.erb +31 -0
  30. data/features/support/rails_root/app/views/users/_user.html.erb +1 -0
  31. data/features/support/rails_root/app/views/users/edit.html.erb +2 -0
  32. data/features/support/rails_root/app/views/users/index.html.erb +8 -0
  33. data/features/support/rails_root/app/views/users/new.html.erb +2 -0
  34. data/features/support/rails_root/app/views/users/show.html.erb +20 -0
  35. data/features/support/rails_root/config/boot.rb +110 -0
  36. data/features/support/rails_root/config/database.yml +9 -0
  37. data/features/support/rails_root/config/environment.rb +22 -0
  38. data/features/support/rails_root/config/environments/development.rb +0 -0
  39. data/features/support/rails_root/config/environments/test.rb +0 -0
  40. data/features/support/rails_root/config/initializers/backtrace_silencers.rb +7 -0
  41. data/features/support/rails_root/config/initializers/inflections.rb +10 -0
  42. data/features/support/rails_root/config/initializers/mime_types.rb +5 -0
  43. data/features/support/rails_root/config/initializers/new_rails_defaults.rb +21 -0
  44. data/features/support/rails_root/config/initializers/session_store.rb +15 -0
  45. data/features/support/rails_root/config/routes.rb +9 -0
  46. data/features/support/rails_root/db/migrate/001_create_users.rb +16 -0
  47. data/features/support/rails_root/db/migrate/002_create_reflex_connections.rb +17 -0
  48. data/features/support/rails_root/db/schema.rb +35 -0
  49. data/features/support/rails_root/vendor/plugins/reflex/rails/init.rb +1 -0
  50. data/features/traditional_registration_and_authentication.feature +39 -0
  51. data/init.rb +5 -0
  52. data/lib/reflex/authlogic/account.rb +55 -0
  53. data/lib/reflex/authlogic/acts_as_authentic.rb +19 -0
  54. data/lib/reflex/authlogic/authentication_process.rb +40 -0
  55. data/lib/reflex/authlogic/callback_filter.rb +26 -0
  56. data/lib/reflex/authlogic/connectable.rb +87 -0
  57. data/lib/reflex/authlogic/connection.rb +18 -0
  58. data/lib/reflex/authlogic/session.rb +84 -0
  59. data/lib/reflex/base.rb +37 -0
  60. data/lib/reflex/configuration.rb +38 -0
  61. data/lib/reflex/oauth_server.rb +47 -0
  62. data/lib/reflex/system.rb +25 -0
  63. data/lib/reflex.rb +14 -0
  64. data/rails/init.rb +22 -0
  65. data/rails_generators/reflex_connection_migration/reflex_connection_migration_generator.rb +12 -0
  66. data/rails_generators/reflex_connection_migration/templates/create_reflex_connections.rb +17 -0
  67. data/reflex.gemspec +164 -0
  68. data/spec/fakeweb/OAuthServer.getProviders +5 -0
  69. data/spec/fakeweb/OAuthServer.sessionGetProfile +5 -0
  70. data/spec/fakeweb/OAuthServer.tokenAccess +4 -0
  71. data/spec/fakeweb/OAuthServer.tokenRequest +5 -0
  72. data/spec/fakeweb/OAuthServer.tokenSetUserId +5 -0
  73. data/spec/fakeweb/OAuthServer.userGetProfile +5 -0
  74. data/spec/fakeweb/OAuthServer.userGetProviders +4 -0
  75. data/spec/fakeweb/OAuthServer.userRemoveProvider +5 -0
  76. data/spec/fakeweb/System.listMethods +5 -0
  77. data/spec/fakeweb/System.methodDescription +5 -0
  78. data/spec/fakeweb/System.methodSignature +5 -0
  79. data/spec/reflex/authlogic/connection_spec.rb +22 -0
  80. data/spec/reflex/base_spec.rb +29 -0
  81. data/spec/reflex/configuration_spec.rb +71 -0
  82. data/spec/reflex/oauth_server_spec.rb +219 -0
  83. data/spec/reflex/system_spec.rb +83 -0
  84. data/spec/reflex_spec.rb +5 -0
  85. data/spec/schema.rb +15 -0
  86. data/spec/spec.opts +1 -0
  87. data/spec/spec_helper.rb +66 -0
  88. metadata +294 -0
@@ -0,0 +1,71 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..') + '/spec_helper')
2
+
3
+ describe Reflex::Configuration do
4
+ include ReflexSpecHelper
5
+
6
+ before(:each) do
7
+ @configuration = Reflex::Configuration.instance
8
+ end
9
+
10
+ describe "Singleton" do
11
+ it "should not allow instantiation" do
12
+ lambda { Reflex::Configuration.new }.should raise_error(NoMethodError)
13
+ end
14
+
15
+ it "should have 1 global instance" do
16
+ Reflex::Configuration.instance.should == @configuration
17
+ end
18
+ end
19
+
20
+ describe "Reflex#configure" do
21
+ before(:each) do
22
+ Reflex.configure(:key => "key", :secret => "secret", :endpoint => "http://social.react.com/XmlRpc_v2/")
23
+ end
24
+
25
+ it "should have a key" do
26
+ @configuration.key.should == "key"
27
+ end
28
+
29
+ it "should have a secret" do
30
+ @configuration.secret.should == "secret"
31
+ end
32
+
33
+ it "should have an endpoint" do
34
+ @configuration.endpoint.should == "http://social.react.com/XmlRpc_v2/"
35
+ end
36
+
37
+ it "should have a hostname" do
38
+ @configuration.hostname.should == "social.react.com"
39
+ end
40
+
41
+ it "should have a path" do
42
+ @configuration.path.should == "/XmlRpc_v2/"
43
+ end
44
+
45
+ it "should have a port" do
46
+ @configuration.port.should == 80
47
+ end
48
+
49
+ describe "endpoint changes" do
50
+ before(:each) do
51
+ Reflex.configure(:endpoint => "http://www.example.com:8080/API/")
52
+ end
53
+
54
+ it "should have a changed URL" do
55
+ @configuration.endpoint.should == "http://www.example.com:8080/API/"
56
+ end
57
+
58
+ it "should have a changed hostname" do
59
+ @configuration.hostname.should == "www.example.com"
60
+ end
61
+
62
+ it "should have a changed path" do
63
+ @configuration.path.should == "/API/"
64
+ end
65
+
66
+ it "should have a changed port" do
67
+ @configuration.port.should == 8080
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,219 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..') + '/spec_helper')
2
+ require 'fakeweb'
3
+
4
+ describe Reflex::OAuthServer do
5
+ include ReflexSpecHelper
6
+
7
+ before(:all) do
8
+ Reflex.configure(:endpoint => 'http://social.react.com/XmlRpc_v2/')
9
+ FakeWeb.allow_net_connect = false
10
+ FakeWeb.clean_registry
11
+ end
12
+
13
+ describe 'get_providers' do
14
+ it 'should call OAuthServer.getProviders securely' do
15
+ Reflex::OAuthServer.expects(:call!).with('OAuthServer.getProviders')
16
+ Reflex::OAuthServer.get_providers
17
+ end
18
+
19
+ describe 'response' do
20
+ before(:each) do
21
+ FakeWeb.register_uri(:post, 'http://social.react.com/XmlRpc_v2/', :response => fake_response('OAuthServer.getProviders'))
22
+ @response = Reflex::OAuthServer.get_providers
23
+ end
24
+
25
+ it 'should be an array' do
26
+ @response.should be_an_instance_of(Array)
27
+ end
28
+
29
+ it 'should include "Twitter"' do
30
+ @response.should include('Twitter')
31
+ end
32
+ end
33
+ end
34
+
35
+ describe 'token_request' do
36
+ before(:each) do
37
+ end
38
+
39
+ it 'should call OAuthServer.tokenRequest securely' do
40
+ Reflex::OAuthServer.expects(:call!).with('OAuthServer.tokenRequest', 'Twitter')
41
+ Reflex::OAuthServer.token_request('Twitter')
42
+ end
43
+
44
+ describe 'response' do
45
+ before(:each) do
46
+ FakeWeb.register_uri(:post, 'http://social.react.com/XmlRpc_v2/', :response => fake_response('OAuthServer.tokenRequest'))
47
+ @response = Reflex::OAuthServer.token_request('Twitter')
48
+ end
49
+
50
+ it 'should be a hash' do
51
+ @response.should be_an_instance_of(Hash)
52
+ end
53
+
54
+ it 'should include a redirectUrl' do
55
+ @response['redirectUrl'].should =~ /twitter\.com\/oauth/
56
+ end
57
+
58
+ it 'should include a reactOAuthSession' do
59
+ @response['reactOAuthSession'].should == 'FILTERED'
60
+ end
61
+ end
62
+ end
63
+
64
+ describe 'token_access' do
65
+ it 'should call OAuthServer.tokenAccess securely' do
66
+ Reflex::OAuthServer.expects(:call!).with('OAuthServer.tokenAccess', { 'oauth_token' => 'FILTERED', 'oauth_verifier' => 'FILTERED', 'ReactOAuthSession' => 'FILTERED' })
67
+ Reflex::OAuthServer.token_access({ 'oauth_token' => 'FILTERED', 'oauth_verifier' => 'FILTERED', 'ReactOAuthSession' => 'FILTERED' })
68
+ end
69
+
70
+ describe 'response' do
71
+ before(:each) do
72
+ FakeWeb.register_uri(:post, 'http://social.react.com/XmlRpc_v2/', :response => fake_response('OAuthServer.tokenAccess'))
73
+ @response = Reflex::OAuthServer.token_access({ 'oauth_token' => 'FILTERED', 'oauth_verifier' => 'FILTERED', 'ReactOAuthSession' => 'FILTERED' })
74
+ end
75
+
76
+ it 'should be a hash' do
77
+ @response.should be_an_instance_of(Hash)
78
+ end
79
+
80
+ it 'should include the connected provider' do
81
+ @response['connectedWithProvider'].should == 'Twitter'
82
+ end
83
+
84
+ it 'should include the application user ID' do
85
+ @response['applicationUserId'].should == '1'
86
+ end
87
+
88
+ it 'should include the react OAuth Session' do
89
+ @response['reactOAuthSession'].should == 'FILTERED'
90
+ end
91
+ end
92
+ end
93
+
94
+ describe 'token_set_user_id' do
95
+ it 'should call OAuthServer.tokenSetUserId securely' do
96
+ Reflex::OAuthServer.expects(:call!).with('OAuthServer.tokenSetUserId', 1, 'FILTERED')
97
+ Reflex::OAuthServer.token_set_user_id(1, 'FILTERED')
98
+ end
99
+
100
+ describe 'response' do
101
+ before(:each) do
102
+ FakeWeb.register_uri(:post, 'http://social.react.com/XmlRpc_v2/', :response => fake_response('OAuthServer.tokenSetUserId'))
103
+ @response = Reflex::OAuthServer.token_set_user_id(1, 'FILTERED')
104
+ end
105
+
106
+ it 'should be a hash' do
107
+ @response.should be_an_instance_of(Hash)
108
+ end
109
+
110
+ it 'should include the application user ID' do
111
+ @response['applicationUserId'].should == '1'
112
+ end
113
+
114
+ it 'should include the connected provider' do
115
+ @response['connectedWithProvider'].should == 'Twitter'
116
+ end
117
+ end
118
+ end
119
+
120
+ describe 'user_get_providers' do
121
+ it 'should call OAuthServer.user_get_providers securely' do
122
+ Reflex::OAuthServer.expects(:call!).with('OAuthServer.userGetProviders', 1)
123
+ Reflex::OAuthServer.user_get_providers(1)
124
+ end
125
+
126
+ describe 'response' do
127
+ before(:each) do
128
+ FakeWeb.register_uri(:post, 'http://social.react.com/XmlRpc_v2/', :response => fake_response('OAuthServer.userGetProviders'))
129
+ @response = Reflex::OAuthServer.user_get_providers(1)
130
+ end
131
+
132
+ it 'should be a hash' do
133
+ @response.should be_an_instance_of(Hash)
134
+ end
135
+
136
+ it 'should include the connected providers' do
137
+ @response['connectedWithProviders'].should == ['Facebook', 'Twitter']
138
+ end
139
+ end
140
+ end
141
+
142
+ describe 'user_remove_provider' do
143
+ it 'should call OAuthServer.user_remove_provider securely' do
144
+ Reflex::OAuthServer.expects(:call!).with('OAuthServer.userRemoveProvider', 1, 'Twitter')
145
+ Reflex::OAuthServer.user_remove_provider(1, 'Twitter')
146
+ end
147
+
148
+ describe 'response' do
149
+ before(:each) do
150
+ FakeWeb.register_uri(:post, 'http://social.react.com/XmlRpc_v2/', :response => fake_response('OAuthServer.userRemoveProvider'))
151
+ @response = Reflex::OAuthServer.user_remove_provider(1, 'Twitter')
152
+ end
153
+
154
+ it 'should be true' do
155
+ @response.should be_true
156
+ end
157
+ end
158
+ end
159
+
160
+ describe 'user_get_profile' do
161
+ it 'should call OAuthServer.userGetProfile securely' do
162
+ Reflex::OAuthServer.expects(:call!).with('OAuthServer.userGetProfile', 1, 'Twitter')
163
+ Reflex::OAuthServer.user_get_profile(1, 'Twitter')
164
+ end
165
+
166
+ describe 'response' do
167
+ before(:each) do
168
+ FakeWeb.register_uri(:post, 'http://social.react.com/XmlRpc_v2/', :response => fake_response('OAuthServer.userGetProfile'))
169
+ @response = Reflex::OAuthServer.user_get_profile(1, 'Twitter')
170
+ end
171
+
172
+ it 'should be a hash' do
173
+ @response.should be_an_instance_of(Hash)
174
+ end
175
+
176
+ it 'should include the real name' do
177
+ @response['real_name'].should == 'Barney Stinson'
178
+ end
179
+
180
+ it 'should include the user name' do
181
+ @response['user_name'].should == 'barney'
182
+ end
183
+
184
+ it 'should include a profile picture' do
185
+ @response['profile_picture'].should == 'http://awesome.com/barney.jpg'
186
+ end
187
+ end
188
+ end
189
+
190
+ describe 'session_get_profile' do
191
+ it 'should call OAuthServer.sessionGetProfile securely' do
192
+ Reflex::OAuthServer.expects(:call!).with('OAuthServer.sessionGetProfile', 'FILTERED')
193
+ Reflex::OAuthServer.session_get_profile('FILTERED')
194
+ end
195
+
196
+ describe 'response' do
197
+ before(:each) do
198
+ FakeWeb.register_uri(:post, 'http://social.react.com/XmlRpc_v2/', :response => fake_response('OAuthServer.sessionGetProfile'))
199
+ @response = Reflex::OAuthServer.session_get_profile('FILTERED')
200
+ end
201
+
202
+ it 'should be a hash' do
203
+ @response.should be_an_instance_of(Hash)
204
+ end
205
+
206
+ it 'should include the real name' do
207
+ @response['real_name'].should == 'Barney Stinson'
208
+ end
209
+
210
+ it 'should include the user name' do
211
+ @response['user_name'].should == 'barney'
212
+ end
213
+
214
+ it 'should include a profile picture' do
215
+ @response['profile_picture'].should == 'http://awesome.com/barney.jpg'
216
+ end
217
+ end
218
+ end
219
+ end
@@ -0,0 +1,83 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..') + '/spec_helper')
2
+ require 'fakeweb'
3
+
4
+ describe Reflex::System do
5
+ include ReflexSpecHelper
6
+
7
+ before(:all) do
8
+ Reflex.configure(:endpoint => "http://social.react.com/XmlRpc_v2/")
9
+ FakeWeb.allow_net_connect = false
10
+ FakeWeb.clean_registry
11
+ end
12
+
13
+ describe "list_methods" do
14
+ before(:each) do
15
+ FakeWeb.register_uri(:post, "http://social.react.com/XmlRpc_v2/", :response => fake_response("System.listMethods"))
16
+ end
17
+
18
+ it "should call System.listMethods" do
19
+ Reflex::System.expects(:call).with("System.listMethods")
20
+ Reflex::System.list_methods
21
+ end
22
+
23
+ it "should return an array of methods" do
24
+ Reflex::System.list_methods.should be_an_instance_of(Array)
25
+ end
26
+
27
+ it "should include System.listMethods" do
28
+ Reflex::System.list_methods.should include("System.listMethods")
29
+ end
30
+ end
31
+
32
+ describe "method_signature" do
33
+ before(:each) do
34
+ FakeWeb.register_uri(:post, "http://social.react.com/XmlRpc_v2/", :response => fake_response("System.methodSignature"))
35
+ end
36
+
37
+ it "should call System.methodSignature" do
38
+ Reflex::System.expects(:call).with("System.methodSignature", "System.methodSignature")
39
+ Reflex::System.method_signature("System.methodSignature")
40
+ end
41
+
42
+ it "should return an array of arguments" do
43
+ Reflex::System.method_signature("System.methodSignature").should be_an_instance_of(Array)
44
+ end
45
+
46
+ it "should return a signature with 1 parameter" do
47
+ Reflex::System.method_signature("System.methodSignature").should == ["string"]
48
+ end
49
+ end
50
+
51
+ describe "method_description" do
52
+ before(:each) do
53
+ FakeWeb.register_uri(:post, "http://social.react.com/XmlRpc_v2/", :response => fake_response("System.methodDescription"))
54
+ end
55
+
56
+ it "should call System.methodDescription" do
57
+ Reflex::System.expects(:call).with("System.methodDescription", "System.methodDescription")
58
+ Reflex::System.method_description("System.methodDescription")
59
+ end
60
+
61
+ it "should return return a hash" do
62
+ Reflex::System.method_description("System.methodDescription").should be_an_instance_of(Hash)
63
+ end
64
+
65
+ it "should return a method description" do
66
+ Reflex::System.method_description("System.methodDescription")['method']['description'].should == "Our extended version of System.methodSignature, with named parameters and descriptions."
67
+ end
68
+
69
+ it "should return parameter descriptions" do
70
+ Reflex::System.method_description("System.methodDescription")['parameters']['method']['type'].should == "string"
71
+ Reflex::System.method_description("System.methodDescription")['parameters']['method']['description'].should == "Method to get the description for"
72
+ end
73
+ end
74
+
75
+ describe "method_help" do
76
+ it "should call System.methodHelp" do
77
+ Reflex::System.expects(:call).with("System.methodHelp", "System.methodHelp")
78
+ Reflex::System.method_help("System.methodHelp")
79
+ end
80
+
81
+ # Rest of method_help seems broken
82
+ end
83
+ end
@@ -0,0 +1,5 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Reflex do
4
+ include ReflexSpecHelper
5
+ end
data/spec/schema.rb ADDED
@@ -0,0 +1,15 @@
1
+ ActiveRecord::Schema.define :version => 0 do
2
+ create_table :reflex_connections do |t|
3
+ t.string :provider, :null => false
4
+ t.string :authorizable_type, :null => false
5
+ t.integer :authorizable_id, :null => false
6
+ t.string :uuid, :null => false
7
+ t.timestamps
8
+ end
9
+
10
+ create_table :authorizables do |t|
11
+ t.timestamps
12
+ end
13
+
14
+ add_index :reflex_connections, [:authorizable_type, :authorizable_id]
15
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,66 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'rubygems' unless RUBY_VERSION >= "1.9"
5
+ require 'authlogic'
6
+ require 'reflex'
7
+ require 'spec'
8
+ require 'spec/autorun'
9
+ require 'mocha'
10
+ require 'fakeweb'
11
+ require 'mime/types'
12
+
13
+ TEST_DATABASE_FILE = File.join(File.dirname(__FILE__), '..', 'test.sqlite3')
14
+ File.unlink(TEST_DATABASE_FILE) if File.exist?(TEST_DATABASE_FILE)
15
+ ActiveRecord::Base.establish_connection("adapter" => "sqlite3", "database" => TEST_DATABASE_FILE)
16
+ ActiveRecord::Base.silence do
17
+ ActiveRecord::Migration.verbose = false
18
+ load File.join(File.dirname(__FILE__), 'schema.rb')
19
+ end
20
+
21
+ class Authorizable < ActiveRecord::Base
22
+ end
23
+
24
+ Spec::Runner.configure do |config|
25
+ config.mock_with :mocha
26
+ end
27
+
28
+ module ReflexSpecHelper
29
+ def self.included(base)
30
+ config_file = File.join(File.dirname(__FILE__), 'reflex.yml')
31
+
32
+ if File.exists?(config_file)
33
+ settings = YAML.load(File.open(config_file))
34
+ configuration = settings.inject({}) do |options, (key, value)|
35
+ options[(key.to_sym rescue key) || key] = value
36
+ options
37
+ end
38
+
39
+ Reflex.configure(configuration)
40
+ else
41
+ puts "** [Reflex] #{config_file} does not exist, skipping Reflex configuration"
42
+ end
43
+
44
+ ::XMLRPC::Client.class_eval do
45
+ def call2(method, *args)
46
+ puts "XMLRPC Request: #{method}(#{args.map(&:inspect).join(", ")})" if defined?($debug_response) && $debug_response
47
+ request = create().methodCall(method, *args)
48
+ data = do_rpc(request, false)
49
+ puts "XMLRPC Response:\n#{data}\n" if defined?($debug_response) && $debug_response
50
+ parser().parseMethodResponse(data)
51
+ end
52
+ end
53
+ end
54
+
55
+ def debug_response(&block)
56
+ FakeWeb.allow_net_connect = true
57
+ $debug_response = true
58
+ yield
59
+ $debug_response = false
60
+ FakeWeb.allow_net_connect = false
61
+ end
62
+
63
+ def fake_response(filename, options = {})
64
+ File.join(File.dirname(__FILE__), "fakeweb", filename)
65
+ end
66
+ end