raygun 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +63 -0
- data/Rakefile +1 -0
- data/TODO.md +24 -0
- data/bin/raygun +11 -0
- data/lib/raygun/actions.rb +26 -0
- data/lib/raygun/app_builder.rb +283 -0
- data/lib/raygun/generators/app_generator.rb +182 -0
- data/lib/raygun/version.rb +3 -0
- data/marvin.jpg +0 -0
- data/raygun.gemspec +25 -0
- data/templates/Gemfile_customized +32 -0
- data/templates/README.md.erb +31 -0
- data/templates/_app/assets/stylesheets/_footer.less +30 -0
- data/templates/_app/assets/stylesheets/application.css.less +8 -0
- data/templates/_app/controllers/application_controller.rb +14 -0
- data/templates/_app/controllers/password_resets_controller.rb +38 -0
- data/templates/_app/controllers/registrations_controller.rb +27 -0
- data/templates/_app/controllers/user_sessions_controller.rb +25 -0
- data/templates/_app/helpers/application_helper.rb +11 -0
- data/templates/_app/mailers/user_mailer.rb +22 -0
- data/templates/_app/models/user.rb +17 -0
- data/templates/_app/models/user_session.rb +6 -0
- data/templates/_app/views/layouts/application.html.slim.erb +36 -0
- data/templates/_app/views/password_resets/edit.html.slim +16 -0
- data/templates/_app/views/password_resets/new.html.slim +11 -0
- data/templates/_app/views/registrations/new.html.slim +14 -0
- data/templates/_app/views/user_mailer/activation_needed_email.html.erb +17 -0
- data/templates/_app/views/user_mailer/activation_needed_email.text.erb +9 -0
- data/templates/_app/views/user_mailer/activation_success_email.html.erb +17 -0
- data/templates/_app/views/user_mailer/activation_success_email.text.erb +9 -0
- data/templates/_app/views/user_mailer/reset_password_email.html.erb +16 -0
- data/templates/_app/views/user_mailer/reset_password_email.text.erb +8 -0
- data/templates/_app/views/user_sessions/new.html.slim +13 -0
- data/templates/_config/database.yml.erb +13 -0
- data/templates/_db/sample_data.rb +17 -0
- data/templates/_lib/email_validator.rb +9 -0
- data/templates/_lib/tasks/db.rake +7 -0
- data/templates/_lib/templates/rspec/scaffold/controller_spec.rb +152 -0
- data/templates/_lib/templates/slim/scaffold/_form.html.slim +13 -0
- data/templates/_lib/templates/slim/scaffold/edit.html.slim +5 -0
- data/templates/_lib/templates/slim/scaffold/index.html.slim +27 -0
- data/templates/_lib/templates/slim/scaffold/new.html.slim +4 -0
- data/templates/_lib/templates/slim/scaffold/show.html.slim +15 -0
- data/templates/_public/index.html.erb +41 -0
- data/templates/_spec/factories/users.rb +7 -0
- data/templates/_spec/mailers/user_mailer_spec.rb +48 -0
- data/templates/_spec/models/user_spec.rb +29 -0
- data/templates/_spec/requests/user_sessions_spec.rb +29 -0
- data/templates/_spec/support/accept_values.rb +55 -0
- data/templates/_spec/support/factory_girl.rb +3 -0
- data/templates/_spec/support/sorcery.rb +3 -0
- data/templates/_spec/support/user_sessions_request_helper.rb +21 -0
- data/templates/rvmrc.erb +1 -0
- metadata +168 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gem 'thin'
|
4
|
+
gem 'rails', '~> 3.2.8'
|
5
|
+
gem 'slim-rails'
|
6
|
+
gem 'jquery-rails'
|
7
|
+
gem 'sorcery'
|
8
|
+
gem 'simple_form'
|
9
|
+
gem 'active_attr'
|
10
|
+
gem 'pg'
|
11
|
+
gem 'awesome_print'
|
12
|
+
|
13
|
+
group :assets do
|
14
|
+
gem 'less-rails'
|
15
|
+
gem 'less-rails-bootstrap'
|
16
|
+
gem 'coffee-rails'
|
17
|
+
gem 'uglifier'
|
18
|
+
gem 'therubyracer', platforms: :ruby
|
19
|
+
end
|
20
|
+
|
21
|
+
group :test, :development do
|
22
|
+
gem 'rspec-rails'
|
23
|
+
gem 'capybara', github: 'jnicklas/capybara' # TODO Change when 2.0 is released.
|
24
|
+
gem 'factory_girl_rails'
|
25
|
+
gem 'timecop'
|
26
|
+
end
|
27
|
+
|
28
|
+
group :development do
|
29
|
+
gem 'guard'
|
30
|
+
gem 'guard-rspec'
|
31
|
+
gem 'guard-livereload'
|
32
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Overview
|
2
|
+
========
|
3
|
+
|
4
|
+
...
|
5
|
+
|
6
|
+
Requirements
|
7
|
+
============
|
8
|
+
|
9
|
+
* ruby 1.9.?
|
10
|
+
* postgresql 9.?
|
11
|
+
|
12
|
+
Running the Specs
|
13
|
+
=================
|
14
|
+
|
15
|
+
$ rake db:setup db:test:prepare
|
16
|
+
$ rake
|
17
|
+
|
18
|
+
Running the Application
|
19
|
+
=======================
|
20
|
+
|
21
|
+
$ rails s
|
22
|
+
|
23
|
+
Using Guard
|
24
|
+
===========
|
25
|
+
|
26
|
+
$ guard -c
|
27
|
+
|
28
|
+
Considerations
|
29
|
+
==============
|
30
|
+
|
31
|
+
...
|
@@ -0,0 +1,30 @@
|
|
1
|
+
@footerHeight: 30px;
|
2
|
+
|
3
|
+
html, body {
|
4
|
+
height: 100%;
|
5
|
+
}
|
6
|
+
|
7
|
+
.wrapper {
|
8
|
+
min-height: 100%;
|
9
|
+
height: auto !important;
|
10
|
+
height: 100%;
|
11
|
+
margin: 0 auto -(@footerHeight + 1);
|
12
|
+
}
|
13
|
+
|
14
|
+
.push {
|
15
|
+
height: @footerHeight + 20px; // The extra prevents content from bumping right into our footer.
|
16
|
+
}
|
17
|
+
|
18
|
+
footer {
|
19
|
+
height: @footerHeight;
|
20
|
+
line-height: @footerHeight;
|
21
|
+
|
22
|
+
.container {
|
23
|
+
border-top: 1px solid @grayLighter;
|
24
|
+
}
|
25
|
+
|
26
|
+
p {
|
27
|
+
margin: 0;
|
28
|
+
color: @grayLight;
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class ApplicationController < ActionController::Base
|
2
|
+
|
3
|
+
# Uncomment to require auth on all actions (and opt-out when necessary).
|
4
|
+
# before_filter :require_login, except: [:not_authenticated]
|
5
|
+
|
6
|
+
protect_from_forgery
|
7
|
+
|
8
|
+
protected
|
9
|
+
|
10
|
+
def not_authenticated
|
11
|
+
redirect_to sign_in_path, alert: "Please sign in first."
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class PasswordResetsController < ApplicationController
|
2
|
+
|
3
|
+
skip_before_filter :require_login
|
4
|
+
|
5
|
+
def create
|
6
|
+
@user = User.find_by_email(params[:email])
|
7
|
+
|
8
|
+
# Send an email to the user with instructions on how to reset their password.
|
9
|
+
@user.deliver_reset_password_instructions! if @user
|
10
|
+
|
11
|
+
# Tell the user instructions have been sent whether or not email was found.
|
12
|
+
# This is to not leak information to attackers about which emails exist in the system.
|
13
|
+
redirect_to sign_in_path, notice: "Password reset instructions have been sent to your email."
|
14
|
+
end
|
15
|
+
|
16
|
+
def edit
|
17
|
+
@user = User.load_from_reset_password_token(params[:id])
|
18
|
+
@token = params[:id]
|
19
|
+
not_authenticated if !@user
|
20
|
+
end
|
21
|
+
|
22
|
+
def update
|
23
|
+
@token = params[:token] # needed to render the form again in case of error
|
24
|
+
@user = User.load_from_reset_password_token(@token)
|
25
|
+
not_authenticated if !@user
|
26
|
+
|
27
|
+
# Makes the password confirmation validation work.
|
28
|
+
@user.password_confirmation = params[:user][:password_confirmation]
|
29
|
+
|
30
|
+
# Clear the temporary token and update the password.
|
31
|
+
if @user.change_password!(params[:user][:password])
|
32
|
+
redirect_to sign_in_path, notice: "Password was successfully updated."
|
33
|
+
else
|
34
|
+
render action: 'edit'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class RegistrationsController < ApplicationController
|
2
|
+
|
3
|
+
def new
|
4
|
+
@user = User.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def create
|
8
|
+
@user = User.new(params[:user])
|
9
|
+
|
10
|
+
if @user.save
|
11
|
+
redirect_to sign_in_path, notice: "Thanks for signing up. Please check your email for activation instructions."
|
12
|
+
else
|
13
|
+
render action: 'new'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def activate
|
18
|
+
if @user = User.load_from_activation_token(params[:token])
|
19
|
+
@user.activate!
|
20
|
+
auto_login @user
|
21
|
+
redirect_to sign_in_path, notice: "Your account has been activated and you're now signed in. Enjoy!"
|
22
|
+
else
|
23
|
+
not_authenticated
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class UserSessionsController < ApplicationController
|
2
|
+
|
3
|
+
skip_before_filter :require_login, except: [:destroy]
|
4
|
+
|
5
|
+
def new
|
6
|
+
@user_session = UserSession.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def create
|
10
|
+
@user_session = UserSession.new(params[:user_session])
|
11
|
+
|
12
|
+
if @user = login(@user_session.email, @user_session.password, @user_session.remember_me)
|
13
|
+
redirect_back_or_to :users, notice: "Successfully signed in."
|
14
|
+
else
|
15
|
+
flash.now[:alert] = "Sign in failed."
|
16
|
+
render action: 'new'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def destroy
|
21
|
+
logout
|
22
|
+
redirect_to :users, notice: "Signed out!"
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class UserMailer < ActionMailer::Base
|
2
|
+
|
3
|
+
default from: 'notifications@example.com'
|
4
|
+
|
5
|
+
def activation_needed_email(user)
|
6
|
+
@user = user
|
7
|
+
@url = "http://0.0.0.0:3000/sign_up/#{user.activation_token}/activate"
|
8
|
+
mail to: user.email, subject: "Welcome to My Awesome Site!"
|
9
|
+
end
|
10
|
+
|
11
|
+
def activation_success_email(user)
|
12
|
+
@user = user
|
13
|
+
@url = "http://0.0.0.0:3000/sign_in"
|
14
|
+
mail to: user.email, subject: "Your account has been activated!"
|
15
|
+
end
|
16
|
+
|
17
|
+
def reset_password_email(user)
|
18
|
+
@user = user
|
19
|
+
@url = "http://0.0.0.0:3000/password_resets/#{user.reset_password_token}/edit"
|
20
|
+
mail to: user.email, subject: "Password reset requested"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class User < ActiveRecord::Base
|
2
|
+
|
3
|
+
attr_accessible :name, :email, :password, :password_confirmation
|
4
|
+
|
5
|
+
authenticates_with_sorcery!
|
6
|
+
|
7
|
+
validates :email,
|
8
|
+
presence: true,
|
9
|
+
email: true
|
10
|
+
|
11
|
+
validates :password,
|
12
|
+
presence: true,
|
13
|
+
length: { minimum: 3},
|
14
|
+
confirmation: true,
|
15
|
+
if: :password
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
doctype 5
|
2
|
+
html
|
3
|
+
head
|
4
|
+
title <%= app_name.capitalize %>
|
5
|
+
= stylesheet_link_tag 'application', media: 'all'
|
6
|
+
= javascript_include_tag 'application'
|
7
|
+
= csrf_meta_tag
|
8
|
+
|
9
|
+
body id=(controller.controller_name) class=(controller.action_name)
|
10
|
+
.wrapper
|
11
|
+
.container
|
12
|
+
header.navbar.navbar-fixed-top
|
13
|
+
nav.navbar-inner
|
14
|
+
.container
|
15
|
+
.brand <%= app_name.capitalize %>
|
16
|
+
ul.nav.pull-right
|
17
|
+
- if current_user
|
18
|
+
li.dropdown
|
19
|
+
a.dropdown-toggle href='#' data-toggle='dropdown'
|
20
|
+
= current_user.email
|
21
|
+
b.caret
|
22
|
+
ul.dropdown-menu
|
23
|
+
li= link_to 'Sign Out', sign_out_path
|
24
|
+
- else
|
25
|
+
li= link_to 'Sign in', sign_in_path
|
26
|
+
|
27
|
+
- flash.each do |name, msg|
|
28
|
+
= content_tag :div, raw(msg), class: "alert #{alert_class(name)}"
|
29
|
+
|
30
|
+
= yield
|
31
|
+
|
32
|
+
.push
|
33
|
+
|
34
|
+
footer
|
35
|
+
.container
|
36
|
+
p © 2012 All rights reserved.
|
@@ -0,0 +1,16 @@
|
|
1
|
+
.page-header
|
2
|
+
h1 Reset Your Password
|
3
|
+
|
4
|
+
= simple_form_for(@user, url: password_reset_path(@user)) do |f|
|
5
|
+
= f.error_notification
|
6
|
+
|
7
|
+
.form-inputs
|
8
|
+
= f.input :email, disabled: true
|
9
|
+
= f.input :password, required: true, autofocus: true
|
10
|
+
= f.input :password_confirmation, required: true
|
11
|
+
= hidden_field_tag :token, @token
|
12
|
+
|
13
|
+
.form-actions
|
14
|
+
= f.button :submit, 'Reset Password', class: 'btn btn-primary'
|
15
|
+
'
|
16
|
+
= link_to 'Cancel', sign_in_path, class: 'btn'
|
@@ -0,0 +1,11 @@
|
|
1
|
+
.page-header
|
2
|
+
h1 Password Reset
|
3
|
+
|
4
|
+
= form_tag(password_resets_path, method: :post) do
|
5
|
+
.control-group
|
6
|
+
= label_tag :email, nil, class: 'control-label'
|
7
|
+
.controls
|
8
|
+
= text_field_tag :email, nil, placeholder: 'joe@example.com'
|
9
|
+
|
10
|
+
.form-actions
|
11
|
+
= submit_tag "Reset my password!", class: 'btn btn-primary'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
.page-header
|
2
|
+
h1 Sign up for an Account
|
3
|
+
|
4
|
+
= simple_form_for(@user, url: sign_up_path) do |f|
|
5
|
+
= f.error_notification
|
6
|
+
|
7
|
+
.form-inputs
|
8
|
+
= f.input :name, autofocus: true
|
9
|
+
= f.input :email
|
10
|
+
= f.input :password
|
11
|
+
= f.input :password_confirmation
|
12
|
+
|
13
|
+
.form-actions
|
14
|
+
= f.button :submit, 'Sign up', class: 'btn btn-primary'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
5
|
+
</head>
|
6
|
+
<body>
|
7
|
+
<h1>Welcome to example.com, <%= @user.email %></h1>
|
8
|
+
<p>
|
9
|
+
You have successfully signed up to example.com,
|
10
|
+
your username is: <%= @user.email %>.<br/>
|
11
|
+
</p>
|
12
|
+
<p>
|
13
|
+
To login to the site, just follow this link: <%= @url %>.
|
14
|
+
</p>
|
15
|
+
<p>Thanks for joining and have a great day!</p>
|
16
|
+
</body>
|
17
|
+
</html>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Welcome to example.com, <%= @user.email %>
|
2
|
+
===============================================
|
3
|
+
|
4
|
+
You have successfully signed up to example.com,
|
5
|
+
your username is: <%= @user.email %>.
|
6
|
+
|
7
|
+
To login to the site, just follow this link: <%= @url %>.
|
8
|
+
|
9
|
+
Thanks for joining and have a great day!
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
5
|
+
</head>
|
6
|
+
<body>
|
7
|
+
<h1>Congratz, <%= @user.email %></h1>
|
8
|
+
<p>
|
9
|
+
You have successfully activated your example.com account,
|
10
|
+
your username is: <%= @user.email %>.<br/>
|
11
|
+
</p>
|
12
|
+
<p>
|
13
|
+
To login to the site, just follow this link: <%= @url %>.
|
14
|
+
</p>
|
15
|
+
<p>Thanks for joining and have a great day!</p>
|
16
|
+
</body>
|
17
|
+
</html>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Congratz, <%= @user.email %>
|
2
|
+
===============================================
|
3
|
+
|
4
|
+
You have successfully activated your example.com account,
|
5
|
+
your username is: <%= @user.email %>.
|
6
|
+
|
7
|
+
To login to the site, just follow this link: <%= @url %>.
|
8
|
+
|
9
|
+
Thanks for joining and have a great day!
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
5
|
+
</head>
|
6
|
+
<body>
|
7
|
+
<h1>Hello, <%= @user.email %></h1>
|
8
|
+
<p>
|
9
|
+
You have requested to reset your password.
|
10
|
+
</p>
|
11
|
+
<p>
|
12
|
+
To choose a new password, just follow this link: <%= @url %>.
|
13
|
+
</p>
|
14
|
+
<p>Have a great day!</p>
|
15
|
+
</body>
|
16
|
+
</html>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
= simple_form_for(@user_session) do |f|
|
2
|
+
= f.error_notification
|
3
|
+
|
4
|
+
.form-inputs
|
5
|
+
= f.input :email, placeholder: 'jdoe@example.com', autofocus: true
|
6
|
+
= f.input :password
|
7
|
+
|
8
|
+
ul.unstyled
|
9
|
+
li= link_to 'Sign up', sign_up_path
|
10
|
+
li= link_to 'Reset forgotten password', new_password_reset_path
|
11
|
+
|
12
|
+
.form-actions
|
13
|
+
= f.button :submit, 'Sign In', class: 'btn btn-primary'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Use 'createuser -s postgres' to create a general purpose db (super)user.
|
2
|
+
|
3
|
+
development: &default
|
4
|
+
adapter: postgresql
|
5
|
+
database: <%= app_name %>_development
|
6
|
+
username: postgres
|
7
|
+
pool: 5
|
8
|
+
timeout: 5000
|
9
|
+
|
10
|
+
test: &TEST
|
11
|
+
<<: *default
|
12
|
+
database: <%= app_name %>_test
|
13
|
+
min_messages: warning
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Populate the database with a small set of realistic sample data so that as a developer/designer, you can use the
|
2
|
+
# application without having to create a bunch of stuff or pull down production data.
|
3
|
+
#
|
4
|
+
# After running db:sample_data, a developer/designer should be able to fire up the app, sign in, browse data and see
|
5
|
+
# examples of practically anything (interesting) that can happen in the system.
|
6
|
+
#
|
7
|
+
# It's a good idea to build this up along with the features; when you build a feature, make sure you can easily demo it
|
8
|
+
# after running db:sample_data.
|
9
|
+
#
|
10
|
+
# Data that is required by the application across all environments (i.e. reference data) should _not_ be included here.
|
11
|
+
# That belongs in seeds.rb instead.
|
12
|
+
|
13
|
+
User.create! do |u|
|
14
|
+
u.email = 'user@example.com'
|
15
|
+
u.name = 'John Smith'
|
16
|
+
u.password = 'password'
|
17
|
+
end.activate!
|
@@ -0,0 +1,7 @@
|
|
1
|
+
namespace :db do
|
2
|
+
desc "Load a small, representative set of data so that the application can start in an use state (for development)."
|
3
|
+
task :sample_data => :environment do
|
4
|
+
sample_data = File.join(Rails.root, 'db', 'sample_data.rb')
|
5
|
+
load(sample_data) if sample_data
|
6
|
+
end
|
7
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe <%= controller_class_name %>Controller do
|
4
|
+
|
5
|
+
# This should return the minimal set of attributes required to create a valid
|
6
|
+
# <%= class_name %>. As you add validations to <%= class_name %>, be sure to
|
7
|
+
# update the return value of this method accordingly.
|
8
|
+
def valid_attributes
|
9
|
+
attributes_for :<%= file_name %>
|
10
|
+
end
|
11
|
+
|
12
|
+
# This should return the minimal set of values that should be in the session
|
13
|
+
# in order to pass any filters (e.g. authentication) defined in
|
14
|
+
# <%= controller_class_name %>Controller. Be sure to keep this updated too.
|
15
|
+
def valid_session
|
16
|
+
{}
|
17
|
+
end
|
18
|
+
|
19
|
+
before do
|
20
|
+
login_user build :user
|
21
|
+
end
|
22
|
+
|
23
|
+
<% unless options[:singleton] -%>
|
24
|
+
describe "GET index" do
|
25
|
+
it "assigns all <%= table_name.pluralize %> as @<%= table_name.pluralize %>" do
|
26
|
+
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
27
|
+
get :index, {}, valid_session
|
28
|
+
assigns(:<%= table_name %>).should eq([<%= file_name %>])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
<% end -%>
|
33
|
+
describe "GET show" do
|
34
|
+
it "assigns the requested <%= ns_file_name %> as @<%= ns_file_name %>" do
|
35
|
+
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
36
|
+
get :show, {:id => <%= file_name %>.to_param}, valid_session
|
37
|
+
assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "GET new" do
|
42
|
+
it "assigns a new <%= ns_file_name %> as @<%= ns_file_name %>" do
|
43
|
+
get :new, {}, valid_session
|
44
|
+
assigns(:<%= ns_file_name %>).should be_a_new(<%= class_name %>)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "GET edit" do
|
49
|
+
it "assigns the requested <%= ns_file_name %> as @<%= ns_file_name %>" do
|
50
|
+
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
51
|
+
get :edit, {:id => <%= file_name %>.to_param}, valid_session
|
52
|
+
assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "POST create" do
|
57
|
+
describe "with valid params" do
|
58
|
+
it "creates a new <%= class_name %>" do
|
59
|
+
expect {
|
60
|
+
post :create, {:<%= ns_file_name %> => valid_attributes}, valid_session
|
61
|
+
}.to change(<%= class_name %>, :count).by(1)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "assigns a newly created <%= ns_file_name %> as @<%= ns_file_name %>" do
|
65
|
+
post :create, {:<%= ns_file_name %> => valid_attributes}, valid_session
|
66
|
+
assigns(:<%= ns_file_name %>).should be_a(<%= class_name %>)
|
67
|
+
assigns(:<%= ns_file_name %>).should be_persisted
|
68
|
+
end
|
69
|
+
|
70
|
+
it "redirects to the created <%= ns_file_name %>" do
|
71
|
+
post :create, {:<%= ns_file_name %> => valid_attributes}, valid_session
|
72
|
+
response.should redirect_to(<%= class_name %>.last)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "with invalid params" do
|
77
|
+
it "assigns a newly created but unsaved <%= ns_file_name %> as @<%= ns_file_name %>" do
|
78
|
+
# Trigger the behavior that occurs when invalid params are submitted
|
79
|
+
<%= class_name %>.any_instance.stub(:save).and_return(false)
|
80
|
+
post :create, {:<%= ns_file_name %> => {}}, valid_session
|
81
|
+
assigns(:<%= ns_file_name %>).should be_a_new(<%= class_name %>)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "re-renders the 'new' template" do
|
85
|
+
# Trigger the behavior that occurs when invalid params are submitted
|
86
|
+
<%= class_name %>.any_instance.stub(:save).and_return(false)
|
87
|
+
post :create, {:<%= ns_file_name %> => {}}, valid_session
|
88
|
+
response.should render_template("new")
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "PUT update" do
|
94
|
+
describe "with valid params" do
|
95
|
+
it "updates the requested <%= ns_file_name %>" do
|
96
|
+
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
97
|
+
# Assuming there are no other <%= table_name %> in the database, this
|
98
|
+
# specifies that the <%= class_name %> created on the previous line
|
99
|
+
# receives the :update_attributes message with whatever params are
|
100
|
+
# submitted in the request.
|
101
|
+
<%= class_name %>.any_instance.should_receive(:update_attributes).with(<%= params %>)
|
102
|
+
put :update, {:id => <%= file_name %>.to_param, :<%= ns_file_name %> => <%= params %>}, valid_session
|
103
|
+
end
|
104
|
+
|
105
|
+
it "assigns the requested <%= ns_file_name %> as @<%= ns_file_name %>" do
|
106
|
+
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
107
|
+
put :update, {:id => <%= file_name %>.to_param, :<%= ns_file_name %> => valid_attributes}, valid_session
|
108
|
+
assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "redirects to the <%= ns_file_name %>" do
|
112
|
+
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
113
|
+
put :update, {:id => <%= file_name %>.to_param, :<%= ns_file_name %> => valid_attributes}, valid_session
|
114
|
+
response.should redirect_to(<%= file_name %>)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "with invalid params" do
|
119
|
+
it "assigns the <%= ns_file_name %> as @<%= ns_file_name %>" do
|
120
|
+
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
121
|
+
# Trigger the behavior that occurs when invalid params are submitted
|
122
|
+
<%= class_name %>.any_instance.stub(:save).and_return(false)
|
123
|
+
put :update, {:id => <%= file_name %>.to_param, :<%= ns_file_name %> => {}}, valid_session
|
124
|
+
assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "re-renders the 'edit' template" do
|
128
|
+
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
129
|
+
# Trigger the behavior that occurs when invalid params are submitted
|
130
|
+
<%= class_name %>.any_instance.stub(:save).and_return(false)
|
131
|
+
put :update, {:id => <%= file_name %>.to_param, :<%= ns_file_name %> => {}}, valid_session
|
132
|
+
response.should render_template("edit")
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "DELETE destroy" do
|
138
|
+
it "destroys the requested <%= ns_file_name %>" do
|
139
|
+
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
140
|
+
expect {
|
141
|
+
delete :destroy, {:id => <%= file_name %>.to_param}, valid_session
|
142
|
+
}.to change(<%= class_name %>, :count).by(-1)
|
143
|
+
end
|
144
|
+
|
145
|
+
it "redirects to the <%= table_name %> list" do
|
146
|
+
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
147
|
+
delete :destroy, {:id => <%= file_name %>.to_param}, valid_session
|
148
|
+
response.should redirect_to(<%= index_helper %>_url)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|