citygate 0.0.5 → 0.0.6
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/README.rdoc +11 -0
- data/app/assets/javascripts/citygate/admin_users.coffee +1 -1
- data/app/assets/javascripts/citygate/jquery.pjax.js +4 -2
- data/app/assets/javascripts/citygate.js +16 -0
- data/app/assets/stylesheets/citygate/{application.css.scss → application.css} +0 -0
- data/app/assets/stylesheets/citygate/main.sass +0 -9
- data/app/controllers/citygate/admin/application_controller.rb +3 -1
- data/app/controllers/citygate/admin/users_controller.rb +4 -4
- data/app/controllers/citygate/application_controller.rb +4 -2
- data/app/controllers/citygate/users/omniauth_callbacks_controller.rb +13 -12
- data/app/models/citygate/permission.rb +7 -0
- data/app/models/citygate/role.rb +2 -1
- data/app/models/citygate/user.rb +24 -4
- data/app/views/citygate/admin/users/index.html.erb +3 -3
- data/app/views/citygate/admin/users/show.html.erb +12 -3
- data/app/views/citygate/home/index.html.erb +4 -5
- data/app/views/citygate/shared/_navigation.html.erb +18 -18
- data/app/views/citygate/users/show.html.erb +6 -4
- data/app/views/devise/confirmations/new.html.erb +12 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise/passwords/edit.html.erb +16 -0
- data/app/views/devise/passwords/new.html.erb +12 -0
- data/app/views/devise/registrations/edit.html.erb +33 -30
- data/app/views/devise/registrations/new.html.erb +10 -10
- data/app/views/devise/sessions/new.html.erb +18 -0
- data/app/views/devise/{_links.erb → shared/_links.erb} +7 -7
- data/app/views/devise/unlocks/new.html.erb +12 -0
- data/app/views/layouts/admin/application.html.erb +2 -2
- data/config/accounts.yml +1 -3
- data/config/initializers/devise.rb +1 -1
- data/config/locales/defaults/en.yml +2 -0
- data/config/locales/models/user/en.yml +4 -0
- data/config/locales/navigation/en.yml +12 -0
- data/config/locales/shared/cancan/en.yml +3 -0
- data/config/locales/{devise.en.yml → shared/devise/devise.en.yml} +0 -0
- data/config/locales/{devise_invitable.en.yml → shared/devise/devise_invitable.en.yml} +0 -0
- data/config/locales/views/admin/users/en.yml +32 -0
- data/db/migrate/20120303195103_add_name_to_users.rb +2 -1
- data/db/migrate/20120727143920_create_permissions_table.rb +12 -0
- data/db/seeds.rb +14 -0
- data/lib/ability.rb +53 -0
- data/lib/citygate/engine.rb +10 -0
- data/lib/citygate/version.rb +1 -1
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +30 -0
- data/{app/assets/javascripts/citygate → spec/dummy/app/assets/javascripts}/application.js +2 -3
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +4 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +19 -0
- data/spec/dummy/config/application.rb +61 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +39 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/{config → spec/dummy/config}/locales/en.yml +0 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20120706095546_devise_create_users.citygate.rb +50 -0
- data/spec/dummy/db/migrate/20120706095547_add_name_to_users.citygate.rb +7 -0
- data/spec/dummy/db/migrate/20120706095548_add_confirmable_to_users.citygate.rb +12 -0
- data/spec/dummy/db/migrate/20120706095549_devise_invitable_add_to_users.citygate.rb +24 -0
- data/spec/dummy/db/migrate/20120706095550_add_omniauth_to_devise.citygate.rb +20 -0
- data/spec/dummy/db/migrate/20120706095551_create_roles.citygate.rb +11 -0
- data/spec/dummy/db/migrate/20120727145840_create_permissions_table.citygate.rb +13 -0
- data/spec/dummy/db/production.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +79 -0
- data/spec/dummy/db/seeds.rb +1 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/features/step_definitions/email_steps.rb +206 -0
- data/spec/dummy/features/step_definitions/user_steps.rb +249 -0
- data/spec/dummy/features/support/email_spec.rb +1 -0
- data/spec/dummy/features/support/env.rb +107 -0
- data/spec/dummy/features/support/hooks.rb +0 -0
- data/spec/dummy/features/support/paths.rb +46 -0
- data/spec/dummy/features/users/login_omniauth.feature +19 -0
- data/spec/dummy/features/users/sign_in.feature +40 -0
- data/spec/dummy/features/users/sign_out.feature +11 -0
- data/spec/dummy/features/users/sign_up.feature +27 -0
- data/spec/dummy/features/users/user_edit.feature +9 -0
- data/spec/dummy/features/users/users_admin.feature +44 -0
- data/spec/dummy/log/development.log +18417 -0
- data/spec/dummy/log/test.log +59087 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/dummy/spec/controllers/admin/admin_controller_spec.rb +10 -0
- data/spec/dummy/spec/controllers/admin/users_spec.rb +15 -0
- data/spec/dummy/spec/controllers/home_controller_spec.rb +12 -0
- data/spec/dummy/spec/controllers/omniauth_spec.rb +73 -0
- data/spec/dummy/spec/factories.rb +33 -0
- data/spec/dummy/spec/javascripts/UserSpec.js +14 -0
- data/spec/dummy/spec/javascripts/fixtures/user_listing.html +20 -0
- data/spec/dummy/spec/javascripts/helpers/SpecHelper.js +9 -0
- data/spec/dummy/spec/javascripts/helpers/jasmine-jquery.js +306 -0
- data/spec/dummy/spec/javascripts/helpers/jquery.min.js +4 -0
- data/spec/dummy/spec/javascripts/support/jasmine.yml +19 -0
- data/spec/dummy/spec/models/user_spec.rb +100 -0
- data/spec/dummy/spec/routing/routing_spec.rb +22 -0
- data/spec/dummy/spec/spec_helper.rb +79 -0
- data/spec/dummy/spec/support/devise.rb +3 -0
- data/spec/dummy/tmp/cache/assets/C63/E40/sprockets%2F36a675f52eb281488964b58be8971051 +0 -0
- data/spec/dummy/tmp/cache/assets/C79/FC0/sprockets%2F76c2f8ffd1175afd6274640057134300 +0 -0
- data/spec/dummy/tmp/cache/assets/C7A/CE0/sprockets%2F9124c83a02e7332a90b2883b69f81d04 +0 -0
- data/spec/dummy/tmp/cache/assets/C89/540/sprockets%2F606a455261f8f047c994c4b9a582f126 +0 -0
- data/spec/dummy/tmp/cache/assets/CC5/020/sprockets%2Ffa39f3f719158fea829829617391b42c +0 -0
- data/spec/dummy/tmp/cache/assets/CD6/2B0/sprockets%2F08e01b4122e606428c6de7234d87bee1 +0 -0
- data/spec/dummy/tmp/cache/assets/CD8/070/sprockets%2F3afc9406d6d06c238a33603363af8a66 +0 -0
- data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/CE2/7D0/sprockets%2Fe69b8c4ca0800c940d1d9785f1a92327 +0 -0
- data/spec/dummy/tmp/cache/assets/CE8/510/sprockets%2F0d85ab6e3972f70636a990e91fec8301 +0 -0
- data/spec/dummy/tmp/cache/assets/CF6/500/sprockets%2Fe48376f3339fc2f84ac25d713936ea99 +0 -0
- data/spec/dummy/tmp/cache/assets/D0D/DE0/sprockets%2Fa35442f02b0b2479f22d83d639d8c4fd +0 -0
- data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/D3E/710/sprockets%2F93251497334cafddb54ecc36a332f5b9 +0 -0
- data/spec/dummy/tmp/cache/assets/D48/410/sprockets%2Fa18aa9c28f587c76e162489eb19f2a2a +0 -0
- data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/D53/840/sprockets%2Ff753499d8cefbb5a8450ca97540ff275 +0 -0
- data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/D72/580/sprockets%2F02aed4ae7c633d6d577280de93c4c7c6 +0 -0
- data/spec/dummy/tmp/cache/assets/D73/010/sprockets%2F834fa37dfa7f28148e125baf3f9d91b0 +0 -0
- data/spec/dummy/tmp/cache/assets/D75/530/sprockets%2F6a480d7952fbe8ce5c2eaad0369f7271 +0 -0
- data/spec/dummy/tmp/cache/assets/D78/BD0/sprockets%2Fd0c9ac69560ea197444b7f759ecd06da +0 -0
- data/spec/dummy/tmp/cache/assets/D9B/0B0/sprockets%2F609a6d0b06eb3752679f6e1f0adcb4fc +0 -0
- data/spec/dummy/tmp/cache/assets/D9E/F10/sprockets%2F9ab223df888d724dcad09eb1163cc5f4 +0 -0
- data/spec/dummy/tmp/cache/assets/D9E/F70/sprockets%2Fc5d4a6e7d907804c52cbf910339dafdb +0 -0
- data/spec/dummy/tmp/cache/assets/DB9/2A0/sprockets%2F0a7332e4e1420de7165bd13ecffca4cc +0 -0
- data/spec/dummy/tmp/cache/assets/DC2/210/sprockets%2Ff0049a44fff3a6ea3a55283aceb06fb4 +0 -0
- data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/E0B/AF0/sprockets%2Ff71f3afdedf8ab892f147a5facc07488 +0 -0
- data/spec/dummy/tmp/cache/assets/E2B/670/sprockets%2Feac21904ecb266ce92aecadb8681b7fe +0 -0
- data/spec/spec_helper.rb +33 -0
- metadata +267 -41
- data/app/models/citygate/ability.rb +0 -31
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
### UTILITY METHODS ###
|
|
2
|
+
|
|
3
|
+
def current_path
|
|
4
|
+
URI.parse(current_url).path
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def create_visitor
|
|
8
|
+
@visitor ||= { :first_name => "User", :email => "example@example.com",
|
|
9
|
+
:password => "bigpasswordisbig", :password_confirmation => "bigpasswordisbig" }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def find_user
|
|
13
|
+
@user ||= Citygate::User.first conditions: {:email => @visitor[:email]}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def create_unconfirmed_user
|
|
17
|
+
create_visitor
|
|
18
|
+
delete_user
|
|
19
|
+
sign_up
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def create_or_get_user
|
|
23
|
+
@user ||= lambda do
|
|
24
|
+
create_visitor
|
|
25
|
+
delete_user
|
|
26
|
+
Factory.create(:user, email: @visitor[:email])
|
|
27
|
+
end.call
|
|
28
|
+
@user.confirmation_sent_at = Time.now
|
|
29
|
+
@user.save
|
|
30
|
+
return @user
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def delete_user
|
|
34
|
+
@user ||= Citygate::User.first conditions: {:email => @visitor[:email]}
|
|
35
|
+
@user.destroy unless @user.nil?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def sign_up
|
|
39
|
+
delete_user
|
|
40
|
+
visit '/users/sign_up'
|
|
41
|
+
fill_in "user_email", :with => @visitor[:email]
|
|
42
|
+
fill_in "user_password", :with => @visitor[:password]
|
|
43
|
+
fill_in "user_password_confirmation", :with => @visitor[:password_confirmation]
|
|
44
|
+
click_button "Sign up"
|
|
45
|
+
find_user
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def sign_in
|
|
49
|
+
visit '/users/sign_in'
|
|
50
|
+
fill_in "Email", :with => @visitor[:email]
|
|
51
|
+
fill_in "Password", :with => @visitor[:password]
|
|
52
|
+
click_button "Sign in"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
### GIVEN ###
|
|
56
|
+
Given /^I am not logged in$/ do
|
|
57
|
+
page.should_not have_link('Log out')
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
Given /^I am logged in$/ do
|
|
61
|
+
create_or_get_user
|
|
62
|
+
sign_in
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
Given /^I am an admin$/ do
|
|
66
|
+
create_or_get_user
|
|
67
|
+
@user.role_id = 2
|
|
68
|
+
@user.save
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
Given /^I exist as a user$/ do
|
|
72
|
+
create_or_get_user
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
Given /^I do not exist as a user$/ do
|
|
76
|
+
create_visitor
|
|
77
|
+
delete_user
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
Given /^I exist as an unconfirmed user$/ do
|
|
81
|
+
create_unconfirmed_user
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
Given /^I am on (.*)$/ do |path|
|
|
85
|
+
visit path_to(path)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
Given /^I do not have an? (.*)$/ do |attribute|
|
|
89
|
+
create_or_get_user
|
|
90
|
+
@user[attribute] = nil
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
### WHEN ###
|
|
94
|
+
When /^I sign in with valid credentials$/ do
|
|
95
|
+
create_visitor
|
|
96
|
+
sign_in
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
When /^I sign out$/ do
|
|
100
|
+
click_link 'Log out'
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
When /^I sign up with valid user data$/ do
|
|
104
|
+
create_visitor
|
|
105
|
+
sign_up
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
When /^I sign up with an invalid email$/ do
|
|
109
|
+
create_visitor
|
|
110
|
+
@visitor = @visitor.merge(:email => "notanemail")
|
|
111
|
+
sign_up
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
When /^I sign up without a password confirmation$/ do
|
|
115
|
+
create_visitor
|
|
116
|
+
@visitor = @visitor.merge(:password_confirmation => "")
|
|
117
|
+
sign_up
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
When /^I sign up without a password$/ do
|
|
121
|
+
create_visitor
|
|
122
|
+
@visitor = @visitor.merge(:password => "")
|
|
123
|
+
sign_up
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
When /^I sign up with a mismatched password confirmation$/ do
|
|
127
|
+
create_visitor
|
|
128
|
+
@visitor = @visitor.merge(:password_confirmation => "please123")
|
|
129
|
+
sign_up
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
When /^I return to the site$/ do
|
|
133
|
+
visit '/'
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
When /^I sign in with a wrong email$/ do
|
|
137
|
+
@visitor = @visitor.merge(:email => "wrong@example.com")
|
|
138
|
+
sign_in
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
When /^I sign in with a wrong password$/ do
|
|
142
|
+
@visitor = @visitor.merge(:password => "wrongpass")
|
|
143
|
+
sign_in
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
When /^I edit my account details$/ do
|
|
147
|
+
click_link "Edit account"
|
|
148
|
+
fill_in "user_current_password", :with => @visitor[:password]
|
|
149
|
+
click_button "Update"
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
When /^I look at the list of users$/ do
|
|
153
|
+
visit '/admin/users'
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
When /^I click (.*)$/ do |link|
|
|
157
|
+
click_link link
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
When /^I go back in history$/ do
|
|
161
|
+
sleep 2
|
|
162
|
+
page.execute_script("history.back()")
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
### THEN ###
|
|
166
|
+
Then /^I should be signed in$/ do
|
|
167
|
+
page.should have_content "Log out"
|
|
168
|
+
page.should_not have_content "Sign up"
|
|
169
|
+
page.should_not have_content "Log in"
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
Then /^I should be signed in with (.*)$/ do |provider|
|
|
173
|
+
page.should have_content "Successfully authorized from #{provider} account"
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
Then /^I should be signed out$/ do
|
|
177
|
+
page.should have_content "Sign up"
|
|
178
|
+
page.should_not have_content "Log out"
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
Then /^I see an unconfirmed account message$/ do
|
|
182
|
+
page.should have_content "You have to confirm your account before continuing."
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
Then /^I see a successful sign in message$/ do
|
|
186
|
+
page.should have_content "Signed in successfully."
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
Then /^I should see a successful sign up message$/ do
|
|
190
|
+
page.should have_content "A message with a confirmation link has been sent to your email address."
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
Then /^I should see an invalid email message$/ do
|
|
194
|
+
page.should have_content "Email is invalid"
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
Then /^I should see a missing password message$/ do
|
|
198
|
+
page.should have_content "Password can't be blank"
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
Then /^I should see a missing password confirmation message$/ do
|
|
202
|
+
page.should have_content "Password doesn't match confirmation"
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
Then /^I should see a mismatched password message$/ do
|
|
206
|
+
page.should have_content "Password doesn't match confirmation"
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
Then /^I should see a signed out message$/ do
|
|
210
|
+
page.should have_content "Signed out successfully."
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
Then /^I see an invalid login message$/ do
|
|
214
|
+
page.should have_content "Invalid email or password."
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
Then /^I should see an account edited message$/ do
|
|
218
|
+
page.should have_content "You updated your account successfully."
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
Then /^I should (not )?see my (.*)$/ do |nonexistent, attribute|
|
|
222
|
+
create_or_get_user
|
|
223
|
+
if nonexistent
|
|
224
|
+
page.should_not have_content @user[attribute]
|
|
225
|
+
else
|
|
226
|
+
page.should have_content @user[attribute]
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
Then /^I should see the (.*) of user number (.*)$/ do |attribute,id|
|
|
231
|
+
page.should have_content Citygate::User.find(id)[attribute]
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
Then /^the element with (class |id )(.*) should (not )?exist$/ do |type, name, nonexistent|
|
|
235
|
+
selector = %Q{#{(type.strip == 'class') ? '.' : '#'}#{name}}
|
|
236
|
+
if nonexistent
|
|
237
|
+
page.should_not have_css selector
|
|
238
|
+
else
|
|
239
|
+
page.should have_css selector
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
Then /^I can see (.*)$/ do |text|
|
|
244
|
+
has_link?(text).should be_true
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
Then /^I should be redirected to (.*)$/ do |path|
|
|
248
|
+
current_path.should == path_to(path)
|
|
249
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'email_spec/cucumber'
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
|
|
2
|
+
# It is recommended to regenerate this file in the future when you upgrade to a
|
|
3
|
+
# newer version of cucumber-rails. Consider adding your own code to a new file
|
|
4
|
+
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
|
|
5
|
+
# files.
|
|
6
|
+
|
|
7
|
+
ENV['RAILS_ENV'] ||= 'test'
|
|
8
|
+
|
|
9
|
+
require 'email_spec'
|
|
10
|
+
require 'email_spec/cucumber'
|
|
11
|
+
require 'cucumber/rails'
|
|
12
|
+
require 'cucumber/rails/rspec'
|
|
13
|
+
require 'cucumber/rails/world'
|
|
14
|
+
require 'capybara-webkit'
|
|
15
|
+
|
|
16
|
+
require 'factory_girl'
|
|
17
|
+
FactoryGirl.find_definitions
|
|
18
|
+
|
|
19
|
+
# Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In
|
|
20
|
+
# order to ease the transition to Capybara we set the default here. If you'd
|
|
21
|
+
# prefer to use XPath just remove this line and adjust any selectors in your
|
|
22
|
+
# steps to use the XPath syntax.
|
|
23
|
+
Capybara.default_selector = :css
|
|
24
|
+
Capybara.javascript_driver = :webkit
|
|
25
|
+
|
|
26
|
+
if Capybara.current_driver == :webkit
|
|
27
|
+
require 'headless'
|
|
28
|
+
|
|
29
|
+
headless = Headless.new
|
|
30
|
+
headless.start
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# By default, any exception happening in your Rails application will bubble up
|
|
34
|
+
# to Cucumber so that your scenario will fail. This is a different from how
|
|
35
|
+
# your application behaves in the production environment, where an error page will
|
|
36
|
+
# be rendered instead.
|
|
37
|
+
#
|
|
38
|
+
# Sometimes we want to override this default behaviour and allow Rails to rescue
|
|
39
|
+
# exceptions and display an error page (just like when the app is running in production).
|
|
40
|
+
# Typical scenarios where you want to do this is when you test your error pages.
|
|
41
|
+
# There are two ways to allow Rails to rescue exceptions:
|
|
42
|
+
#
|
|
43
|
+
# 1) Tag your scenario (or feature) with @allow-rescue
|
|
44
|
+
#
|
|
45
|
+
# 2) Set the value below to true. Beware that doing this globally is not
|
|
46
|
+
# recommended as it will mask a lot of errors for you!
|
|
47
|
+
#
|
|
48
|
+
ActionController::Base.allow_rescue = false
|
|
49
|
+
|
|
50
|
+
# Remove/comment out the lines below if your app doesn't have a database.
|
|
51
|
+
# For some databases (like MongoDB and CouchDB) you may need to use :truncation instead.
|
|
52
|
+
begin
|
|
53
|
+
DatabaseCleaner.strategy = :transaction
|
|
54
|
+
rescue NameError
|
|
55
|
+
raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios.
|
|
59
|
+
# See the DatabaseCleaner documentation for details. Example:
|
|
60
|
+
#
|
|
61
|
+
# Before('@no-txn,@selenium,@culerity,@celerity,@javascript') do
|
|
62
|
+
# # { :except => [:widgets] } may not do what you expect here
|
|
63
|
+
# # as tCucumber::Rails::Database.javascript_strategy overrides
|
|
64
|
+
# # this setting.
|
|
65
|
+
# DatabaseCleaner.strategy = :truncation
|
|
66
|
+
# end
|
|
67
|
+
#
|
|
68
|
+
# Before('~@no-txn', '~@selenium', '~@culerity', '~@celerity', '~@javascript') do
|
|
69
|
+
# DatabaseCleaner.strategy = :transaction
|
|
70
|
+
# end
|
|
71
|
+
#
|
|
72
|
+
|
|
73
|
+
# Possible values are :truncation and :transaction
|
|
74
|
+
# The :transaction strategy is faster, but might give you threading problems.
|
|
75
|
+
# See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
|
|
76
|
+
Cucumber::Rails::Database.javascript_strategy = :transaction
|
|
77
|
+
|
|
78
|
+
OmniAuth.config.test_mode = true
|
|
79
|
+
OmniAuth.config.mock_auth[:facebook] = {
|
|
80
|
+
"uid" => "10",
|
|
81
|
+
"credentials" => {
|
|
82
|
+
"token" => "1234567890"
|
|
83
|
+
},
|
|
84
|
+
"extra" => {
|
|
85
|
+
"raw_info" => {
|
|
86
|
+
"email" => "zamith@groupbuddies.com",
|
|
87
|
+
"name" => "zamith",
|
|
88
|
+
"link" => "zamith.github.com"
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"info" => {
|
|
92
|
+
"image" => "/path/to/image"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
OmniAuth.config.mock_auth[:google] = {
|
|
97
|
+
"uid" => "10",
|
|
98
|
+
"credentials" => {
|
|
99
|
+
"token" => "1234567890"
|
|
100
|
+
},
|
|
101
|
+
"info" => {
|
|
102
|
+
"email" => "zamith@groupbuddies.com",
|
|
103
|
+
"name" => "zamith"
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
load "#{Rails.root}/db/seeds.rb"
|
|
File without changes
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module NavigationHelpers
|
|
2
|
+
include Citygate::Engine.routes.url_helpers
|
|
3
|
+
# Maps a name to a path. Used by the
|
|
4
|
+
#
|
|
5
|
+
# When /^I go to (.+)$/ do |page_name|
|
|
6
|
+
#
|
|
7
|
+
# step definition in web_steps.rb
|
|
8
|
+
#
|
|
9
|
+
def path_to(page_name)
|
|
10
|
+
case page_name
|
|
11
|
+
|
|
12
|
+
when /the home\s?page/
|
|
13
|
+
root_path
|
|
14
|
+
|
|
15
|
+
when /the sign up page/
|
|
16
|
+
'/users/sign_up'
|
|
17
|
+
|
|
18
|
+
when /the sign in page/
|
|
19
|
+
'/users/sign_in'
|
|
20
|
+
|
|
21
|
+
when /the users admin page/
|
|
22
|
+
admin_users_path
|
|
23
|
+
|
|
24
|
+
when /the login page/
|
|
25
|
+
root_path
|
|
26
|
+
|
|
27
|
+
# Add more mappings here.
|
|
28
|
+
# Here is an example that pulls values out of the Regexp:
|
|
29
|
+
#
|
|
30
|
+
# when /^(.*)'s profile page$/i
|
|
31
|
+
# user_profile_path(User.find_by_login($1))
|
|
32
|
+
|
|
33
|
+
else
|
|
34
|
+
begin
|
|
35
|
+
page_name =~ /the (.*) page/
|
|
36
|
+
path_components = $1.split(/\s+/)
|
|
37
|
+
self.send(path_components.push('path').join('_').to_sym)
|
|
38
|
+
rescue Object => e
|
|
39
|
+
raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
|
|
40
|
+
"Now, go and add a mapping in #{__FILE__}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
World(NavigationHelpers)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
@omniauth
|
|
2
|
+
Feature: Login
|
|
3
|
+
In order to login easily
|
|
4
|
+
As a user of other websites
|
|
5
|
+
I want to be able to login with those credentials
|
|
6
|
+
|
|
7
|
+
@facebook
|
|
8
|
+
Scenario: Login with Facebook
|
|
9
|
+
Given I am on the login page
|
|
10
|
+
Then I can see Sign in with Facebook
|
|
11
|
+
When I click Sign in with Facebook
|
|
12
|
+
Then I should be signed in with Facebook
|
|
13
|
+
|
|
14
|
+
@google
|
|
15
|
+
Scenario: Login with Google
|
|
16
|
+
Given I am on the login page
|
|
17
|
+
Then I can see Sign in with Google
|
|
18
|
+
When I click Sign in with Google
|
|
19
|
+
Then I should be signed in with Google
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Feature: Sign in
|
|
2
|
+
In order to get access to protected sections of the site
|
|
3
|
+
A user
|
|
4
|
+
Should be able to sign in
|
|
5
|
+
|
|
6
|
+
Scenario: User is not signed up
|
|
7
|
+
Given I do not exist as a user
|
|
8
|
+
When I sign in with valid credentials
|
|
9
|
+
Then I see an invalid login message
|
|
10
|
+
And I should be signed out
|
|
11
|
+
|
|
12
|
+
Scenario: User has not confirmed account
|
|
13
|
+
Given I exist as an unconfirmed user
|
|
14
|
+
And I am not logged in
|
|
15
|
+
When I sign in with valid credentials
|
|
16
|
+
Then I see an unconfirmed account message
|
|
17
|
+
And I should be signed out
|
|
18
|
+
Scenario: User signs in successfully
|
|
19
|
+
Given I exist as a user
|
|
20
|
+
And I am not logged in
|
|
21
|
+
When I sign in with valid credentials
|
|
22
|
+
Then I see a successful sign in message
|
|
23
|
+
When I return to the site
|
|
24
|
+
Then I should be signed in
|
|
25
|
+
|
|
26
|
+
Scenario: User enters wrong email
|
|
27
|
+
Given I exist as a user
|
|
28
|
+
And I am not logged in
|
|
29
|
+
When I sign in with a wrong email
|
|
30
|
+
Then I see an invalid login message
|
|
31
|
+
And I should be signed out
|
|
32
|
+
|
|
33
|
+
Scenario: User enters wrong password
|
|
34
|
+
Given I exist as a user
|
|
35
|
+
And I am not logged in
|
|
36
|
+
When I sign in with a wrong password
|
|
37
|
+
Then I see an invalid login message
|
|
38
|
+
And I should be signed out
|
|
39
|
+
|
|
40
|
+
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Feature: Sign out
|
|
2
|
+
To protect my account from unauthorized access
|
|
3
|
+
A signed in user
|
|
4
|
+
Should be able to sign out
|
|
5
|
+
|
|
6
|
+
Scenario: User signs out
|
|
7
|
+
Given I am logged in
|
|
8
|
+
When I sign out
|
|
9
|
+
Then I should see a signed out message
|
|
10
|
+
When I return to the site
|
|
11
|
+
Then I should be signed out
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
Feature: Sign up
|
|
2
|
+
In order to get access to protected sections of the site
|
|
3
|
+
As a user
|
|
4
|
+
I want to be able to sign up
|
|
5
|
+
|
|
6
|
+
Background:
|
|
7
|
+
Given I am not logged in
|
|
8
|
+
|
|
9
|
+
Scenario: User signs up with valid data
|
|
10
|
+
When I sign up with valid user data
|
|
11
|
+
Then I should see a successful sign up message
|
|
12
|
+
|
|
13
|
+
Scenario: User signs up with invalid email
|
|
14
|
+
When I sign up with an invalid email
|
|
15
|
+
Then I should see an invalid email message
|
|
16
|
+
|
|
17
|
+
Scenario: User signs up without password
|
|
18
|
+
When I sign up without a password
|
|
19
|
+
Then I should see a missing password message
|
|
20
|
+
|
|
21
|
+
Scenario: User signs up without password confirmation
|
|
22
|
+
When I sign up without a password confirmation
|
|
23
|
+
Then I should see a missing password confirmation message
|
|
24
|
+
|
|
25
|
+
Scenario: User signs up with mismatched password and confirmation
|
|
26
|
+
When I sign up with a mismatched password confirmation
|
|
27
|
+
Then I should see a mismatched password message
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Feature: Edit User
|
|
2
|
+
As a registered user of the website
|
|
3
|
+
I want to edit my user profile
|
|
4
|
+
so I can change my username
|
|
5
|
+
|
|
6
|
+
Scenario: I sign in and edit my account
|
|
7
|
+
Given I am logged in
|
|
8
|
+
When I edit my account details
|
|
9
|
+
Then I should see an account edited message
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Feature: Admin Users
|
|
2
|
+
As an administrator on the website
|
|
3
|
+
I want to see registered users listed on the backend so I can manage them
|
|
4
|
+
|
|
5
|
+
Scenario: Going to the administration page
|
|
6
|
+
Given I exist as a user
|
|
7
|
+
And I am logged in
|
|
8
|
+
And I am an admin
|
|
9
|
+
And I am on the home page
|
|
10
|
+
Then I can see Admin
|
|
11
|
+
|
|
12
|
+
Scenario: Viewing users
|
|
13
|
+
Given I exist as a user
|
|
14
|
+
And I am logged in
|
|
15
|
+
And I am an admin
|
|
16
|
+
When I look at the list of users
|
|
17
|
+
Then I should see my name
|
|
18
|
+
And I should see my email
|
|
19
|
+
|
|
20
|
+
Scenario: Viewing users without name
|
|
21
|
+
Given I exist as a user
|
|
22
|
+
And I am logged in
|
|
23
|
+
And I am an admin
|
|
24
|
+
And I do not have a name
|
|
25
|
+
When I look at the list of users
|
|
26
|
+
Then the element with class name should not exist
|
|
27
|
+
And I should see my email
|
|
28
|
+
|
|
29
|
+
Scenario: Viewing users without privileges
|
|
30
|
+
Given I exist as a user
|
|
31
|
+
And I am not logged in
|
|
32
|
+
When I look at the list of users
|
|
33
|
+
Then I should be redirected to the home page
|
|
34
|
+
|
|
35
|
+
@javascript
|
|
36
|
+
Scenario: Click the show user and then click the browser back button should work as expected
|
|
37
|
+
Given I exist as a user
|
|
38
|
+
And I am logged in
|
|
39
|
+
And I am an admin
|
|
40
|
+
When I look at the list of users
|
|
41
|
+
And I click Show
|
|
42
|
+
And I go back in history
|
|
43
|
+
Then I should be redirected to the users admin page
|
|
44
|
+
And I should see the name of user number 1
|