fixing functional tests

This commit is contained in:
albert
2011-07-17 16:42:26 -04:00
parent 04ab2f4701
commit 72e9da01b5
26 changed files with 446 additions and 46 deletions

View File

@@ -0,0 +1,20 @@
module Maintenance
module User
class LoginRemindersController < ApplicationController
def new
end
def create
@user = ::User.with_email(params[:user][:email]).first
if @user
LoginReminderMailer.notice(@user).deliver
flash[:notice] = "Email sent"
else
flash[:notice] = "Email address not found"
end
redirect_to new_maintenance_user_login_reminder_path
end
end
end
end

View File

@@ -0,0 +1,34 @@
module Maintenance
module User
class PasswordResetsController < ApplicationController
def new
@nonce = UserPasswordResetNonce.new
end
def create
@nonce = UserPasswordResetNonce.create(params[:nonce])
if @nonce.errors.any?
redirect_to new_maintenance_user_password_reset_path, :notice => @nonce.errors.full_messages.join("; ")
else
redirect_to new_maintenance_user_password_reset_path, :notice => "Email request sent"
end
end
def edit
@nonce = UserPasswordResetNonce.where(:email => params[:email], :key => params[:key]).first
end
def update
@nonce = UserPasswordResetNonce.where(:email => params[:email], :key => params[:key]).first
if @nonce
@nonce.reset_user!
@nonce.destroy
redirect_to new_maintenance_user_password_reset_path, :notice => "Password reset; email delivered with new password"
else
redirect_to new_maintenance_user_password_reset_path, :notice => "Invalid key"
end
end
end
end
end

View File

@@ -1,25 +0,0 @@
class UserMaintenanceController < ApplicationController
def login_reminder
if request.post?
@user = User.with_email(params[:user][:email]).first
if @user
UserMaintenanceMailer.login_reminder(@user).deliver
flash[:notice] = "Email sent"
else
flash[:notice] = "No matching user record found"
end
end
end
def reset_password
if request.post?
@user = User.find_for_password_reset(params[:user][:name], params[:user][:email]).first
if @user
@user.reset_password_and_deliver_notice
flash[:notice] = "Email sent"
else
flash[:notice] = "No matching user record found"
end
end
end
end

View File

@@ -3,7 +3,7 @@ class WikiPageVersionsController < ApplicationController
def index
@search = WikiPageVersion.search(params[:search])
@wiki_page_versions = @search.paginate(:page => params[:page])
@wiki_page_versions = @search.paginate(params[:page])
respond_with(@wiki_page_versions)
end

View File

@@ -6,5 +6,13 @@ module PostSets
super(:tags => artist.name)
@artist = artist
end
def posts
::Post.tag_match(@artist.name)
end
def presenter
::PostSetPresenters::Post.new(self)
end
end
end

View File

@@ -0,0 +1,10 @@
module Maintenance
module User
class LoginReminderMailer < ActionMailer::Base
def notice(user)
@user = user
mail(:to => user.email, :subject => "#{Danbooru.config.app_name} login reminder")
end
end
end
end

View File

@@ -0,0 +1,15 @@
module Maintenance
module User
class PasswordResetMailer < ActionMailer::Base
def request(user)
@user = user
mail(:to => @user.email, :subject => "#{Danbooru.config.app_name} password reset request")
end
def confirmation(user)
@user = user
mail(:to => @user.email, :subject => "#{Danbooru.config.app_name} password reset confirmation")
end
end
end
end

View File

@@ -1,10 +1,6 @@
class UserMaintenanceMailer < ActionMailer::Base
default :from => Danbooru.config.contact_email
def login_reminder(user)
@user = user
mail(:to => user.email, :subject => "#{Danbooru.config.app_name} login reminder")
end
def reset_password(user, new_password)
@user = user

View File

