adva_user 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README +114 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/adva_user.gemspec +17 -0
- data/app/controllers/admin/base_account_controller.rb +13 -0
- data/app/controllers/admin/users_controller.rb +95 -0
- data/app/controllers/password_controller.rb +36 -0
- data/app/controllers/session_controller.rb +30 -0
- data/app/helpers/users_helper.rb +27 -0
- data/app/models/account.rb +7 -0
- data/app/models/membership.rb +16 -0
- data/app/models/password_mailer.rb +43 -0
- data/app/models/user.rb +106 -0
- data/app/views/admin/users/_form.html.erb +29 -0
- data/app/views/admin/users/_sidebar.html.erb +8 -0
- data/app/views/admin/users/edit.html.erb +7 -0
- data/app/views/admin/users/index.html.erb +13 -0
- data/app/views/admin/users/new.html.erb +5 -0
- data/app/views/admin/users/show.html.erb +27 -0
- data/app/views/layouts/login.html.erb +24 -0
- data/app/views/password/edit.html.erb +14 -0
- data/app/views/password/new.html.erb +13 -0
- data/app/views/password_mailer/reset_password_email.html.erb +3 -0
- data/app/views/password_mailer/updated_password_email.html.erb +1 -0
- data/app/views/session/new.html.erb +17 -0
- data/config/initializers/menus.rb +25 -0
- data/config/routes.rb +14 -0
- data/db/migrate/20080402000001_create_users_table.rb +33 -0
- data/db/migrate/20080402000005_create_memberships_table.rb +13 -0
- data/db/migrate/20090625124502_create_accounts.rb +13 -0
- data/db/migrate/20090625133231_add_account_to_user.rb +10 -0
- data/lib/action_controller/authenticate_anonymous.rb +70 -0
- data/lib/action_controller/authenticate_user.rb +201 -0
- data/lib/active_record/belongs_to_author.rb +37 -0
- data/lib/adva_user.rb +28 -0
- data/lib/adva_user/version.rb +3 -0
- data/lib/login/helper_integration.rb +11 -0
- data/lib/login/mail_config.rb +39 -0
- data/test/contexts.rb +42 -0
- data/test/fixtures.rb +18 -0
- data/test/functional/admin/users_controller_test.rb +176 -0
- data/test/functional/password_controller_test.rb +96 -0
- data/test/functional/session_controller_test.rb +1 -0
- data/test/functional/user_controller_test.rb +95 -0
- data/test/integration/anonymous_login_test.rb +39 -0
- data/test/integration/edit_user_test.rb +44 -0
- data/test/integration/memberships_test.rb +52 -0
- data/test/integration/user_deletion_test.rb +27 -0
- data/test/integration/user_login_test.rb +53 -0
- data/test/integration/user_login_with_remember_me_test.rb +20 -0
- data/test/integration/user_registration_test.rb +64 -0
- data/test/test_helper.rb +1 -0
- data/test/unit/cells/user_cell_test.rb +13 -0
- data/test/unit/helpers/users_helper_test.rb +52 -0
- data/test/unit/models/account_test.rb +21 -0
- data/test/unit/models/anonymous_test.rb +54 -0
- data/test/unit/models/password_mailer_test.rb +26 -0
- data/test/unit/models/user_mailer_test.rb +16 -0
- data/test/unit/models/user_test.rb +173 -0
- data/vendor/gems/authentication/.gitignore +17 -0
- data/vendor/gems/authentication/Gemfile +4 -0
- data/vendor/gems/authentication/LICENSE +22 -0
- data/vendor/gems/authentication/MIT-LICENSE +38 -0
- data/vendor/gems/authentication/README +39 -0
- data/vendor/gems/authentication/README.md +29 -0
- data/vendor/gems/authentication/RUNNING_UNIT_TESTS +13 -0
- data/vendor/gems/authentication/Rakefile +61 -0
- data/vendor/gems/authentication/authentication.gemspec +17 -0
- data/vendor/gems/authentication/lib/authentication.rb +270 -0
- data/vendor/gems/authentication/lib/authentication/active_record_extensions.rb +11 -0
- data/vendor/gems/authentication/lib/authentication/bogus.rb +13 -0
- data/vendor/gems/authentication/lib/authentication/hash_helper.rb +26 -0
- data/vendor/gems/authentication/lib/authentication/ldap.rb +49 -0
- data/vendor/gems/authentication/lib/authentication/remember_me.rb +52 -0
- data/vendor/gems/authentication/lib/authentication/salted_hash.rb +53 -0
- data/vendor/gems/authentication/lib/authentication/single_token.rb +53 -0
- data/vendor/gems/authentication/lib/authentication/version.rb +3 -0
- data/vendor/gems/authentication/lib/radius/dictionary +207 -0
- data/vendor/gems/authentication/test_backup/abstract_unit.rb +30 -0
- data/vendor/gems/authentication/test_backup/active_record_extension_test.rb +17 -0
- data/vendor/gems/authentication/test_backup/authentication_test.rb +231 -0
- data/vendor/gems/authentication/test_backup/database.yml +12 -0
- data/vendor/gems/authentication/test_backup/fixtures/user.rb +3 -0
- data/vendor/gems/authentication/test_backup/fixtures/users.yml +3 -0
- data/vendor/gems/authentication/test_backup/options_test.rb +100 -0
- data/vendor/gems/authentication/test_backup/remember_me_test.rb +41 -0
- data/vendor/gems/authentication/test_backup/salted_hash_test.rb +38 -0
- data/vendor/gems/authentication/test_backup/schema.rb +10 -0
- data/vendor/gems/authentication/test_backup/single_token_test.rb +44 -0
- data/vendor/gems/authentication/test_backup/test_helper.rb +8 -0
- metadata +157 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
# Auto-registers and re-authenticates anonymous users based on a single token
|
2
|
+
# that's stored in the session. This is for anonymous posting of blog comments,
|
3
|
+
# editing wikipages etc. and allows to do such things as:
|
4
|
+
#
|
5
|
+
# * store user information in the user table (which keeps the model and db
|
6
|
+
# structure clean) and
|
7
|
+
# * allow users to (e.g.) edit their comment based on this anonymous login.
|
8
|
+
|
9
|
+
module ActionController
|
10
|
+
module AuthenticateAnonymous
|
11
|
+
def self.included(base)
|
12
|
+
base.extend ClassMethods
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
def authenticates_anonymous_user
|
17
|
+
return if authenticates_anonymous_user?
|
18
|
+
include InstanceMethods
|
19
|
+
alias_method_chain :current_user, :anonymous
|
20
|
+
alias_method_chain :authenticated?, :anonymous
|
21
|
+
end
|
22
|
+
|
23
|
+
def authenticates_anonymous_user?
|
24
|
+
included_modules.include? InstanceMethods
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module InstanceMethods
|
29
|
+
def current_user_with_anonymous
|
30
|
+
@current_user ||= (current_user_without_anonymous || login_or_register_anonymous)
|
31
|
+
end
|
32
|
+
|
33
|
+
def authenticated_with_anonymous?
|
34
|
+
!!current_user and !current_user.anonymous?
|
35
|
+
end
|
36
|
+
|
37
|
+
def login_or_register_anonymous
|
38
|
+
anonymous = try_login_anonymous || User.anonymous
|
39
|
+
anonymous = register_or_update_anonymous anonymous if params[:user]
|
40
|
+
login_anonymous! anonymous if anonymous
|
41
|
+
anonymous
|
42
|
+
end
|
43
|
+
|
44
|
+
def try_login_anonymous
|
45
|
+
# try to authenticate if token is present
|
46
|
+
validate_token User, session[:anonymous_token] if session[:anonymous_token]
|
47
|
+
end
|
48
|
+
|
49
|
+
def register_or_update_anonymous(anonymous)
|
50
|
+
# if :name and :email params are passed either register a new Anonymous or update the existing one
|
51
|
+
anonymous.update_attributes params[:user].merge(request_info)
|
52
|
+
anonymous
|
53
|
+
end
|
54
|
+
|
55
|
+
def login_anonymous!(anonymous)
|
56
|
+
# set a new session token and expiration
|
57
|
+
token = anonymous.assign_token('anonymous', 3.hour.from_now)
|
58
|
+
anonymous.save
|
59
|
+
session[:anonymous_token] = "#{anonymous.id};#{token}"
|
60
|
+
cookies[:aid] = anonymous.id.to_s unless anonymous.new_record?
|
61
|
+
end
|
62
|
+
|
63
|
+
def request_info
|
64
|
+
{ :ip => request.env["REMOTE_ADDR"],
|
65
|
+
:agent => request.env["HTTP_USER_AGENT"],
|
66
|
+
:referer => request.env["HTTP_REFERER"] }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
module ActionController
|
2
|
+
|
3
|
+
# Module automatically mixed into the all controllers making the
|
4
|
+
# application of authentication easy. See
|
5
|
+
# Login::ControllerIntegration::ClassMethods for how to apply
|
6
|
+
# authentication.
|
7
|
+
module AuthenticateUser
|
8
|
+
def self.included(target)
|
9
|
+
target.extend(ClassMethods)
|
10
|
+
target.send(:include, InstanceMethods)
|
11
|
+
target.helper_method(:logged_in?, :authenticated?)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Methods available as macro-style methods on any controller
|
15
|
+
module ClassMethods
|
16
|
+
|
17
|
+
# Sets up the controller so that authentication is required. If
|
18
|
+
# the user is not authenticated then they will be redirected to
|
19
|
+
# the login screen.
|
20
|
+
#
|
21
|
+
# The page requested will be saved so that once the login has
|
22
|
+
# occured they will be sent back to the page they first
|
23
|
+
# requested. If no page was requested (they went to the login
|
24
|
+
# page directly) then they will be directed to profiles/home
|
25
|
+
# after login which is a placeholder for the app to override.
|
26
|
+
#
|
27
|
+
# Options given are passed directly to the before_filter method
|
28
|
+
# so feel free to provide :only and :except options.
|
29
|
+
def authentication_required
|
30
|
+
before_filter :require_authentication
|
31
|
+
end
|
32
|
+
|
33
|
+
# Will remove authentication from certain actions. Options given
|
34
|
+
# are passed directly to skip_before_filter so feel free to use
|
35
|
+
# :only and :except options.
|
36
|
+
#
|
37
|
+
# This method is useful in cases where you have locked down the
|
38
|
+
# entire application by putting authentication_required in your
|
39
|
+
# ApplicationController but then want to open an action back up
|
40
|
+
# in a specific controller.
|
41
|
+
def no_authentication_required
|
42
|
+
skip_before_filter :require_authentication
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Methods callable from within actions
|
47
|
+
module InstanceMethods
|
48
|
+
def authenticate_user(credentials)
|
49
|
+
User.authenticate(credentials).tap do |user|
|
50
|
+
if user
|
51
|
+
# prevent session hijacking - unnecessary according to http://dev.rubyonrails.org/ticket/10108
|
52
|
+
# reset_session_except :return_location
|
53
|
+
session[:uid] = user.id
|
54
|
+
set_user_cookie!(user)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Will retrieve the current_user. Will not force a login but
|
60
|
+
# simply load the current user if a person is logged in. If
|
61
|
+
# you need the user object loaded with extra options (such as
|
62
|
+
# eager loading) then create a private method called
|
63
|
+
# "user_find_options" on your controller that returns a hash
|
64
|
+
# of the find options you want.
|
65
|
+
#
|
66
|
+
# This method will also inform the models of the current user
|
67
|
+
# if the current user is logged in and the "User" class responds
|
68
|
+
# to the class method current_user=. This is a nice way to
|
69
|
+
# communciate the current user down to the model level for
|
70
|
+
# model-level security. This means you will want to call this
|
71
|
+
# method at least once before using the model-level security.
|
72
|
+
# Usually you will call it in a before filter. This method is
|
73
|
+
# called automatically when authentication_required is applied to
|
74
|
+
# an action.
|
75
|
+
def current_user
|
76
|
+
@current_user ||= begin
|
77
|
+
# Check for session[:uid] here? That would mean that for token auth the
|
78
|
+
# user always needs to be logged out (e.g. in UserController#create).
|
79
|
+
# Looks a bit more robust this way:
|
80
|
+
try_login
|
81
|
+
if session && session[:uid]
|
82
|
+
user = find_current_user
|
83
|
+
set_user_cookie!(user)
|
84
|
+
user
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def authenticated?
|
90
|
+
!!current_user
|
91
|
+
end
|
92
|
+
alias :logged_in? :authenticated?
|
93
|
+
|
94
|
+
# killed this because it's just the wrong way to do it
|
95
|
+
#
|
96
|
+
# # Will store the current params so that we can return here on
|
97
|
+
# # successful login. If you want to redirect to the login yourself
|
98
|
+
# # (perhaps you are applying your own security instead of just
|
99
|
+
# # determining if the user is logged in) then you will want to
|
100
|
+
# # call this before issuing your redirect to the login screen.
|
101
|
+
# def store_return_location
|
102
|
+
# session[:return_location] = params
|
103
|
+
# end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
# Will actually test to see if the user is authorized
|
108
|
+
def require_authentication
|
109
|
+
# No matter what the app does a user can always login, forgot
|
110
|
+
# password and register. The controllers provided by this
|
111
|
+
# plugin alreaddy have these controllers/actions on an
|
112
|
+
# exception list but this prevents a mistake an overridden
|
113
|
+
# controller from preventing the normal login behavior.
|
114
|
+
%w(session password user).each do |c|
|
115
|
+
%w(new create).each do |a|
|
116
|
+
return if (controller_name == c) && (action_name == a)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# If we cannot get the current user store the requested page
|
121
|
+
# and send them to the login page.
|
122
|
+
if current_user.nil? or current_user.anonymous?
|
123
|
+
redirect_to login_url(:return_to => request.url) and false
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def logout
|
128
|
+
reset_session
|
129
|
+
forget_me!
|
130
|
+
end
|
131
|
+
|
132
|
+
def forget_me!
|
133
|
+
cookies[:remember_me] = nil
|
134
|
+
cookies[:uid] = nil
|
135
|
+
cookies[:uname] = nil
|
136
|
+
end
|
137
|
+
|
138
|
+
def remember_me!
|
139
|
+
token = current_user.assign_token!('remember me')
|
140
|
+
cookies[:remember_me] = { :value => "#{current_user.id};#{token}", :expires => 10.years.from_now }
|
141
|
+
end
|
142
|
+
|
143
|
+
def set_user_cookie!(user = current_user)
|
144
|
+
if user
|
145
|
+
cookies[:uid] = user.id.to_s
|
146
|
+
cookies[:uname] = user.name
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
# There are a few ways that a user can login without going through
|
151
|
+
# a login screen. These methods all rely on authenticating with
|
152
|
+
# the information given in the request. If any of these methods
|
153
|
+
# are successful then session[:uid] will be set with the current
|
154
|
+
# user id and current_user will return the current user
|
155
|
+
def try_login
|
156
|
+
if user = http_auth_login || validation_login || remember_me_login
|
157
|
+
session[:uid] = user.id
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# Will attempt to authenticate with HTTP Auth. HTTP Auth will not
|
162
|
+
# be required. We are just checking if it is provided mainly for
|
163
|
+
# RESTful requests.
|
164
|
+
def http_auth_login
|
165
|
+
# FIXME: Implement
|
166
|
+
end
|
167
|
+
|
168
|
+
# Will use the URL param :token to see if we can do a token
|
169
|
+
# authentication.
|
170
|
+
def validation_login
|
171
|
+
validate_token User, params[:token]
|
172
|
+
end
|
173
|
+
|
174
|
+
# Will check for a :remember_me cookie for a token that will
|
175
|
+
# authenticate the user.
|
176
|
+
def remember_me_login
|
177
|
+
validate_token User, cookies[:remember_me]
|
178
|
+
end
|
179
|
+
|
180
|
+
# The tokens are stored in various places as id;token. This method
|
181
|
+
# will split that out and validate it. If everything is successful
|
182
|
+
# then the user object is returned. Otherwise nil is returned.
|
183
|
+
# The full token should be passed in.
|
184
|
+
def validate_token(klass, token, options = {})
|
185
|
+
return nil if token.blank?
|
186
|
+
return nil unless token =~ /\;/
|
187
|
+
|
188
|
+
uid, token = token.split ';'
|
189
|
+
if object = klass.find_by_id(uid)
|
190
|
+
return object if object.authenticate(token)
|
191
|
+
end
|
192
|
+
nil
|
193
|
+
end
|
194
|
+
|
195
|
+
def find_current_user
|
196
|
+
User.find_by_id(session[:uid])
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module BelongsToAuthor
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ActMacro
|
5
|
+
end
|
6
|
+
|
7
|
+
module ActMacro
|
8
|
+
def belongs_to_user(*args)
|
9
|
+
options = args.extract_options!
|
10
|
+
args = (args.empty? ? [:user] : args)
|
11
|
+
belongs_to_cacheable *args.dup << options # FIXME should not be polymorphic!
|
12
|
+
|
13
|
+
args.each do |name|
|
14
|
+
class_eval <<-code, __FILE__, __LINE__
|
15
|
+
def #{name}_ip
|
16
|
+
#{name}.ip if #{name} && #{name}.respond_to?(:ip)
|
17
|
+
end
|
18
|
+
|
19
|
+
def #{name}_agent
|
20
|
+
#{name}.agent if #{name} && #{name}.respond_to?(:agent)
|
21
|
+
end
|
22
|
+
|
23
|
+
def #{name}_referer
|
24
|
+
#{name}.referer if #{name} && #{name}.respond_to?(:referer)
|
25
|
+
end
|
26
|
+
code
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def belongs_to_author(*args)
|
31
|
+
options = args.extract_options!
|
32
|
+
args = (args.empty? ? [:author] : args) << options
|
33
|
+
belongs_to_user *args
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/adva_user.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# require "adva_user/version"
|
2
|
+
|
3
|
+
# load vendored gems
|
4
|
+
Dir["#{File.expand_path("#{File.dirname(__FILE__)}/../vendor/gems")}/**/lib"].each do |vendored_gem_path|
|
5
|
+
$: << vendored_gem_path
|
6
|
+
end
|
7
|
+
require "authentication"
|
8
|
+
|
9
|
+
require "rails"
|
10
|
+
|
11
|
+
require "action_controller/authenticate_user"
|
12
|
+
require "action_controller/authenticate_anonymous"
|
13
|
+
require "active_record/belongs_to_author"
|
14
|
+
require "login/helper_integration"
|
15
|
+
|
16
|
+
module AdvaUser
|
17
|
+
class Engine < Rails::Engine
|
18
|
+
initializer "adva_user.init" do
|
19
|
+
ActionController::Base.send :include, ActionController::AuthenticateUser
|
20
|
+
ActionController::Base.send :include, ActionController::AuthenticateAnonymous
|
21
|
+
ActiveRecord::Base.send :include, ActiveRecord::BelongsToAuthor
|
22
|
+
ActionView::Base.send :include, Login::HelperIntegration
|
23
|
+
|
24
|
+
Event.observers << 'UserMailer'
|
25
|
+
Event.observers << 'PasswordMailer'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Login
|
2
|
+
# Automatically mixed into all views for utility functions.
|
3
|
+
module HelperIntegration
|
4
|
+
|
5
|
+
# Returns the current user at the view level. Everything said
|
6
|
+
# about the current_user method in the
|
7
|
+
# Login::ControllerIntegration::InstanceMethods module
|
8
|
+
# applies to this method as well.
|
9
|
+
def current_user; controller.current_user end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Login
|
2
|
+
|
3
|
+
# The purpose of this module is to provide an application some control
|
4
|
+
# over how the messages are sent without having to overwrite blocks
|
5
|
+
# of code. We do this through simple constants. The two constants
|
6
|
+
# currently are:
|
7
|
+
#
|
8
|
+
# SUBJECT_PREFIX::
|
9
|
+
# Text that is before every message subject. By default this is not
|
10
|
+
# used. You may want to put something like the website here.
|
11
|
+
# NOTIFICATIONS_FROM::
|
12
|
+
# Who the message appears to be coming from. By default this is
|
13
|
+
# postmaster@yourdomain.com
|
14
|
+
#
|
15
|
+
# If you want to access these same values in your own mailers just
|
16
|
+
# mix them into your mailers and the methods will be available.
|
17
|
+
module MailConfig
|
18
|
+
protected
|
19
|
+
|
20
|
+
# Will return subject prefix
|
21
|
+
def subject_prefix
|
22
|
+
return "[#{SUBJECT_PREFIX}] " if Object.const_defined?('SUBJECT_PREFIX')
|
23
|
+
''
|
24
|
+
end
|
25
|
+
|
26
|
+
# Email message appear to come from. The constant takes priority
|
27
|
+
# but if no constant is defined then the email is extracted from
|
28
|
+
# the given param which can be any link that you want the email
|
29
|
+
# to appear to come from.
|
30
|
+
def system_email(extract_from)
|
31
|
+
return NOTIFICATIONS_FROM if Object.const_defined?('NOTIFICATIONS_FROM')
|
32
|
+
if host = URI.parse(extract_from).host
|
33
|
+
host = host.split '.'
|
34
|
+
host.shift if host.first =~ /www/i
|
35
|
+
"postmaster@#{host * '.'}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/test/contexts.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
class Test::Unit::TestCase
|
2
|
+
def login(user)
|
3
|
+
@user = user
|
4
|
+
stub(@controller).current_user.returns(user)
|
5
|
+
end
|
6
|
+
|
7
|
+
share :no_user do
|
8
|
+
before do
|
9
|
+
User.delete_all
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
share :a_user do
|
14
|
+
before do
|
15
|
+
@user = User.first
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def valid_user_params
|
20
|
+
{ :first_name => 'first name',
|
21
|
+
:last_name => 'last name',
|
22
|
+
:email => 'email@email.org',
|
23
|
+
:password => 'password',
|
24
|
+
:homepage => 'http://homepage.org' }
|
25
|
+
end
|
26
|
+
|
27
|
+
share :valid_user_params do
|
28
|
+
before { @params = { :user => valid_user_params } }
|
29
|
+
end
|
30
|
+
|
31
|
+
share :invalid_user_params do
|
32
|
+
before { @params = { :user => valid_user_params.update(:first_name => '') } }
|
33
|
+
end
|
34
|
+
|
35
|
+
share :invalid_user_params do
|
36
|
+
before { @params = { :user => valid_user_params.update(:email => '') } }
|
37
|
+
end
|
38
|
+
|
39
|
+
share :invalid_user_params do
|
40
|
+
before { @params = { :user => valid_user_params.update(:password => '') } }
|
41
|
+
end
|
42
|
+
end
|
data/test/fixtures.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
user1 = User.create! :first_name => 'user1',
|
2
|
+
:email => 'user1@example.com',
|
3
|
+
:password => 'a password',
|
4
|
+
:verified_at => Time.now
|
5
|
+
user2 = User.create! :first_name => 'user2',
|
6
|
+
:email => 'user2@example.com',
|
7
|
+
:password => 'a password',
|
8
|
+
:verified_at => Time.now
|
9
|
+
user3 = User.create! :first_name => 'user3',
|
10
|
+
:email => 'user3@example.com',
|
11
|
+
:password => 'a password',
|
12
|
+
:verified_at => Time.now
|
13
|
+
user4 = User.create! :first_name => 'user4',
|
14
|
+
:email => 'user4@example.com',
|
15
|
+
:password => 'a password',
|
16
|
+
:verified_at => Time.now
|
17
|
+
|
18
|
+
account = Account.create! :name => 'an account', :users => [ user1, user2, user3 ]
|