From 46164eab4f61ea76b292d1218303b6f3bfad28b6 Mon Sep 17 00:00:00 2001 From: albert Date: Sun, 5 Dec 2010 22:27:45 -0500 Subject: [PATCH] finished dmails and favorites functional tests --- Gemfile | 1 + Gemfile.lock | 4 + app/controllers/application_controller.rb | 4 +- app/controllers/dmails_controller.rb | 10 +- app/controllers/favorites_controller.rb | 8 +- app/logical/favorite.rb | 4 + app/logical/post_sets/base.rb | 2 +- app/logical/post_sets/favorite.rb | 12 ++- app/models/dmail.rb | 11 ++- app/models/user.rb | 2 +- app/views/dmails/edit.html.erb | 2 +- app/views/dmails/index.html.erb | 4 +- app/views/dmails/new.html.erb | 2 +- app/views/dmails/show.html.erb | 12 +++ db/migrate/20100219230537_create_dmails.rb | 2 - test/factories/dmail.rb | 6 +- .../advertisements_controller_test.rb | 8 +- .../artist_versions_controller_test.rb | 4 +- test/functional/artists_controller_test.rb | 8 +- test/functional/bans_controller_test.rb | 8 +- test/functional/comments_controller_test.rb | 2 +- test/functional/dmails_controller_test.rb | 97 ++++++++++++++++++- test/functional/favorites_controller_test.rb | 57 ++++++++++- test/test_helper.rb | 3 + test/unit/dmail_test.rb | 1 - 25 files changed, 226 insertions(+), 48 deletions(-) create mode 100644 app/views/dmails/show.html.erb diff --git a/Gemfile b/Gemfile index 73787f0a6..19cd0949f 100644 --- a/Gemfile +++ b/Gemfile @@ -5,6 +5,7 @@ group :test do gem "factory_girl" gem "mocha" gem "ffaker", :git => "http://github.com/EmmanuelOga/ffaker.git" + gem "simplecov", :require => false end gem "rails", "3.0.0" diff --git a/Gemfile.lock b/Gemfile.lock index d0c7ec7fa..6a59e09c8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -93,6 +93,9 @@ GEM rake (0.8.7) shoulda (2.11.3) simple_form (1.2.2) + simplecov (0.3.7) + simplecov-html (>= 0.3.7) + simplecov-html (0.3.9) super_exception_notifier (3.0.13) actionmailer rake @@ -119,5 +122,6 @@ DEPENDENCIES rails (= 3.0.0) shoulda simple_form + simplecov super_exception_notifier will_paginate! diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 117d1b007..9d5ec2791 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,6 +5,8 @@ class ApplicationController < ActionController::Base before_filter :initialize_cookies before_filter :set_title layout "default" + + rescue_from User::PrivilegeError, :with => :access_denied protected def access_denied @@ -12,7 +14,7 @@ protected respond_to do |fmt| fmt.html do - if request.get? && Rails.env.test? + if request.get? redirect_to new_session_path(:url => previous_url), :notice => "Access denied" else redirect_to new_session_path, :notice => "Access denied" diff --git a/app/controllers/dmails_controller.rb b/app/controllers/dmails_controller.rb index 85123a8ec..848b5f661 100644 --- a/app/controllers/dmails_controller.rb +++ b/app/controllers/dmails_controller.rb @@ -1,10 +1,16 @@ class DmailsController < ApplicationController respond_to :html, :xml, :json + before_filter :member_only rescue_from User::PrivilegeError, :with => "static/access_denied" def new - @dmail = Dmail.new(params[:dmail]) - respond_width(@dmail) + if params[:respond_to_id] + @dmail = Dmail.find(params[:respond_to_id]).build_response(:forward => params[:forward]) + else + @dmail = Dmail.new(params[:dmail]) + end + + respond_with(@dmail) end def index diff --git a/app/controllers/favorites_controller.rb b/app/controllers/favorites_controller.rb index c878fe5c6..d315237f1 100644 --- a/app/controllers/favorites_controller.rb +++ b/app/controllers/favorites_controller.rb @@ -3,21 +3,23 @@ class FavoritesController < ApplicationController if params[:tags] redirect_to(posts_path(:tags => "fav:#{CurrentUser.name} #{params[:tags]}")) else - @posts = PostSets::Favorite.new(CurrentUser.user) + @post_set = PostSets::Favorite.new(CurrentUser.user) end end def create @favorite = Favorite.create( :user_id => CurrentUser.id, - :post_id => params[:favorite][:post_id] + :post_id => params[:id] ) + render :nothing => true end def destroy Favorite.destroy( :user_id => CurrentUser.id, - :post_id => params[:favorite][:post_id] + :post_id => params[:id] ) + render :nothing => true end end diff --git a/app/logical/favorite.rb b/app/logical/favorite.rb index 3249feeb2..412fad61e 100644 --- a/app/logical/favorite.rb +++ b/app/logical/favorite.rb @@ -13,6 +13,10 @@ class Favorite # ignore end + def self.count(user_id) + select_value_sql("SELECT COUNT(*) FROM #{table_name_for(user_id)}").to_i + end + def self.destroy(conditions) if conditions[:user_id] && conditions[:post_id] destroy_for_post_and_user(conditions[:post_id], conditions[:user_id]) diff --git a/app/logical/post_sets/base.rb b/app/logical/post_sets/base.rb index 626edcd61..0b56fb5d4 100644 --- a/app/logical/post_sets/base.rb +++ b/app/logical/post_sets/base.rb @@ -1,6 +1,6 @@ module PostSets class Base - attr_accessor :page, :before_id, :count + attr_accessor :page, :before_id, :count, :posts def initialize(options = {}) @page = options[:page].to_i diff --git a/app/logical/post_sets/favorite.rb b/app/logical/post_sets/favorite.rb index 29df710a7..5fc894b7c 100644 --- a/app/logical/post_sets/favorite.rb +++ b/app/logical/post_sets/favorite.rb @@ -1,10 +1,10 @@ module PostSets - class FavoriteSet < Base + class Favorite < Base attr_accessor :user - def initialize(options = {}) - super(options) + def initialize(user) @user = user + super() end def tags @@ -12,7 +12,11 @@ module PostSets end def load_posts - user.favorite_posts(:before_id => before_id) + @posts = user.favorite_posts(:before_id => before_id) + end + + def limit + Danbooru.config.posts_per_page end end end diff --git a/app/models/dmail.rb b/app/models/dmail.rb index 7fc34776a..97758344f 100644 --- a/app/models/dmail.rb +++ b/app/models/dmail.rb @@ -9,7 +9,7 @@ class Dmail < ActiveRecord::Base belongs_to :from, :class_name => "User" after_create :update_recipient after_create :send_dmail - attr_accessible :title, :body, :is_deleted, :to_id + attr_accessible :title, :body, :is_deleted, :to_id, :to scope :for, lambda {|user| where(["owner_id = ?", user])} scope :inbox, where("to_id = owner_id") scope :sent, where("from_id = owner_id") @@ -42,6 +42,8 @@ class Dmail < ActiveRecord::Base module ClassMethods def create_split(params) + copy = nil + Dmail.transaction do copy = Dmail.new(params) copy.owner_id = copy.to_id @@ -51,6 +53,8 @@ class Dmail < ActiveRecord::Base copy.owner_id = CurrentUser.id copy.save! end + + copy end def new_blank @@ -60,14 +64,13 @@ class Dmail < ActiveRecord::Base end end - def build_response + def build_response(options = {}) Dmail.new do |dmail| dmail.title = "Re: #{title}" dmail.owner_id = from_id dmail.body = quoted_body - dmail.to_id = from_id + dmail.to_id = from_id unless options[:forward] dmail.from_id = to_id - dmail.parent_id = id end end end diff --git a/app/models/user.rb b/app/models/user.rb index ff27fc971..7b38b1ecf 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -61,7 +61,7 @@ class User < ActiveRecord::Base end def id_to_pretty_name(user_id) - id_to_name.tr("_", " ") + id_to_name(user_id).tr("_", " ") end end diff --git a/app/views/dmails/edit.html.erb b/app/views/dmails/edit.html.erb index 54b737b50..304070bba 100644 --- a/app/views/dmails/edit.html.erb +++ b/app/views/dmails/edit.html.erb @@ -1,2 +1,2 @@