@@ -0,0 +1,30 @@
class UserPasswordResetNonce < ActiveRecord::Base
validates_uniqueness_of :email
validates_presence_of :email, :key
validate :validate_existence_of_email
before_validation :initialize_key, :on => :create
after_create :deliver_notice
def deliver_notice
Maintenance::User::PasswordResetMailer.request(user).deliver
end
def initialize_key
self.key = SecureRandom.hex(16)
end
def validate_existence_of_email
if !User.with_email(email).exists?
errors[:email] << "is invalid"
return false
end
end
def reset_user!
user.reset_password_and_deliver_notice
end
def user
@user ||= User.with_email(email).first
end
end

View File

@@ -82,7 +82,7 @@ class WikiPage < ActiveRecord::Base
end
def post_set
@post_set ||= PostSets::WikiPage.new(title)
@post_set ||= PostSets::Post.new(title)
end
def presenter

View File

@@ -0,0 +1 @@
<p>Your username is <%= @user.name %>.</p>

View File

@@ -0,0 +1,9 @@
<div id="c-maintenance-user-login-reminders">
<div id="a-new">
<h1>Login Reminder</h1>
<p>If you supplied an email address when signing up, <%= Danbooru.config.app_name %> can email you your login information. Password details will not be provided and will not be changed.</p>
<p>If you didn't supply a valid email address, you are out of luck.</p>
</div>
</div>

View File

@@ -0,0 +1,14 @@
<div id="c-maintenance-user-password-resets">
<div id="a-edit">
<h1>Reset Password</h1>
<% if @nonce %>
<%= form_tag(maintenance_user_password_reset_path, :method => :put) do %>
<p>Do you wish to reset your password? A new password will be emailed to you.</p>
<%= submit_tag "Reset" %>
<% end %>
<% else %>
<p>Invalid key</p>
<% end %>
</div>
</div>

View File

@@ -0,0 +1,14 @@
<div id="c-maintenance-user-password-resets">
<div id="a-new">
<h1>Reset Password</h1>
<p>If you supplied an email address when signing up, <%= Danbooru.config.app_name %> can reset your password. You will receive an email confirming your request for a new password.</p>
<p>If you didn't supply a valid email address, you are out of luck.</p>
<%= form_tag(maintenance_user_password_reset_path, :method => :post) do %>
<%= text_field :nonce, :email %>
<%= submit_tag "Submit" %>
<% end %>
</div>
</div>

View File

@@ -4,12 +4,6 @@
<% simple_form_for(@search) do |f| %>
<%= f.input :name_contains, :label => "Name" %>
<%= f.input :is_banned_is_true, :label => "Banned" %>
<%= f.input :is_privileged_is_true, :label => "Privileged" %>
<%= f.input :is_contributor_is_true, :label => "Contributor" %>
<%= f.input :is_janitor_is_true, :label => "Janitor" %>
<%= f.input :is_moderator_is_true, :label => "Moderator" %>
<%= f.input :is_admin_is_true, :label => "Admin" %>
<%= f.sort_link "Name", :name %>
<%= f.sort_link "Date", :created_at_desc %>
<%= f.button :submit %>
@@ -47,18 +41,18 @@
<td></td>
<% end %>
<td><%= link_to user.note_versions.count, note_versions_path(:search => {:updater_id_eq => user.id}) %></td>
<td><%= user.pretty_level %></td>
<td><%= user.level_string %></td>
<td><span title="<%= user.created_at %>"><%= time_ago_in_words user.created_at %> ago</span></td>
</tr>
<% end %>
</tbody>
</table>
<div id="paginator">
<%= will_paginate(@users) %>
<div class="paginator">
<%= numbered_paginator(@users) %>
</div>
<%= render :partial => "footer" %>
<%= render "secondary_links" %>
</div>
</div>

View File

@@ -10,7 +10,7 @@
</div>
<div id="wiki-page-posts">
<%= @wiki_page.post_set.presenter.post_previews_html %>
<%= @wiki_page.post_set.presenter.post_previews_html(self) %>
</div>
</section>
</div>

View File

