reflex 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,24 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+ rerun.txt
21
+ test.sqlite3
22
+
23
+ ## PROJECT::SPECIFIC
24
+ reflex.yml
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Tom-Eric Gerritsen (i76)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,193 @@
1
+ = reflex
2
+
3
+ Reflex is a gem that allows you to connect your application to the React Social API.
4
+
5
+ == Install / Usage
6
+
7
+ === 1. Install Authlogic and setup your application
8
+
9
+ Install authlogic (http://github.com/binarylogic/authlogic) in your rails application, and
10
+ set it up according to the authlogic docs (http://rdoc.info/projects/binarylogic/authlogic).
11
+
12
+ Take a look at the authlogic example app (http://github.com/binarylogic/authlogic_example), or
13
+ use it as a basis, if you get stuck.
14
+
15
+ === 2. Install Reflex
16
+
17
+ *WARNING!* Because the reflex gem is not yet available, the notes below are incorrect. For now,
18
+ simply install reflex as a rails plugin and _don't_ add it in your environment.rb or Gemfile:
19
+
20
+ $ script/plugin install git@github.com:i76/reflex.git
21
+
22
+ Add the gem dependencies in your config:
23
+
24
+ ==== Rails 2.3
25
+
26
+ Add the dependencies to your environment:
27
+
28
+ # config/environment.rb
29
+ config.gem "reflex"
30
+
31
+ And install them:
32
+
33
+ $ rake gems:install
34
+
35
+ ==== Rails 3.0 (untested)
36
+
37
+ Add the dependencies to your Gemfile
38
+
39
+ # Gemfile
40
+ gem "reflex"
41
+
42
+ And install them:
43
+
44
+ $ bundle install
45
+ $ bundle lock
46
+
47
+ === 3. Generate the reflex_connections migration
48
+
49
+ Now that we have the reflex gem installed, we need to generate a migration that connects our users to
50
+ a reflex provider:
51
+
52
+ ==== Rails 2.3
53
+
54
+ $ script/generate reflex_connections_migration
55
+
56
+ ==== Rails 3.0 (untested)
57
+
58
+ $ rails generate reflex_connections_migration
59
+
60
+ === 4. Configure the reflex gem
61
+
62
+ Create a reflex configuration file:
63
+
64
+ # config/reflex.yml
65
+ development: &DEFAULTS
66
+ key: development_key
67
+ secret: development_secret
68
+ endpoint: http://social.react.com/XmlRpc_v2/
69
+
70
+ production:
71
+ << DEFAULTS
72
+ key: production_key
73
+ secret: production_secret
74
+
75
+ === 5. Make sure you save your objects properly
76
+
77
+ Save your session objects with a block. Why? Because we need to redirect the user to their login provider
78
+ so that they can authenticate. When we do this, we don't want to execute that block of code, because if
79
+ we do, we will get a DoubleRender error. Using a block allows us to skip that entire block and send the
80
+ user along their way if they choose to authenticate via React's OAuth Server.
81
+
82
+ You probably want to do this in your controllers. It should look something like this:
83
+
84
+ # app/controllers/user_session_controller.rb
85
+ def create
86
+ @user_session.save do |result|
87
+ if result
88
+ flash[:notice] = "Login successful!"
89
+ redirect_back_or_default account_url
90
+ else
91
+ render :action => :new
92
+ end
93
+ end
94
+ end
95
+
96
+ When creating new users, react_profile is set if available. In order to make use of this,
97
+ alter your user class like this:
98
+
99
+ # app/models/user.rb
100
+ class User < ActiveRecord::Base
101
+ acts_as_authentic
102
+
103
+ def react_profile=(profile)
104
+ self.name = profile['real_name'] || profile['user_name']
105
+ end
106
+ end
107
+
108
+ === 6. Add providers to your login form
109
+
110
+ Add providers to your login form:
111
+
112
+ # app/views/new.html.erb
113
+ <h1>Log in</h1>
114
+ <% form_for(@user_session) do |f| %>
115
+ <%= f.error_messages %>
116
+ <h2>Log in with your account</h2>
117
+ <p>
118
+ <%= f.label :login %>
119
+ <br>
120
+ <%= f.text_field :login %>
121
+ </p>
122
+ <p>
123
+ <%= f.label :password %>
124
+ <br>
125
+ <%= f.password_field :password %>
126
+ </p>
127
+ <p><%= f.submit "Login" %></p>
128
+
129
+ <h2>Or log in via:</h2>
130
+ <% Reflex::OAuthServer.get_providers.each do |provider| %>
131
+ <%= f.submit provider, :name => "react_provider" %>
132
+ <br>
133
+ <% end %>
134
+ <% end %>
135
+
136
+ == Connecting existing users to react
137
+
138
+ Ofcourse connecting an existing user to a social network should be as easy and straightforward as
139
+ authenticating a new user. And luckilly it is!
140
+
141
+ Modify your user update method to accept a block:
142
+
143
+ # app/controllers/users_controller.rb
144
+ def update
145
+ @user = User.find(params[:id])
146
+ @user.attributes = params[:attributes]
147
+
148
+ @user.save do |result|
149
+ if result
150
+ flash[:notice] = "User updated successfully!"
151
+ redirect_to(@user)
152
+ else
153
+ render :action => :edit
154
+ end
155
+ end
156
+ end
157
+
158
+ And add the react providers in the view:
159
+
160
+ # app/views/users/edit.html.erb
161
+ <% form_for(@user) do |f| %>
162
+ <%= f.error_messages %>
163
+ <p>
164
+ Connect to a provider:
165
+ <br>
166
+ <% Reflex::OAuthServer.get_providers.each do |provider| %>
167
+ <%= f.submit provider, :name => "react_provider" %>
168
+ <% end %>
169
+ </p>
170
+
171
+ <p><%= f.submit "Save" %></p>
172
+ <% end %>
173
+
174
+ == Roadmap
175
+
176
+ The reflex gem is far from finished. Here are some of the upcoming features:
177
+
178
+ 1. Easily access the React API — If a user connected to, for example twitter,
179
+ then it should be a matter of calling:
180
+ `@user.twitter.update_status("I've connected my Twitter profile")`
181
+
182
+ == Note on Patches/Pull Requests
183
+
184
+ * Fork the project.
185
+ * Make your feature addition or bug fix.
186
+ * Add tests for it. This is important so I don't break it in a future version unintentionally.
187
+ * Commit, do not mess with rakefile, version, or history.
188
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
189
+ * Send me a pull request. Bonus points for topic branches.
190
+
191
+ == Copyright
192
+
193
+ Copyright (c) 2010 Tom-Eric Gerritsen. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,146 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "reflex"
8
+ gem.summary = %Q{Reflex connects your app to the React Social API}
9
+ gem.description = %Q{Reflex is a gem that allows you to connect your application to the React Social API}
10
+ gem.email = "tomeric@i76.nl"
11
+ gem.homepage = "http://github.com/i76/reflex"
12
+ gem.authors = ["Tom-Eric Gerritsen"]
13
+ gem.add_dependency "authlogic", ">= 2.1.3"
14
+ gem.add_dependency "uuidtools", ">= 2.1.1"
15
+ gem.add_development_dependency "cucumber", ">= 0.6.2"
16
+ gem.add_development_dependency "cucumber-rails", ">= 0.2.4"
17
+ gem.add_development_dependency "capybara", ">= 0.3.0"
18
+ gem.add_development_dependency "database_cleaner", ">= 0.4.3"
19
+ gem.add_development_dependency "mocha", ">= 0.9.8"
20
+ gem.add_development_dependency "rspec", ">= 1.2.9"
21
+ gem.add_development_dependency "fakeweb", ">= 1.2.8"
22
+ gem.add_development_dependency "mime-types", ">= 1.16"
23
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
24
+ end
25
+ Jeweler::GemcutterTasks.new
26
+ rescue LoadError
27
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
28
+ end
29
+
30
+ require 'spec/rake/spectask'
31
+ Spec::Rake::SpecTask.new(:spec) do |spec|
32
+ spec.libs << 'lib' << 'spec'
33
+ spec.spec_files = FileList['spec/**/*_spec.rb']
34
+ end
35
+
36
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
37
+ spec.libs << 'lib' << 'spec'
38
+ spec.pattern = 'spec/**/*_spec.rb'
39
+ spec.rcov = true
40
+ end
41
+
42
+ task :spec => :check_dependencies
43
+
44
+ task :default => :spec
45
+
46
+ require 'rake/rdoctask'
47
+ Rake::RDocTask.new do |rdoc|
48
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
49
+
50
+ rdoc.rdoc_dir = 'rdoc'
51
+ rdoc.title = "reflex #{version}"
52
+ rdoc.rdoc_files.include('README*')
53
+ rdoc.rdoc_files.include('lib/**/*.rb')
54
+ end
55
+
56
+ begin
57
+ require 'cucumber/rake/task'
58
+ load 'features/support/rails_root/Rakefile'
59
+
60
+ namespace :cucumber do
61
+ Cucumber::Rake::Task.new({:ok => ['db:reset']}, 'Run features that should pass') do |t|
62
+ t.fork = true # You may get faster startup if you set this to false
63
+ t.profile = 'default'
64
+ end
65
+
66
+ Cucumber::Rake::Task.new({:wip => ['db:reset']}, 'Run features that are being worked on') do |t|
67
+ t.fork = true # You may get faster startup if you set this to false
68
+ t.profile = 'wip'
69
+ end
70
+
71
+ desc 'Run all features'
72
+ task :all => [:ok, :wip]
73
+ end
74
+ desc 'Alias for cucumber:ok'
75
+ task :cucumber => 'cucumber:ok'
76
+
77
+ task :default => :cucumber
78
+
79
+ task :features => :cucumber do
80
+ STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
81
+ end
82
+
83
+ rescue LoadError
84
+ desc 'cucumber rake task not available (cucumber not installed)'
85
+ task :cucumber do
86
+ abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
87
+ end
88
+ end
89
+
90
+ namespace :reflex do
91
+ desc "Configure reflex"
92
+ task :config do
93
+ require 'yaml'
94
+ require 'lib/reflex'
95
+
96
+ config_file = File.join(File.dirname(__FILE__), 'spec', 'reflex.yml')
97
+
98
+ if File.exists?(config_file)
99
+ settings = YAML.load(File.open(config_file))
100
+ configuration = settings.inject({}) do |options, (key, value)|
101
+ options[(key.to_sym rescue key) || key] = value
102
+ options
103
+ end
104
+
105
+ Reflex.configure(configuration)
106
+ else
107
+ puts "** [Reflex] #{config_file} does not exist, skipping Reflex configuration"
108
+ end
109
+ end
110
+
111
+ desc "List methods that have not yet been added to the library, but are available"
112
+ task :missing_methods do
113
+ Rake::Task['reflex:config'].invoke
114
+
115
+ def class_exists? kls
116
+ begin
117
+ kls = constantize(kls)
118
+ kls.kind_of? Class
119
+ rescue Exception
120
+ false
121
+ end
122
+ end
123
+
124
+ def constantize(kls)
125
+ Object.module_eval("::#{kls}", __FILE__, __LINE__)
126
+ end
127
+
128
+ all_methods = Reflex::System.list_methods
129
+ all_methods.each do |method|
130
+ remote_class, camel_cased_method = method.split('.')
131
+ local_class = "Reflex::#{remote_class}"
132
+ local_method = camel_cased_method.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').gsub(/([a-z\d])([A-Z])/,'\1_\2').tr("-", "_").downcase.to_sym
133
+
134
+ class_exists = class_exists?(local_class)
135
+ method_exists = class_exists && constantize(local_class).respond_to?(local_method)
136
+
137
+ unless class_exists && method_exists
138
+ method_description = Reflex::System.method_description(method)
139
+ parameters = method_description['parameters'].map { |name, doc| "(#{doc['type']}) #{name} : #{doc['description']}" }.join("\n ")
140
+ description = method_description['method']['description']
141
+
142
+ puts "\n == #{method} ==\n Local: #{local_class}.#{local_method}\n Parameters: #{parameters}\nDescription: #{description}\n"
143
+ end
144
+ end
145
+ end
146
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.2
data/cucumber.yml ADDED
@@ -0,0 +1,7 @@
1
+ <%
2
+ rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
3
+ rerun_opts = rerun.to_s.strip.empty? ? "--format progress features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
4
+ std_opts = "#{rerun_opts} --format rerun --out rerun.txt --strict --tags ~@wip"
5
+ %>
6
+ default: <%= std_opts %>
7
+ wip: --tags @wip:3 --wip features
@@ -0,0 +1,18 @@
1
+ Feature: Connect to provider
2
+ In order to use the new social login features
3
+ As an existing user
4
+ I want to connect my profile to a social provider
5
+
6
+ Scenario: Connect to a provider
7
+ Given a registered user exists with login: "marshall", password: "awesome"
8
+ And I am logged in as "marshall" with password "awesome"
9
+ And I am on my profile
10
+ And I follow "Edit my profile"
11
+
12
+ Given a token access is expected for an unregistered user
13
+ And a user id is set for the available token
14
+ When I press "Twitter"
15
+ # And I press "Allow"
16
+
17
+ When I go to my profile
18
+ Then I should see "Twitter"
@@ -0,0 +1,50 @@
1
+ Feature: Social authentication
2
+ In order to allow visitors to get access to certain features
3
+ As a visitor who is connected to one of our social providers
4
+ I want to login via one of these social providers
5
+
6
+ Scenario: Logging in for the first time
7
+ Given I am on the homepage
8
+ And I follow "Login"
9
+
10
+ Given a token request is expected
11
+ When I press "Twitter"
12
+
13
+ Given a token access is expected for an unregistered user
14
+ And a session profile fetched is expected
15
+ And a user id is set for the available token
16
+ When I press "Allow"
17
+
18
+ Then I should be logged in
19
+ And I should see "Marshall Eriksen"
20
+
21
+ Scenario: Logging in for the second time
22
+ Given a "Twitter" user exists
23
+ And I am on the homepage
24
+ Then I should see "Marshall Eriksen"
25
+
26
+ When I follow "Login"
27
+
28
+ Given a token request is expected
29
+ When I press "Twitter"
30
+
31
+ Given a token access is expected for a registered user
32
+ When I press "Allow"
33
+ And I should be logged in
34
+ And 1 user should exist
35
+
36
+ When I follow "My Profile"
37
+ Then I should see "Marshall Eriksen"
38
+
39
+ Scenario: Updating my profile
40
+ Given I login as the "Twitter" user "Marshall Eriksen"
41
+ And I am on the homepage
42
+
43
+ When I follow "My Profile"
44
+ And I follow "Edit my profile"
45
+ And I fill in "Name" with "Big Fudge"
46
+ And I press "Save"
47
+ Then I should see "Succesfully updated user"
48
+
49
+ When I follow "My Profile"
50
+ Then I should see "Big Fudge"
@@ -0,0 +1,93 @@
1
+ Given /^a "([^\"]*)" user exists$/ do |provider|
2
+ Given "a \"#{provider}\" user exists with name: \"Marshall Eriksen\""
3
+ end
4
+
5
+ Given /^a "([^\"]*)" user exists with name: "([^\"]*)"$/ do |provider, name|
6
+ record = User.new(:name => name)
7
+ record.reflex_connections.build(:provider => 'Twitter')
8
+ record.save!
9
+ end
10
+
11
+ Given /^I login as the "([^\"]*)" user "([^\"]*)"$/ do |provider, name|
12
+ Given "a \"#{provider}\" user exists with name: \"#{name}\""
13
+ And "I am on the login page"
14
+
15
+ Given "a token request is expected"
16
+ When "I press \"Twitter\""
17
+
18
+ Given "a token access is expected for a registered user"
19
+ When "I press \"Allow\""
20
+
21
+ Then "I should be logged in"
22
+ end
23
+
24
+ Given /^([0-9]+) users? should exist$/ do |count|
25
+ User.count.should eql(count.to_i)
26
+ end
27
+
28
+ Given /^a token request is expected$/ do
29
+ @provider ||= 'Twitter'
30
+
31
+ Reflex::OAuthServer.expects(:token_request).with(@provider).returns({
32
+ 'redirectUrl' => 'https://twitter.com/fake_controller/oauth/authorize',
33
+ 'reactOAuthSession' => 'FAKE_OAUTH_TOKEN'
34
+ })
35
+ end
36
+
37
+ Given /^a token access is expected for an unregistered user$/ do
38
+ @provider ||= 'Twitter'
39
+
40
+ Reflex::OAuthServer.expects(:token_access).returns({
41
+ 'connectedWithProvider' => @provider,
42
+ 'reactOAuthSession' => 'FAKE_REACT_OAUTH_SESSION'
43
+ })
44
+ end
45
+
46
+ Given /^a token access is expected for a registered user$/ do
47
+ @provider ||= 'Twitter'
48
+ application_user_id = User.last.reflex_connections.first.uuid
49
+
50
+ Reflex::OAuthServer.expects(:token_access).returns({
51
+ 'connectedWithProvider' => @provider,
52
+ 'reactOAuthSession' => 'FAKE_REACT_OAUTH_SESSION',
53
+ 'applicationUserId' => application_user_id
54
+ })
55
+ end
56
+
57
+ Given /^a session profile fetched is expected$/ do
58
+ Reflex::OAuthServer.expects(:session_get_profile).with('FAKE_OAUTH_TOKEN').returns({
59
+ 'real_name' => 'Marshall Eriksen',
60
+ 'user_name' => 'marshall',
61
+ 'profile_picture' => 'http://awesome.com/marshall.jpg'
62
+ })
63
+ end
64
+
65
+ Given /^a user id is set for the available token$/ do
66
+ @provider ||= 'Twitter'
67
+
68
+ Reflex::OAuthServer.expects(:token_set_user_id).returns({
69
+ 'applicationUserId' => 1,
70
+ 'connectedWithProvider' => @provider,
71
+ })
72
+ end
73
+
74
+ Given /^a registered user exists with login: "([^\"]*)", password: "([^\"]*)"$/ do |login, password|
75
+ User.create!(:login => login, :name => login, :password => password, :password_confirmation => password)
76
+ end
77
+
78
+ Given /^I am logged in as "([^\"]*)" with password "([^\"]*)"$/ do |login, password|
79
+ When "I am on the login page"
80
+ And "I fill in \"Login\" with \"#{login}\""
81
+ And "I fill in \"Password\" with \"#{password}\""
82
+ And "I press \"Login\""
83
+ end
84
+
85
+ Then /^I should be logged out$/ do
86
+ Then "I should not see \"My Profile\""
87
+ And "I should see \"Login\""
88
+ end
89
+
90
+ Then /^I should be logged in$/ do
91
+ Then "I should see \"My Profile\""
92
+ And "I should see \"Logout\""
93
+ end