tournament 3.0.3 → 3.1.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.
- data/History.txt +5 -0
- data/lib/tournament/bracket.rb +9 -5
- data/lib/tournament/pool.rb +15 -10
- data/lib/tournament.rb +1 -1
- data/webgui/app/controllers/reports_controller.rb +10 -4
- data/webgui/app/controllers/users_controller.rb +61 -0
- data/webgui/app/models/user.rb +31 -3
- data/webgui/app/models/user_mailer.rb +7 -0
- data/webgui/app/views/sessions/new.html.erb +2 -0
- data/webgui/app/views/user_mailer/password_reset_notification.erb +7 -0
- data/webgui/app/views/users/lost_password.html.erb +20 -0
- data/webgui/app/views/users/reset_password.html.erb +15 -0
- data/webgui/config/environments/development.rb +1 -1
- data/webgui/config/routes.rb +8 -6
- data/webgui/db/migrate/20100312053540_add_password_reset_code.rb +9 -0
- data/webgui/db/schema.rb +92 -0
- data/webgui/doc/README_FOR_APP +47 -4
- data/webgui/lib/tasks/possibility.rake +1 -1
- data/webgui/vendor/plugins/restful_authentication/LICENSE +20 -0
- data/webgui/vendor/plugins/restful_authentication/README.textile +25 -25
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/authenticated_generator.rb +19 -19
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/authenticated_test_helper.rb +1 -1
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/accounts.feature +109 -0
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/{stories/users/sessions.story → features/sessions.feature} +44 -44
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_env.rb +9 -0
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_navigation_steps.rb +48 -0
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_resource_steps.rb +178 -0
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_response_steps.rb +169 -0
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/{stories/rest_auth_stories_helper.rb → features/step_definitions/rest_auth_features_helper.rb} +5 -5
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/user_steps.rb +131 -0
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/model.rb +2 -2
- metadata +17 -11
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/rest_auth_stories.rb +0 -22
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/ra_navigation_steps.rb +0 -49
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/ra_resource_steps.rb +0 -179
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/ra_response_steps.rb +0 -171
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/user_steps.rb +0 -153
- data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/users/accounts.story +0 -186
@@ -0,0 +1,178 @@
|
|
1
|
+
# The flexible code for resource testing came out of code from Ben Mabey
|
2
|
+
# http://www.benmabey.com/2008/02/04/rspec-plain-text-stories-webrat-chunky-bacon/
|
3
|
+
|
4
|
+
#
|
5
|
+
# Construct resources
|
6
|
+
#
|
7
|
+
|
8
|
+
#
|
9
|
+
# Build a resource as described, store it as an @instance variable. Ex:
|
10
|
+
# "Given a user with login: 'mojojojo'"
|
11
|
+
# produces a User instance stored in @user with 'mojojojo' as its login
|
12
|
+
# attribute.
|
13
|
+
#
|
14
|
+
Given "a $resource instance with $attributes" do |resource, attributes|
|
15
|
+
klass, instance, attributes = parse_resource_args resource, attributes
|
16
|
+
instance = klass.new(attributes)
|
17
|
+
instance.save!
|
18
|
+
find_resource(resource, attributes).should_not be_nil
|
19
|
+
keep_instance! resource, instance
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
# Stuff attributes into a preexisting @resource
|
24
|
+
# "And the user has thac0: 3"
|
25
|
+
# takes the earlier-defined @user instance and sets its thac0 to '3'.
|
26
|
+
#
|
27
|
+
Given "the $resource has $attributes" do |resource, attributes|
|
28
|
+
klass, instance, attributes = parse_resource_args resource, attributes
|
29
|
+
attributes.each do |attr, val|
|
30
|
+
instance.send("#{attr}=", val)
|
31
|
+
end
|
32
|
+
instance.save!
|
33
|
+
find_resource(resource, attributes).should_not be_nil
|
34
|
+
keep_instance! resource, instance
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Destroy all for this resource
|
39
|
+
#
|
40
|
+
Given "no $resource with $attr: '$val' exists" do |resource, attr, val|
|
41
|
+
klass, instance = parse_resource_args resource
|
42
|
+
klass.destroy_all(attr.to_sym => val)
|
43
|
+
instance = find_resource resource, attr.to_sym => val
|
44
|
+
instance.should be_nil
|
45
|
+
keep_instance! resource, instance
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# Then's for resources
|
50
|
+
#
|
51
|
+
|
52
|
+
# Resource like this DOES exist
|
53
|
+
Then /^a (\w+) with ([\w: \']+) should exist$/ do |resource, attributes|
|
54
|
+
instance = find_resource resource, attributes
|
55
|
+
instance.should_not be_nil
|
56
|
+
keep_instance! resource, instance
|
57
|
+
end
|
58
|
+
# Resource like this DOES NOT exist
|
59
|
+
Then /^no (\w+) with ([\w: \']+) should exist$/ do |resource, attributes|
|
60
|
+
instance = find_resource resource, attributes
|
61
|
+
instance.should be_nil
|
62
|
+
end
|
63
|
+
|
64
|
+
# Resource has attributes with given values
|
65
|
+
Then "the $resource should have $attributes" do |resource, attributes|
|
66
|
+
klass, instance, attributes = parse_resource_args resource, attributes
|
67
|
+
attributes.each do |attr, val|
|
68
|
+
instance.send(attr).should == val
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Resource attributes should / should not be nil
|
73
|
+
Then "the $resource's $attr should be nil" do |resource, attr|
|
74
|
+
klass, instance = parse_resource_args resource
|
75
|
+
instance.send(attr).should be_nil
|
76
|
+
end
|
77
|
+
Then "the $resource's $attr should not be nil" do |resource, attr|
|
78
|
+
klass, instance = parse_resource_args resource
|
79
|
+
instance.send(attr).should_not be_nil
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
# Bank each of the @resource's listed attributes for later.
|
84
|
+
#
|
85
|
+
Given "we try hard to remember the $resource's $attributes" do |resource, attributes|
|
86
|
+
attributes = attributes.to_array_from_story
|
87
|
+
attributes.each do |attr|
|
88
|
+
memorize_resource_value resource, attr
|
89
|
+
end
|
90
|
+
end
|
91
|
+
#
|
92
|
+
# Bank each of the @resource's listed attributes for later.
|
93
|
+
#
|
94
|
+
Given "we don't remember anything about the past" do
|
95
|
+
memorize_forget_all!
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# Compare @resource.attr to its earlier-memorized value.
|
100
|
+
# Specify ' using method_name' (abs, to_s, &c) to coerce before comparing.
|
101
|
+
# For important and mysterious reasons, timestamps want to_i or to_s.
|
102
|
+
#
|
103
|
+
Then /^the (\w+)\'s (\w+) should stay the same under (\w+)$/ do |resource, attr, func|
|
104
|
+
klass, instance = parse_resource_args resource
|
105
|
+
# Get the values
|
106
|
+
old_value = recall_resource_value(resource, attr)
|
107
|
+
new_value = instance.send(attr)
|
108
|
+
# Transform each value, maybe, using value.func
|
109
|
+
if func then new_value = new_value.send(func); old_value = old_value.send(func) end
|
110
|
+
# Compare
|
111
|
+
old_value.should eql(new_value)
|
112
|
+
end
|
113
|
+
|
114
|
+
#
|
115
|
+
# Look for each for the given attributes in the page's text
|
116
|
+
#
|
117
|
+
Then "page should have the $resource's $attributes" do |resource, attributes|
|
118
|
+
actual_resource = instantize(resource)
|
119
|
+
attributes.split(/, and |, /).each do |attribute|
|
120
|
+
response.should have_text(/#{actual_resource.send(attribute.strip.gsub(" ","_"))}/)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
#
|
125
|
+
# Turn a resource name and a to_hash_from_story string like
|
126
|
+
# "attr: 'value', attr2: 'value2', ... , and attrN: 'valueN'"
|
127
|
+
# into
|
128
|
+
# * klass -- the class matching that Resource
|
129
|
+
# * instance -- the possibly-preexisting local instance value @resource
|
130
|
+
# * attributes -- a hash matching the given attribute-list string
|
131
|
+
#
|
132
|
+
def parse_resource_args resource, attributes=nil
|
133
|
+
instance = instantize resource
|
134
|
+
klass = resource.classify.constantize
|
135
|
+
attributes = attributes.to_hash_from_story if attributes
|
136
|
+
[klass, instance, attributes]
|
137
|
+
end
|
138
|
+
|
139
|
+
#
|
140
|
+
# Given a class name 'resource' and a hash of conditsion, find a model
|
141
|
+
#
|
142
|
+
def find_resource resource, conditions
|
143
|
+
klass, instance = parse_resource_args resource
|
144
|
+
conditions = conditions.to_hash_from_story unless (conditions.is_a? Hash)
|
145
|
+
klass.find(:first, :conditions => conditions)
|
146
|
+
end
|
147
|
+
|
148
|
+
#
|
149
|
+
# Simple, brittle, useful: store the given resource's attribute
|
150
|
+
# so we can compare it later.
|
151
|
+
#
|
152
|
+
def memorize_resource_value resource, attr
|
153
|
+
klass, instance = parse_resource_args resource
|
154
|
+
value = instance.send(attr)
|
155
|
+
@_memorized ||= {}
|
156
|
+
@_memorized[resource] ||= {}
|
157
|
+
@_memorized[resource][attr] = value
|
158
|
+
value
|
159
|
+
end
|
160
|
+
def recall_resource_value resource, attr
|
161
|
+
@_memorized[resource][attr]
|
162
|
+
end
|
163
|
+
def memorize_forget_all!
|
164
|
+
@_memorized = {}
|
165
|
+
end
|
166
|
+
|
167
|
+
#
|
168
|
+
# Keep the object around in a local instance variable @resource.
|
169
|
+
#
|
170
|
+
# So, for instance,
|
171
|
+
# klass, instance = parse_resource_args 'user'
|
172
|
+
# instance = klass.new({login => 'me', password => 'monkey', ...})
|
173
|
+
# keep_instance! resource, instance
|
174
|
+
# keeps the just-constructed User model in the @user instance variable.
|
175
|
+
#
|
176
|
+
def keep_instance! resource, object
|
177
|
+
instance_variable_set("@#{resource}", object)
|
178
|
+
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
#
|
2
|
+
# What you should see when you get there
|
3
|
+
#
|
4
|
+
|
5
|
+
#
|
6
|
+
# Destinations. Ex:
|
7
|
+
# She should be at the new kids page
|
8
|
+
# Tarkin should be at the destroy alderaan page
|
9
|
+
# The visitor should be at the '/lolcats/download' form
|
10
|
+
# The visitor should be redirected to '/hi/mom'
|
11
|
+
#
|
12
|
+
# It doesn't know anything about actual routes -- it just
|
13
|
+
# feeds its output to render_template or redirect_to
|
14
|
+
#
|
15
|
+
Then "$actor should be at $path" do |_, path|
|
16
|
+
response.should render_template(grok_path(path))
|
17
|
+
end
|
18
|
+
|
19
|
+
Then "$actor should be redirected to $path" do |_, path|
|
20
|
+
response.should redirect_to(grok_path(path))
|
21
|
+
end
|
22
|
+
|
23
|
+
Then "the page should look AWESOME" do
|
24
|
+
response.should have_tag('head>title')
|
25
|
+
response.should have_tag('h1')
|
26
|
+
# response.should be_valid_xhtml
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Tags
|
31
|
+
#
|
32
|
+
|
33
|
+
Then "the page should contain '$text'" do |_, text|
|
34
|
+
response.should have_text(/#{text}/)
|
35
|
+
end
|
36
|
+
|
37
|
+
# please note: this enforces the use of a <label> field
|
38
|
+
Then "$actor should see a <$container> containing a $attributes" do |_, container, attributes|
|
39
|
+
attributes = attributes.to_hash_from_story
|
40
|
+
response.should have_tag(container) do
|
41
|
+
attributes.each do |tag, label|
|
42
|
+
case tag
|
43
|
+
when "textfield" then with_tag "input[type='text']"; with_tag("label", label)
|
44
|
+
when "password" then with_tag "input[type='password']"; with_tag("label", label)
|
45
|
+
when "submit" then with_tag "input[type='submit'][value='#{label}']"
|
46
|
+
else with_tag tag, label
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
# Session, cookie variables
|
54
|
+
#
|
55
|
+
Then "$actor $token cookie should include $attrlist" do |_, token, attrlist|
|
56
|
+
attrlist = attrlist.to_array_from_story
|
57
|
+
cookies.include?(token).should be_true
|
58
|
+
attrlist.each do |val|
|
59
|
+
cookies[token].include?(val).should be_true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
Then "$actor $token cookie should exist but not include $attrlist" do |_, token, attrlist|
|
64
|
+
attrlist = attrlist.to_array_from_story
|
65
|
+
cookies.include?(token).should be_true
|
66
|
+
puts [cookies, attrlist, token].to_yaml
|
67
|
+
attrlist.each do |val|
|
68
|
+
cookies[token].include?(val).should_not be_true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
Then "$actor should have $an $token cookie" do |_, _, token|
|
73
|
+
cookies[token].should_not be_blank
|
74
|
+
end
|
75
|
+
Then "$actor should not have $an $token cookie" do |_, _, token|
|
76
|
+
cookies[token].should be_blank
|
77
|
+
end
|
78
|
+
|
79
|
+
Given "$actor has $an cookie jar with $attributes" do |_, _, attributes|
|
80
|
+
attributes = attributes.to_hash_from_story
|
81
|
+
attributes.each do |attr, val|
|
82
|
+
cookies[attr] = val
|
83
|
+
end
|
84
|
+
end
|
85
|
+
Given "$actor session store has no $attrlist" do |_, attrlist|
|
86
|
+
attrlist = attrlist.to_array_from_story
|
87
|
+
attrlist.each do |attr|
|
88
|
+
# Note that the comparison passes through 'to_s'
|
89
|
+
session[attr.to_sym] = nil
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
Then "$actor session store should have $attributes" do |_, attributes|
|
94
|
+
attributes = attributes.to_hash_from_story
|
95
|
+
attributes.each do |attr, val|
|
96
|
+
# Note that the comparison passes through 'to_s'
|
97
|
+
session[attr.to_sym].to_s.should eql(val)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
Then "$actor session store should not have $attrlist" do |_, attrlist|
|
102
|
+
attrlist = attrlist.to_array_from_story
|
103
|
+
attrlist.each do |attr|
|
104
|
+
session[attr.to_sym].blank?.should be_true
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
#
|
109
|
+
# Flash messages
|
110
|
+
#
|
111
|
+
|
112
|
+
Then /^she should +see an? (\w+) message '([\w !\']+)'$/ do |notice, message|
|
113
|
+
response.should have_flash(notice, %r{#{message}})
|
114
|
+
end
|
115
|
+
|
116
|
+
Then "$actor should not see $an $notice message '$message'" do |_, _, notice, message|
|
117
|
+
response.should_not have_flash(notice, %r{#{message}})
|
118
|
+
end
|
119
|
+
|
120
|
+
Then "$actor should see no messages" do |_|
|
121
|
+
['error', 'warning', 'notice'].each do |notice|
|
122
|
+
response.should_not have_flash(notice)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
RE_POLITENESS = /(?:please|sorry|thank(?:s| you))/i
|
127
|
+
Then %r{we should be polite about it} do
|
128
|
+
response.should have_tag("div.error,div.notice", RE_POLITENESS)
|
129
|
+
end
|
130
|
+
Then %r{we should not even be polite about it} do
|
131
|
+
response.should_not have_tag("div.error,div.notice", RE_POLITENESS)
|
132
|
+
end
|
133
|
+
|
134
|
+
#
|
135
|
+
# Resource's attributes
|
136
|
+
#
|
137
|
+
# "Then page should have the $resource's $attributes" is in resource_steps
|
138
|
+
|
139
|
+
# helpful debug step
|
140
|
+
Then "we dump the response" do
|
141
|
+
dump_response
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
def have_flash notice, *args
|
146
|
+
have_tag("div.#{notice}", *args)
|
147
|
+
end
|
148
|
+
|
149
|
+
RE_PRETTY_RESOURCE = /the (index|show|new|create|edit|update|destroy) (\w+) (page|form)/i
|
150
|
+
RE_THE_FOO_PAGE = /the '?([^']*)'? (page|form)/i
|
151
|
+
RE_QUOTED_PATH = /^'([^']*)'$/i
|
152
|
+
def grok_path path
|
153
|
+
path.gsub(/\s+again$/,'') # strip trailing ' again'
|
154
|
+
case
|
155
|
+
when path == 'the home page' then dest = '/'
|
156
|
+
when path =~ RE_PRETTY_RESOURCE then dest = template_for $1, $2
|
157
|
+
when path =~ RE_THE_FOO_PAGE then dest = $1
|
158
|
+
when path =~ RE_QUOTED_PATH then dest = $1
|
159
|
+
else dest = path
|
160
|
+
end
|
161
|
+
dest
|
162
|
+
end
|
163
|
+
|
164
|
+
# turns 'new', 'road bikes' into 'road_bikes/new'
|
165
|
+
# note that it's "action resource"
|
166
|
+
def template_for(action, resource)
|
167
|
+
"#{resource.gsub(" ","_")}/#{action}"
|
168
|
+
end
|
169
|
+
|
@@ -26,7 +26,7 @@ module ToFooFromStory
|
|
26
26
|
def ToFooFromStory.fix_value value
|
27
27
|
return '' if !value
|
28
28
|
value.strip!
|
29
|
-
case
|
29
|
+
case
|
30
30
|
when value =~ /^'(.*)'$/ then value = $1
|
31
31
|
when value =~ /^"(.*)"$/ then value = $1
|
32
32
|
when value == 'nil!' then value = nil
|
@@ -35,7 +35,7 @@ module ToFooFromStory
|
|
35
35
|
end
|
36
36
|
value
|
37
37
|
end
|
38
|
-
# Converts a key: value list found in the steps into a hash.
|
38
|
+
# Converts a key: value list found in the steps into a hash.
|
39
39
|
# Example:
|
40
40
|
# ISBN: '0967539854' and comment: 'I love this book' and Quality rating: '4'
|
41
41
|
# # => {"quality_rating"=>"4", "isbn"=>"0967539854", "comment"=>"I love this book"}
|
@@ -57,7 +57,7 @@ module ToFooFromStory
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
class String
|
60
|
-
include ToFooFromStory
|
60
|
+
include ToFooFromStory
|
61
61
|
end
|
62
62
|
|
63
63
|
def instantize(string)
|
@@ -73,9 +73,9 @@ def dump_response
|
|
73
73
|
request_methods = response.request.instance_variables - ['@session_options_with_string_keys', '@cgi', '@session']
|
74
74
|
response_methods.map!{|attr| attr.gsub(/^@/,'')}.sort!
|
75
75
|
request_methods.map!{ |attr| attr.gsub(/^@/,'')}.sort!
|
76
|
-
puts '', '*' * 75,
|
76
|
+
puts '', '*' * 75,
|
77
77
|
response.instance_values.slice(*response_methods).to_yaml,
|
78
78
|
"*" * 75, '',
|
79
79
|
response.request.instance_values.slice(*request_methods).to_yaml,
|
80
|
-
"*" * 75, ''
|
80
|
+
"*" * 75, ''
|
81
81
|
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
RE_User = %r{(?:(?:the )? *(\w+) *)}
|
2
|
+
RE_User_TYPE = %r{(?: *(\w+)? *)}
|
3
|
+
|
4
|
+
#
|
5
|
+
# Setting
|
6
|
+
#
|
7
|
+
|
8
|
+
Given "an anonymous user" do
|
9
|
+
log_out!
|
10
|
+
end
|
11
|
+
|
12
|
+
Given "$an $user_type user with $attributes" do |_, user_type, attributes|
|
13
|
+
create_user! user_type, attributes.to_hash_from_story
|
14
|
+
end
|
15
|
+
|
16
|
+
Given "$an $user_type user named '$login'" do |_, user_type, login|
|
17
|
+
create_user! user_type, named_user(login)
|
18
|
+
end
|
19
|
+
|
20
|
+
Given "$an $user_type user logged in as '$login'" do |_, user_type, login|
|
21
|
+
create_user! user_type, named_user(login)
|
22
|
+
log_in_user!
|
23
|
+
end
|
24
|
+
|
25
|
+
Given "$actor is logged in" do |_, login|
|
26
|
+
log_in_user! @user_params || named_user(login)
|
27
|
+
end
|
28
|
+
|
29
|
+
Given "there is no $user_type user named '$login'" do |_, login|
|
30
|
+
@user = User.find_by_login(login)
|
31
|
+
@user.destroy! if @user
|
32
|
+
@user.should be_nil
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
# Actions
|
37
|
+
#
|
38
|
+
When "$actor logs out" do
|
39
|
+
log_out
|
40
|
+
end
|
41
|
+
|
42
|
+
When "$actor registers an account as the preloaded '$login'" do |_, login|
|
43
|
+
user = named_user(login)
|
44
|
+
user['password_confirmation'] = user['password']
|
45
|
+
create_user user
|
46
|
+
end
|
47
|
+
|
48
|
+
When "$actor registers an account with $attributes" do |_, attributes|
|
49
|
+
create_user attributes.to_hash_from_story
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
When "$actor logs in with $attributes" do |_, attributes|
|
54
|
+
log_in_user attributes.to_hash_from_story
|
55
|
+
end
|
56
|
+
|
57
|
+
#
|
58
|
+
# Result
|
59
|
+
#
|
60
|
+
Then "$actor should be invited to sign in" do |_|
|
61
|
+
response.should render_template('/sessions/new')
|
62
|
+
end
|
63
|
+
|
64
|
+
Then "$actor should not be logged in" do |_|
|
65
|
+
controller.logged_in?.should_not be_true
|
66
|
+
end
|
67
|
+
|
68
|
+
Then "$login should be logged in" do |login|
|
69
|
+
controller.logged_in?.should be_true
|
70
|
+
controller.current_user.should === @user
|
71
|
+
controller.current_user.login.should == login
|
72
|
+
end
|
73
|
+
|
74
|
+
def named_user login
|
75
|
+
user_params = {
|
76
|
+
'admin' => {'id' => 1, 'login' => 'addie', 'password' => '1234addie', 'email' => 'admin@example.com', },
|
77
|
+
'oona' => { 'login' => 'oona', 'password' => '1234oona', 'email' => 'unactivated@example.com'},
|
78
|
+
'reggie' => { 'login' => 'reggie', 'password' => 'monkey', 'email' => 'registered@example.com' },
|
79
|
+
}
|
80
|
+
user_params[login.downcase]
|
81
|
+
end
|
82
|
+
|
83
|
+
#
|
84
|
+
# User account actions.
|
85
|
+
#
|
86
|
+
# The ! methods are 'just get the job done'. It's true, they do some testing of
|
87
|
+
# their own -- thus un-DRY'ing tests that do and should live in the user account
|
88
|
+
# stories -- but the repetition is ultimately important so that a faulty test setup
|
89
|
+
# fails early.
|
90
|
+
#
|
91
|
+
|
92
|
+
def log_out
|
93
|
+
get '/sessions/destroy'
|
94
|
+
end
|
95
|
+
|
96
|
+
def log_out!
|
97
|
+
log_out
|
98
|
+
response.should redirect_to('/')
|
99
|
+
follow_redirect!
|
100
|
+
end
|
101
|
+
|
102
|
+
def create_user(user_params={})
|
103
|
+
@user_params ||= user_params
|
104
|
+
post "/users", :user => user_params
|
105
|
+
@user = User.find_by_login(user_params['login'])
|
106
|
+
end
|
107
|
+
|
108
|
+
def create_user!(user_type, user_params)
|
109
|
+
user_params['password_confirmation'] ||= user_params['password'] ||= user_params['password']
|
110
|
+
create_user user_params
|
111
|
+
response.should redirect_to('/')
|
112
|
+
follow_redirect!
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
def log_in_user user_params=nil
|
119
|
+
@user_params ||= user_params
|
120
|
+
user_params ||= @user_params
|
121
|
+
post "/session", user_params
|
122
|
+
@user = User.find_by_login(user_params['login'])
|
123
|
+
controller.current_user
|
124
|
+
end
|
125
|
+
|
126
|
+
def log_in_user! *args
|
127
|
+
log_in_user *args
|
128
|
+
response.should redirect_to('/')
|
129
|
+
follow_redirect!
|
130
|
+
response.should have_flash("notice", /Logged in successfully/)
|
131
|
+
end
|
data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/model.rb
CHANGED
@@ -55,9 +55,9 @@ class <%= class_name %> < ActiveRecord::Base
|
|
55
55
|
#
|
56
56
|
def self.authenticate(login, password)
|
57
57
|
return nil if login.blank? || password.blank?
|
58
|
-
u = <% if options[:stateful] %>find_in_state :first, :active, :conditions => {:login => login}<%
|
58
|
+
u = <% if options[:stateful] %>find_in_state :first, :active, :conditions => {:login => login.downcase}<%
|
59
59
|
elsif options[:include_activation] %>find :first, :conditions => ['login = ? and activated_at IS NOT NULL', login]<%
|
60
|
-
else %>find_by_login(login)<% end %> # need to get the salt
|
60
|
+
else %>find_by_login(login.downcase)<% end %> # need to get the salt
|
61
61
|
u && u.authenticated?(password) ? u : nil
|
62
62
|
end
|
63
63
|
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 3
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
|
9
|
-
version: 3.0.3
|
9
|
+
version: 3.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Douglas A. Seifert
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-12 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -161,10 +161,13 @@ files:
|
|
161
161
|
- webgui/app/views/shared/_bracket.html.erb
|
162
162
|
- webgui/app/views/teams/choose.html.erb
|
163
163
|
- webgui/app/views/user_mailer/activation.erb
|
164
|
+
- webgui/app/views/user_mailer/password_reset_notification.erb
|
164
165
|
- webgui/app/views/user_mailer/recap.erb
|
165
166
|
- webgui/app/views/user_mailer/signup_notification.erb
|
166
167
|
- webgui/app/views/users/_user_bar.html.erb
|
168
|
+
- webgui/app/views/users/lost_password.html.erb
|
167
169
|
- webgui/app/views/users/new.html.erb
|
170
|
+
- webgui/app/views/users/reset_password.html.erb
|
168
171
|
- webgui/config/boot.rb
|
169
172
|
- webgui/config/database.yml
|
170
173
|
- webgui/config/environment.rb
|
@@ -199,7 +202,9 @@ files:
|
|
199
202
|
- webgui/db/migrate/20090301041526_create_seedings.rb
|
200
203
|
- webgui/db/migrate/20090301090511_create_regions.rb
|
201
204
|
- webgui/db/migrate/20090316023841_change_illinois_short_name.rb
|
205
|
+
- webgui/db/migrate/20100312053540_add_password_reset_code.rb
|
202
206
|
- webgui/db/migrate/teams.txt
|
207
|
+
- webgui/db/schema.rb
|
203
208
|
- webgui/doc/README_FOR_APP
|
204
209
|
- webgui/lib/authenticated_system.rb
|
205
210
|
- webgui/lib/authenticated_test_helper.rb
|
@@ -287,6 +292,7 @@ files:
|
|
287
292
|
- webgui/vendor/plugins/enumerations_mixin/lib/active_record/virtual_enumerations.rb
|
288
293
|
- webgui/vendor/plugins/enumerations_mixin/virtual_enumerations_sample.rb
|
289
294
|
- webgui/vendor/plugins/restful_authentication/CHANGELOG
|
295
|
+
- webgui/vendor/plugins/restful_authentication/LICENSE
|
290
296
|
- webgui/vendor/plugins/restful_authentication/README.textile
|
291
297
|
- webgui/vendor/plugins/restful_authentication/Rakefile
|
292
298
|
- webgui/vendor/plugins/restful_authentication/TODO
|
@@ -298,6 +304,14 @@ files:
|
|
298
304
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/authenticated_system.rb
|
299
305
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/authenticated_test_helper.rb
|
300
306
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/controller.rb
|
307
|
+
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/accounts.feature
|
308
|
+
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/sessions.feature
|
309
|
+
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_env.rb
|
310
|
+
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_navigation_steps.rb
|
311
|
+
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_resource_steps.rb
|
312
|
+
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_response_steps.rb
|
313
|
+
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/rest_auth_features_helper.rb
|
314
|
+
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/user_steps.rb
|
301
315
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/helper.rb
|
302
316
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/login.html.erb
|
303
317
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/mailer.rb
|
@@ -317,14 +331,6 @@ files:
|
|
317
331
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/spec/fixtures/users.yml
|
318
332
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/spec/helpers/users_helper_spec.rb
|
319
333
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/spec/models/user_spec.rb
|
320
|
-
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/rest_auth_stories.rb
|
321
|
-
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/rest_auth_stories_helper.rb
|
322
|
-
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/ra_navigation_steps.rb
|
323
|
-
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/ra_resource_steps.rb
|
324
|
-
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/ra_response_steps.rb
|
325
|
-
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/user_steps.rb
|
326
|
-
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/users/accounts.story
|
327
|
-
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/users/sessions.story
|
328
334
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/test/functional_test.rb
|
329
335
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/test/mailer_test.rb
|
330
336
|
- webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/test/model_functional_test.rb
|
@@ -1,22 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
ENV["RAILS_ENV"] = "test"
|
3
|
-
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
|
4
|
-
require 'spec/rails/story_adapter'
|
5
|
-
require 'spec/story'
|
6
|
-
require File.expand_path(File.dirname(__FILE__) + "/rest_auth_stories_helper.rb")
|
7
|
-
|
8
|
-
# Make visible for testing
|
9
|
-
ApplicationController.send(:public, :logged_in?, :current_user, :authorized?)
|
10
|
-
|
11
|
-
this_dir = File.dirname(__FILE__)
|
12
|
-
Dir[File.join(this_dir, "steps/*.rb")].each do |file|
|
13
|
-
puts file.to_s
|
14
|
-
require file
|
15
|
-
end
|
16
|
-
|
17
|
-
with_steps_for :ra_navigation, :ra_response, :ra_resource, :<%= file_name %> do
|
18
|
-
story_files = Dir[File.join(this_dir, "<%= table_name %>", '*.story')]
|
19
|
-
story_files.each do |file|
|
20
|
-
run file, :type => RailsStory
|
21
|
-
end
|
22
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Where to go
|
3
|
-
#
|
4
|
-
steps_for(:ra_navigation) do
|
5
|
-
#
|
6
|
-
# GET
|
7
|
-
# Go to a given page.
|
8
|
-
When "$actor goes to $path" do |actor, path|
|
9
|
-
case path
|
10
|
-
when 'the home page' then get '/'
|
11
|
-
else get path
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
# POST -- Ex:
|
16
|
-
# When she creates a book with ISBN: '0967539854' and comment: 'I love this book' and rating: '4'
|
17
|
-
# When she creates a singular session with login: 'reggie' and password: 'i_haxxor_joo'
|
18
|
-
# Since I'm not smrt enough to do it right, explicitly specify singular resources
|
19
|
-
When %r{$actor creates an? $resource with $attributes} do |actor, resource, attributes|
|
20
|
-
attributes = attributes.to_hash_from_story
|
21
|
-
if resource =~ %r{singular ([\w/]+)}
|
22
|
-
resource = $1.downcase.singularize
|
23
|
-
post "/#{resource}", attributes
|
24
|
-
else
|
25
|
-
post "/#{resource.downcase.pluralize}", { resource.downcase.singularize => attributes }
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# PUT
|
30
|
-
When %r{$actor asks to update '$resource' with $attributes} do |_, resource, attributes|
|
31
|
-
attributes = attributes.to_hash_from_story
|
32
|
-
put "#{resource}", attributes
|
33
|
-
dump_response
|
34
|
-
end
|
35
|
-
|
36
|
-
# DELETE -- Slap together the POST-form-as-fake-HTTP-DELETE submission
|
37
|
-
When %r{$actor asks to delete '$resource'} do |_, resource|
|
38
|
-
post "/#{resource.downcase.pluralize}", { :_method => :delete }
|
39
|
-
dump_response
|
40
|
-
end
|
41
|
-
|
42
|
-
|
43
|
-
# Redirect --
|
44
|
-
# Rather than coding in get/get_via_redirect's and past/p_v_r's,
|
45
|
-
# let's just demand that in the story itself.
|
46
|
-
When "$actor follows that redirect!" do |actor|
|
47
|
-
follow_redirect!
|
48
|
-
end
|
49
|
-
end
|