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
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