Edit Message

-<%= render "form", :locals => {:dmail => @dmail} %> +<%= render :partial => "form", :locals => {:dmail => @dmail} %> diff --git a/app/views/dmails/index.html.erb b/app/views/dmails/index.html.erb index b735480b9..dad7d9fd3 100644 --- a/app/views/dmails/index.html.erb +++ b/app/views/dmails/index.html.erb @@ -6,9 +6,9 @@ <% @dmails.each do |dmail| %> <% if params[:folder] == "sent" %> - <%= render "sent", :locals => {:dmail => dmail} %> + <%= render :partial => "sent", :locals => {:dmail => dmail} %> <% else %> - <%= render "received", :locals => {:dmail => dmail} %> + <%= render :partial => "received", :locals => {:dmail => dmail} %> <% end %> <% end %> diff --git a/app/views/dmails/new.html.erb b/app/views/dmails/new.html.erb index 9f6cc8a96..afb9d2004 100644 --- a/app/views/dmails/new.html.erb +++ b/app/views/dmails/new.html.erb @@ -1,2 +1,2 @@

New Message

-<%= render "form", :locals => {:dmail => @dmail} %> +<%= render :partial => "form", :locals => {:dmail => @dmail} %> diff --git a/app/views/dmails/show.html.erb b/app/views/dmails/show.html.erb new file mode 100644 index 000000000..d4b5f2e80 --- /dev/null +++ b/app/views/dmails/show.html.erb @@ -0,0 +1,12 @@ +
+
+
+

