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