@@ -12,7 +12,7 @@ module Danbooru
config.encoding = "utf-8"
config.filter_parameters += [:password]
config.assets.enabled = true
config.autoload_paths += %W(#{config.root}/app/presenters #{config.root}/app/logical)
config.autoload_paths += %W(#{config.root}/app/presenters #{config.root}/app/logical #{config.root}/app/mailers)
config.plugins = [:all]
config.time_zone = 'Eastern Time (US & Canada)'
# config.action_view.javascript_expansions[:defaults] = [

View File

@@ -2422,6 +2422,38 @@ CREATE SEQUENCE user_feedback_id_seq
ALTER SEQUENCE user_feedback_id_seq OWNED BY user_feedback.id;
--
-- Name: user_password_reset_nonces; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
CREATE TABLE user_password_reset_nonces (
id integer NOT NULL,
key character varying(255) NOT NULL,
email character varying(255) NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone
);
--
-- Name: user_password_reset_nonces_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE user_password_reset_nonces_id_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
--
-- Name: user_password_reset_nonces_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE user_password_reset_nonces_id_seq OWNED BY user_password_reset_nonces.id;
--
-- Name: users; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
@@ -2758,6 +2790,13 @@ ALTER TABLE uploads ALTER COLUMN id SET DEFAULT nextval('uploads_id_seq'::regcla
ALTER TABLE user_feedback ALTER COLUMN id SET DEFAULT nextval('user_feedback_id_seq'::regclass);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE user_password_reset_nonces ALTER COLUMN id SET DEFAULT nextval('user_password_reset_nonces_id_seq'::regclass);
--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
@@ -3027,6 +3066,14 @@ ALTER TABLE ONLY user_feedback
ADD CONSTRAINT user_feedback_pkey PRIMARY KEY (id);
--
-- Name: user_password_reset_nonces_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
ALTER TABLE ONLY user_password_reset_nonces
ADD CONSTRAINT user_password_reset_nonces_pkey PRIMARY KEY (id);
--
-- Name: users_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
@@ -5122,4 +5169,6 @@ INSERT INTO schema_migrations (version) VALUES ('20110328215652');
INSERT INTO schema_migrations (version) VALUES ('20110328215701');
INSERT INTO schema_migrations (version) VALUES ('20110607194023');
INSERT INTO schema_migrations (version) VALUES ('20110607194023');
INSERT INTO schema_migrations (version) VALUES ('20110717010705');

View File

@@ -0,0 +1,9 @@
class CreateUserPasswordResetNonces < ActiveRecord::Migration
def change
create_table :user_password_reset_nonces do |t|
t.column :key, :string, :null => false
t.column :email, :string, :null => false
t.timestamps
end
end
end

View File

@@ -0,0 +1,2 @@
Factory.define(:user_password_reset_nonce) do |f|
end

View File

@@ -0,0 +1,11 @@
# Read about fixtures at http://api.rubyonrails.org/classes/Fixtures.html
# This model initially had no columns defined. If you add columns to the
# model remove the '{}' from the fixture names and add the columns immediately
# below each fixture, per the syntax in the comments below
#
one: {}
# column: value
#
two: {}
# column: value

View File

@@ -0,0 +1,44 @@
require "test_helper"
module Maintenance
module User
class LoginRemindersControllerTest < ActionController::TestCase
context "A login reminder controller" do
setup do
@user = Factory.create(:user)
@blank_email_user = Factory.create(:user, :email => "")
CurrentUser.user = nil
CurrentUser.ip_addr = "127.0.0.1"
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.deliveries.clear
end
teardown do
CurrentUser.user = nil
CurrentUser.ip_addr = nil
end
should "render the new page" do
get :new
assert_response :success
end
should "deliver an email with the login to the user" do
post :create, {:user => {:email => @user.email}}
assert_equal(flash[:notice], "Email sent")
assert_equal(1, ActionMailer::Base.deliveries.size)
end
context "for a user with a blank email" do
should "fail" do
post :create, {:user => {:email => ""}}
assert_equal("Email address not found", flash[:notice])
@blank_email_user.reload
assert_equal(@blank_email_user.created_at, @blank_email_user.updated_at)
assert_equal(0, ActionMailer::Base.deliveries.size)
end
end
end
end
end
end

View File

@@ -0,0 +1,98 @@
require "test_helper"
module Maintenance
module User
class PasswordResetsControllerTest < ActionController::TestCase
context "A password resets controller" do
setup do
@user = Factory.create(:user, :email => "abc@com.net")
CurrentUser.user = nil
CurrentUser.ip_addr = "127.0.0.1"
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.deliveries.clear
end
teardown do
CurrentUser.user = nil
CurrentUser.ip_addr = nil
end
should "render the new page" do
get :new
assert_response :success
end
context "create action" do
context "given invalid parameters" do
setup do
post :create, {:nonce => {:email => ""}}
end
should "not create a new nonce" do
assert_equal(0, UserPasswordResetNonce.count)
end
should "redirect to the new page" do
assert_redirected_to new_maintenance_user_password_reset_path
end
should "not deliver an email" do
assert_equal(0, ActionMailer::Base.deliveries.size)
end
end
context "given valid parameters" do
setup do
post :create, {:nonce => {:email => @user.email}}
end
should "create a new nonce" do
assert_equal(1, UserPasswordResetNonce.where(:email => @user.email).count)
end
should "redirect to the new page" do
assert_redirected_to new_maintenance_user_password_reset_path
end
should "deliver an email to the supplied email address" do
assert_equal(1, ActionMailer::Base.deliveries.size)
end
end
end
context "edit action" do
context "with invalid parameters" do
setup do
get :edit, :email => "a@b.c"
end
should "succeed silently" do
assert_response :success
end
end
context "with valid parameters" do
setup do
@user = Factory.create(:user)
@nonce = Factory.create(:user_password_reset_nonce, :email => @user.email)
ActionMailer::Base.deliveries.clear
post :update, :email => @nonce.email, :key => @nonce.key
end
should "succeed" do
assert_redirected_to new_maintenance_user_password_reset_path
end
should "send an email" do
assert_equal(1, ActionMailer::Base.deliveries.size)
end
should "delete the nonce" do
assert_equal(0, UserPasswordResetNonce.count)
end
end
end
end
end
end
end

View File

@@ -15,7 +15,8 @@ class WikiPagesControllerTest < ActionController::TestCase
context "index action" do
setup do
Factory.create(:wiki_page, :title => "abc")
@wiki_page_abc = Factory.create(:wiki_page, :title => "abc")
@wiki_page_def = Factory.create(:wiki_page, :title => "def")
end
should "list all wiki_pages" do
@@ -25,7 +26,7 @@ class WikiPagesControllerTest < ActionController::TestCase
should "list all wiki_pages (with search)" do
get :index, {:search => {:title_matches => "abc"}}
assert_response :success
assert_redirected_to(wiki_page_path(@wiki_page_abc))
end
end

View File

@@ -0,0 +1,18 @@
require "test_helper"
module Maintenance
module User
class LoginReminderMailerTest < ActionMailer::TestCase
context "The login reminder mailer" do
setup do
@user = Factory.create(:user)
end
should "send the notie" do
LoginReminderMailer.notice(@user).deliver
assert !ActionMailer::Base.deliveries.empty?
end
end
end
end
end

View File

@@ -0,0 +1,48 @@
require 'test_helper'
class UserPasswordResetNonceTest < ActiveSupport::TestCase
context "Creating a new nonce" do
context "with a valid email" do
setup do
@user = Factory.create(:user, :email => "aaa@b.net")
@nonce = Factory.create(:user_password_reset_nonce, :email => @user.email)
end
should "validate" do
assert_equal([], @nonce.errors.full_messages)
end
should "populate the key with a random string" do
assert_equal(32, @nonce.key.size)
end
should "reset the password when reset" do
@nonce.user.expects(:reset_password_and_deliver_notice)
@nonce.reset_user!
end
end
context "with a blank email" do
setup do
@user = Factory.create(:user, :email => "")
@nonce = UserPasswordResetNonce.new(:email => "")
end
should "not validate" do
@nonce.save
assert_equal(["Email can't be blank", "Email is invalid"], @nonce.errors.full_messages.sort)
end
end
context "with an invalid email" do
setup do
@nonce = UserPasswordResetNonce.new(:email => "z@z.net")
end
should "not validate" do
@nonce.save
assert_equal(["Email is invalid"], @nonce.errors.full_messages)
end
end
end
end