<%= @dmail.title %>

+ <%= format_text(@dmail.body) %> +

+ <%= link_to "Respond", new_dmail_path(:respond_to_id => @dmail) %> + | <%= link_to "Forward", new_dmail_path(:respond_to_id => @dmail, :forward => true) %> +

+
+
+
diff --git a/db/migrate/20100219230537_create_dmails.rb b/db/migrate/20100219230537_create_dmails.rb index f0fc4c8da..d41c06c3f 100644 --- a/db/migrate/20100219230537_create_dmails.rb +++ b/db/migrate/20100219230537_create_dmails.rb @@ -4,7 +4,6 @@ class CreateDmails < ActiveRecord::Migration t.column :owner_id, :integer, :null => false t.column :from_id, :integer, :null => false t.column :to_id, :integer, :null => false - t.column :parent_id, :integer t.column :title, :string, :null => false t.column :body, :text, :null => false t.column :message_index, "tsvector", :null => false @@ -14,7 +13,6 @@ class CreateDmails < ActiveRecord::Migration end add_index :dmails, :owner_id - add_index :dmails, :parent_id execute "CREATE INDEX index_dmails_on_message_index ON dmails USING GIN (message_index)" execute "CREATE TRIGGER trigger_dmails_on_update BEFORE INSERT OR UPDATE ON dmails FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('message_index', 'pg_catalog.english', 'title', 'body')" diff --git a/test/factories/dmail.rb b/test/factories/dmail.rb index f49f4444c..71f480029 100644 --- a/test/factories/dmail.rb +++ b/test/factories/dmail.rb @@ -1,8 +1,6 @@ Factory.define(:dmail) do |f| - f.owner {|x| x.association(:user)} - f.from_id {|x| x.owner_id} f.to {|x| x.association(:user)} - f.title {Faker::Lorem.words} - f.body {Faker::Lorem.sentences} + f.title {Faker::Lorem.words.join(" ")} + f.body {Faker::Lorem.sentences.join(" ")} f.is_read false end diff --git a/test/functional/advertisements_controller_test.rb b/test/functional/advertisements_controller_test.rb index 7abdf9ae5..af22a0864 100644 --- a/test/functional/advertisements_controller_test.rb +++ b/test/functional/advertisements_controller_test.rb @@ -7,22 +7,22 @@ class AdvertisementsControllerTest < ActionController::TestCase @advertiser = Factory.create(:admin_user) end - should "render the new page" do + should "get the new page" do get :new, {}, {:user_id => @advertiser.id} assert_response :success end - should "render the edit page" do + should "get the edit page" do get :edit, {:id => @ad.id}, {:user_id => @advertiser.id} assert_response :success end - should "render the index page" do + should "get the index page" do get :index, {}, {:user_id => @advertiser.id} assert_response :success end - should "render the show page" do + should "get the show page" do get :show, {:id => @ad.id}, {:user_id => @advertiser.id} assert_response :success end diff --git a/test/functional/artist_versions_controller_test.rb b/test/functional/artist_versions_controller_test.rb index b22b229d5..20b50ba61 100644 --- a/test/functional/artist_versions_controller_test.rb +++ b/test/functional/artist_versions_controller_test.rb @@ -13,12 +13,12 @@ class ArtistVersionsControllerTest < ActionController::TestCase CurrentUser.ip_addr = nil end - should "render the index page" do + should "get the index page" do get :index assert_response :success end - should "render the index page when searching for something" do + should "get the index page when searching for something" do get :index, {:search => {:name_equals => @artist.name}} assert_response :success end diff --git a/test/functional/artists_controller_test.rb b/test/functional/artists_controller_test.rb index d181ee7a2..73d11fd5d 100644 --- a/test/functional/artists_controller_test.rb +++ b/test/functional/artists_controller_test.rb @@ -14,22 +14,22 @@ class ArtistsControllerTest < ActionController::TestCase CurrentUser.ip_addr = nil end - should "render the new page" do + should "get the new page" do get :new, {}, {:user_id => @user.id} assert_response :success end - should "render the edit page" do + should "get the edit page" do get :edit, {:id => @artist.id}, {:user_id => @user.id} assert_response :success end - should "render the show page" do + should "get the show page" do get :show, {:id => @artist.id} assert_response :success end - should "render the index page" do + should "get the index page" do get :index assert_response :success end diff --git a/test/functional/bans_controller_test.rb b/test/functional/bans_controller_test.rb index a9dd3a875..1ac314e0d 100644 --- a/test/functional/bans_controller_test.rb +++ b/test/functional/bans_controller_test.rb @@ -14,22 +14,22 @@ class BansControllerTest < ActionController::TestCase CurrentUser.ip_addr = nil end - should "render the new page" do + should "get the new page" do get :new, {}, {:user_id => @user.id} assert_response :success end - should "render the edit page" do + should "get the edit page" do get :edit, {:id => @ban.id}, {:user_id => @user.id} assert_response :success end - should "render the show page" do + should "get the show page" do get :show, {:id => @ban.id} assert_response :success end - should "render the index page" do + should "get the index page" do get :index assert_response :success end diff --git a/test/functional/comments_controller_test.rb b/test/functional/comments_controller_test.rb index 7246864ad..dded781f5 100644 --- a/test/functional/comments_controller_test.rb +++ b/test/functional/comments_controller_test.rb @@ -14,7 +14,7 @@ class CommentsControllerTest < ActionController::TestCase CurrentUser.ip_addr = nil end - should "render the index page" do + should "get the index page" do get :index assert_response :success end diff --git a/test/functional/dmails_controller_test.rb b/test/functional/dmails_controller_test.rb index 426027563..1121241db 100644 --- a/test/functional/dmails_controller_test.rb +++ b/test/functional/dmails_controller_test.rb @@ -1,8 +1,99 @@ require 'test_helper' class DmailsControllerTest < ActionController::TestCase - # Replace this with your real tests. - test "the truth" do - assert true + context "The dmails controller" do + setup do + @user = Factory.create(:user) + @unrelated_user = Factory.create(:user) + CurrentUser.user = @user + CurrentUser.ip_addr = "127.0.0.1" + @dmail = Factory.create(:dmail, :owner => @user) + end + + teardown do + CurrentUser.user = nil + CurrentUser.ip_addr = nil + end + + context "new action" do + should "get the page" do + get :new, {}, {:user_id => @user.id} + assert_response :success + end + + context "with a respond_to_id" do + should "prefill the fields" do + get :new, {:respond_to_id => @dmail}, {:user_id => @user.id} + assert_response :success + assert_not_nil assigns(:dmail) + assert_equal(@dmail.from_id, assigns(:dmail).to_id) + end + + context "and a forward flag" do + should "not populate the to field" do + get :new, {:respond_to_id => @dmail, :forward => true}, {:user_id => @user.id} + assert_response :success + assert_not_nil assigns(:dmail) + assert_nil(assigns(:dmail).to_id) + end + end + end + end + + context "index action" do + should "show dmails owned by the current user" do + get :index, {:owner_id_equals => @dmail.owner_id, :folder => "sent"}, {:user_id => @dmail.owner_id} + assert_response :success + + get :index, {:owner_id_equals => @dmail.owner_id, :folder => "received"}, {:user_id => @dmail.owner_id} + assert_response :success + end + + should "not show dmails not owned by the current user" do + assert_raises(User::PrivilegeError) do + get :index, {:owner_id_equals => @dmail.owner_id}, {:user_id => @unrelated_user.id} + end + end + end + + context "show action" do + should "show dmails owned by the current user" do + get :show, {:id => @dmail.id}, {:user_id => @dmail.owner_id} + assert_response :success + end + + should "not show dmails not owned by the current user" do + assert_raises(User::PrivilegeError) do + get :show, {:id => @dmail.id}, {:user_id => @unrelated_user.id} + end + end + end + + context "create action" do + should "create two messages, one for the sender and one for the recipient" do + assert_difference("Dmail.count", 2) do + dmail_attribs = Factory.attributes_for(:dmail).merge(:to_id => Factory.create(:user).id) + post :create, {:dmail => dmail_attribs}, {:user_id => @user.id} + assert_redirected_to dmail_path(Dmail.last) + end + end + end + + context "destroy action" do + should "allow deletion if the dmail is owned by the current user" do + assert_difference("Dmail.count", -1) do + post :destroy, {:id => @dmail.id}, {:user_id => @dmail.owner_id} + assert_redirected_to dmails_path + end + end + + should "not allow deletion if the dmail is not owned by the current user" do + assert_difference("Dmail.count", 0) do + assert_raises(User::PrivilegeError) do + post :destroy, {:id => @dmail.id}, {:user_id => @unrelated_user.id} + end + end + end + end end end diff --git a/test/functional/favorites_controller_test.rb b/test/functional/favorites_controller_test.rb index 8c04ef9d6..48a565a74 100644 --- a/test/functional/favorites_controller_test.rb +++ b/test/functional/favorites_controller_test.rb @@ -1,8 +1,59 @@ require 'test_helper' class FavoritesControllerTest < ActionController::TestCase - # Replace this with your real tests. - test "the truth" do - assert true + context "The favorites controller" do + setup do + @user = Factory.create(:user) + CurrentUser.user = @user + CurrentUser.ip_addr = "127.0.0.1" + end + + teardown do + CurrentUser.user = nil + CurrentUser.ip_addr = nil + end + + context "index action" do + context "with a specified tags parameter" do + should "redirect to the posts controller" do + get :index, {:tags => "abc"}, {:user_id => @user} + assert_redirected_to(posts_path(:tags => "fav:#{@user.name} abc")) + end + end + + should "display the current user's favorites" do + get :index, {}, {:user_id => @user.id} + assert_response :success + assert_not_nil(assigns(:post_set)) + end + end + + context "create action" do + setup do + @post = Factory.create(:post) + end + + should "create a favorite for the current user" do + assert_difference("Favorite.count(#{@user.id})", 1) do + post :create, {:id => @post.id}, {:user_id => @user.id} + end + end + end + + context "destroy action" do + setup do + @post = Factory.create(:post) + Favorite.create( + :user_id => @user.id, + :post_id => @post.id + ) + end + + should "remove the favorite from the current user" do + assert_difference("Favorite.count(#{@user.id})", -1) do + post :destroy, {:id => @post.id}, {:user_id => @user.id} + end + end + end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 3a954b082..83f618b2f 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,5 +1,8 @@ ENV["RAILS_ENV"] = "test" +require 'simplecov' +SimpleCov.start 'rails' + require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' diff --git a/test/unit/dmail_test.rb b/test/unit/dmail_test.rb index 7fc5af314..a46656572 100644 --- a/test/unit/dmail_test.rb +++ b/test/unit/dmail_test.rb @@ -45,7 +45,6 @@ class DmailTest < ActiveSupport::TestCase dmail = Factory.create(:dmail) response = dmail.build_response assert_equal("Re: #{dmail.title}", response.title) - assert_equal(dmail.id, response.parent_id) assert_equal(dmail.from_id, response.to_id) assert_equal(dmail.to_id, response.from_id) end