* Added note version controller and test

* Added pool version controller and test
* Refactored unit tests for post disapprovals
* Renamed PostModerationDetail to PostDisapproval
This commit is contained in:
albert
2011-01-25 18:13:05 -05:00
parent 0cfaed90f8
commit 683d4583ac
22 changed files with 428 additions and 199 deletions

View File

@@ -0,0 +1,10 @@
class NoteVersionsController < ApplicationController
respond_to :html, :xml, :json
before_filter :member_only, :except => [:index, :show]
def index
@search = NoteVersion.search(params[:search])
@note_versions = @search.paginate(:page => params[:page])
respond_with(@note_versions)
end
end

View File

@@ -1,4 +1,6 @@
class PoolVersionsController < ApplicationController class PoolVersionsController < ApplicationController
def index def index
@search = PoolVersion.search(params[:search])
@pool_versions = @search.paginate(:page => params[:page])
end end
end end

View File

@@ -1,13 +1,22 @@
class PostModerationController < ApplicationController class PostModerationController < ApplicationController
def show respond_to :html, :xml, :json
end before_filter :janitor_only
def create def moderate
@search = Post.pending.available_for_moderation.search(params[:search]).order("id asc")
@posts = @search.paginate(:page => params[:page])
respond_with(@posts)
end end
def update def approve
@post = Post.find(params[:post_id])
@post.approve!
respond_with(@post, :location => post_moderation_moderate_path)
end end
def destroy def disapprove
end @post = Post.find(params[:post_id])
@post_disapproval = PostDisapproval.create(:post => @post, :user => CurrentUser.user)
respond_with(@post_disapproval, :location => post_moderation_moderate_path)
end
end end

View File

@@ -1,4 +1,11 @@
class NoteVersion < ActiveRecord::Base class NoteVersion < ActiveRecord::Base
before_validation :initialize_updater
def initialize_updater
self.updater_id = CurrentUser.id
self.updater_ip_addr = CurrentUser.ip_addr
end
def updater_name def updater_name
User.id_to_name(updater_id) User.id_to_name(updater_id)
end end

View File

@@ -26,8 +26,11 @@ class Post < ActiveRecord::Base
validates_presence_of :parent, :if => lambda {|rec| !rec.parent_id.nil?} validates_presence_of :parent, :if => lambda {|rec| !rec.parent_id.nil?}
validate :validate_parent_does_not_have_a_parent validate :validate_parent_does_not_have_a_parent
attr_accessible :source, :rating, :tag_string, :old_tag_string, :last_noted_at attr_accessible :source, :rating, :tag_string, :old_tag_string, :last_noted_at
scope :pending, where(["is_pending = ?", true])
scope :visible, lambda {|user| Danbooru.config.can_user_see_post_conditions(user)} scope :visible, lambda {|user| Danbooru.config.can_user_see_post_conditions(user)}
scope :commented_before, lambda {|date| where("last_commented_at < ?", date).order("last_commented_at DESC")} scope :commented_before, lambda {|date| where("last_commented_at < ?", date).order("last_commented_at DESC")}
scope :available_for_moderation, lambda {where(["id NOT IN (SELECT pd.post_id FROM post_disapprovals pd WHERE pd.user_id = ?)", CurrentUser.id])}
scope :hidden_from_moderation, lambda {where(["id IN (SELECT pd.post_id FROM post_disapprovals pd WHERE pd.user_id = ?)", CurrentUser.id])}
module FileMethods module FileMethods
def delete_files def delete_files

View File

@@ -0,0 +1,11 @@
class PostDisapproval < ActiveRecord::Base
belongs_to :post
belongs_to :user
validates_uniqueness_of :post_id, :scope => [:user_id]
def self.prune!
joins(:post).where("posts.is_pending = FALSE AND posts.is_flagged = FALSE").select("post_disapprovals.*").each do |post_disapproval|
post_disapproval.destroy
end
end
end

View File

@@ -1,19 +0,0 @@
class PostModerationDetail < ActiveRecord::Base
belongs_to :post
belongs_to :user
def self.filter(posts, user, select_hidden = false)
hidden = where(:user_id => user.id).select("post_id").map(&:post_id)
if select_hidden
posts.select {|x| hidden.include?(x.id)}
else
posts.reject {|x| hidden.include?(x.id)}
end
end
def self.prune!
joins(:post).where("posts.is_pending = FALSE AND posts.is_flagged = FALSE").each do |hidden_post|
hidden_post.destroy
end
end
end

View File

View File

View File

@@ -47,8 +47,8 @@ Danbooru::Application.routes.draw do
put :revert put :revert
end end
end end
resources :post_histories, :only => [:index] resources :post_histories, :only => [:index]
resource :post_moderation, :controller => "post_moderation"
resource :session resource :session
resources :tags resources :tags
resources :tag_aliases do resources :tag_aliases do
@@ -69,6 +69,9 @@ Danbooru::Application.routes.draw do
end end
resources :wiki_page_versions, :only => [:index] resources :wiki_page_versions, :only => [:index]
match '/post_moderation/moderate' => 'post_moderation#moderate'
match '/post_moderation/disapprove' => 'post_moderation#disapprove', :via => :put
match '/post_moderation/approve' => 'post_moderation#approve', :via => :put
match '/dtext/preview' => 'dtext#preview', :via => :post match '/dtext/preview' => 'dtext#preview', :via => :post
match "/site_map" => "static#site_map", :as => "site_map" match "/site_map" => "static#site_map", :as => "site_map"
match "/terms_of_service" => "static#terms_of_service", :as => "terms_of_service" match "/terms_of_service" => "static#terms_of_service", :as => "terms_of_service"

View File

@@ -840,8 +840,8 @@ ALTER SEQUENCE ip_bans_id_seq OWNED BY ip_bans.id;
CREATE TABLE janitor_trials ( CREATE TABLE janitor_trials (
id integer NOT NULL, id integer NOT NULL,
creator_id integer NOT NULL,
user_id integer NOT NULL, user_id integer NOT NULL,
promoted_at timestamp without time zone,
created_at timestamp without time zone, created_at timestamp without time zone,
updated_at timestamp without time zone updated_at timestamp without time zone
); );
@@ -987,7 +987,6 @@ CREATE TABLE pools (
name character varying(255), name character varying(255),
creator_id integer NOT NULL, creator_id integer NOT NULL,
description text, description text,
is_public boolean DEFAULT true NOT NULL,
is_active boolean DEFAULT true NOT NULL, is_active boolean DEFAULT true NOT NULL,
post_ids text DEFAULT ''::text NOT NULL, post_ids text DEFAULT ''::text NOT NULL,
created_at timestamp without time zone, created_at timestamp without time zone,
@@ -1014,6 +1013,38 @@ CREATE SEQUENCE pools_id_seq
ALTER SEQUENCE pools_id_seq OWNED BY pools.id; ALTER SEQUENCE pools_id_seq OWNED BY pools.id;
--
-- Name: post_disapprovals; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
CREATE TABLE post_disapprovals (
id integer NOT NULL,
user_id integer NOT NULL,
post_id integer NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone
);
--
-- Name: post_disapprovals_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE post_disapprovals_id_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
--
-- Name: post_disapprovals_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE post_disapprovals_id_seq OWNED BY post_disapprovals.id;
-- --
-- Name: post_histories; Type: TABLE; Schema: public; Owner: -; Tablespace: -- Name: post_histories; Type: TABLE; Schema: public; Owner: -; Tablespace:
-- --
@@ -1046,38 +1077,6 @@ CREATE SEQUENCE post_histories_id_seq
ALTER SEQUENCE post_histories_id_seq OWNED BY post_histories.id; ALTER SEQUENCE post_histories_id_seq OWNED BY post_histories.id;
--
-- Name: post_moderation_details; Type: TABLE; Schema: public; Owner: -; Tablespace:
--
CREATE TABLE post_moderation_details (
id integer NOT NULL,
user_id integer NOT NULL,
post_id integer NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone
);
--
-- Name: post_moderation_details_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE post_moderation_details_id_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
--
-- Name: post_moderation_details_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE post_moderation_details_id_seq OWNED BY post_moderation_details.id;
-- --
-- Name: post_votes; Type: TABLE; Schema: public; Owner: -; Tablespace: -- Name: post_votes; Type: TABLE; Schema: public; Owner: -; Tablespace:
-- --
@@ -1132,7 +1131,6 @@ CREATE TABLE posts (
approver_string character varying(255) DEFAULT ''::character varying NOT NULL, approver_string character varying(255) DEFAULT ''::character varying NOT NULL,
fav_string text DEFAULT ''::text NOT NULL, fav_string text DEFAULT ''::text NOT NULL,
pool_string text DEFAULT ''::text NOT NULL, pool_string text DEFAULT ''::text NOT NULL,
view_count integer DEFAULT 0 NOT NULL,
last_noted_at timestamp without time zone, last_noted_at timestamp without time zone,
last_commented_at timestamp without time zone, last_commented_at timestamp without time zone,
tag_string text DEFAULT ''::text NOT NULL, tag_string text DEFAULT ''::text NOT NULL,
@@ -1809,14 +1807,14 @@ ALTER TABLE pools ALTER COLUMN id SET DEFAULT nextval('pools_id_seq'::regclass);
-- Name: id; Type: DEFAULT; Schema: public; Owner: - -- Name: id; Type: DEFAULT; Schema: public; Owner: -
-- --
ALTER TABLE post_histories ALTER COLUMN id SET DEFAULT nextval('post_histories_id_seq'::regclass); ALTER TABLE post_disapprovals ALTER COLUMN id SET DEFAULT nextval('post_disapprovals_id_seq'::regclass);
-- --
-- Name: id; Type: DEFAULT; Schema: public; Owner: - -- Name: id; Type: DEFAULT; Schema: public; Owner: -
-- --
ALTER TABLE post_moderation_details ALTER COLUMN id SET DEFAULT nextval('post_moderation_details_id_seq'::regclass); ALTER TABLE post_histories ALTER COLUMN id SET DEFAULT nextval('post_histories_id_seq'::regclass);
-- --
@@ -2134,6 +2132,14 @@ ALTER TABLE ONLY pools
ADD CONSTRAINT pools_pkey PRIMARY KEY (id); ADD CONSTRAINT pools_pkey PRIMARY KEY (id);
--
-- Name: post_disapprovals_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
ALTER TABLE ONLY post_disapprovals
ADD CONSTRAINT post_disapprovals_pkey PRIMARY KEY (id);
-- --
-- Name: post_histories_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- Name: post_histories_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
-- --
@@ -2142,14 +2148,6 @@ ALTER TABLE ONLY post_histories
ADD CONSTRAINT post_histories_pkey PRIMARY KEY (id); ADD CONSTRAINT post_histories_pkey PRIMARY KEY (id);
--
-- Name: post_moderation_details_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
--
ALTER TABLE ONLY post_moderation_details
ADD CONSTRAINT post_moderation_details_pkey PRIMARY KEY (id);
-- --
-- Name: post_votes_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- Name: post_votes_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
-- --
@@ -2660,6 +2658,13 @@ CREATE INDEX index_note_versions_on_note_id ON note_versions USING btree (note_i
CREATE INDEX index_note_versions_on_updater_id ON note_versions USING btree (updater_id); CREATE INDEX index_note_versions_on_updater_id ON note_versions USING btree (updater_id);
--
-- Name: index_note_versions_on_updater_ip_addr; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_note_versions_on_updater_ip_addr ON note_versions USING btree (updater_ip_addr);
-- --
-- Name: index_notes_on_creator_id; Type: INDEX; Schema: public; Owner: -; Tablespace: -- Name: index_notes_on_creator_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
-- --
@@ -2702,6 +2707,20 @@ CREATE INDEX index_pools_on_creator_id ON pools USING btree (creator_id);
CREATE INDEX index_pools_on_name ON pools USING btree (name); CREATE INDEX index_pools_on_name ON pools USING btree (name);
--
-- Name: index_post_disapprovals_on_post_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_post_disapprovals_on_post_id ON post_disapprovals USING btree (post_id);
--
-- Name: index_post_disapprovals_on_user_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_post_disapprovals_on_user_id ON post_disapprovals USING btree (user_id);
-- --
-- Name: index_post_histories_on_post_id; Type: INDEX; Schema: public; Owner: -; Tablespace: -- Name: index_post_histories_on_post_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
-- --
@@ -2709,20 +2728,6 @@ CREATE INDEX index_pools_on_name ON pools USING btree (name);
CREATE INDEX index_post_histories_on_post_id ON post_histories USING btree (post_id); CREATE INDEX index_post_histories_on_post_id ON post_histories USING btree (post_id);
--
-- Name: index_post_moderation_details_on_post_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_post_moderation_details_on_post_id ON post_moderation_details USING btree (post_id);
--
-- Name: index_post_moderation_details_on_user_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_post_moderation_details_on_user_id ON post_moderation_details USING btree (user_id);
-- --
-- Name: index_posts_on_created_at; Type: INDEX; Schema: public; Owner: -; Tablespace: -- Name: index_posts_on_created_at; Type: INDEX; Schema: public; Owner: -; Tablespace:
-- --
@@ -2800,13 +2805,6 @@ CREATE INDEX index_posts_on_source ON posts USING btree (source);
CREATE INDEX index_posts_on_tags_index ON posts USING gin (tag_index); CREATE INDEX index_posts_on_tags_index ON posts USING gin (tag_index);
--
-- Name: index_posts_on_view_count; Type: INDEX; Schema: public; Owner: -; Tablespace:
--
CREATE INDEX index_posts_on_view_count ON posts USING btree (view_count);
-- --
-- Name: index_removed_posts_on_created_at; Type: INDEX; Schema: public; Owner: -; Tablespace: -- Name: index_removed_posts_on_created_at; Type: INDEX; Schema: public; Owner: -; Tablespace:
-- --

View File

@@ -28,7 +28,6 @@ class CreatePosts < ActiveRecord::Migration
t.column :pool_string, :text, :null => false, :default => "" t.column :pool_string, :text, :null => false, :default => ""
# Cached # Cached
t.column :view_count, :integer, :null => false, :default => 0
t.column :last_noted_at, :datetime t.column :last_noted_at, :datetime
t.column :last_commented_at, :datetime t.column :last_commented_at, :datetime
@@ -60,7 +59,6 @@ class CreatePosts < ActiveRecord::Migration
add_index :posts, :image_width add_index :posts, :image_width
add_index :posts, :image_height add_index :posts, :image_height
add_index :posts, :source add_index :posts, :source
add_index :posts, :view_count
add_index :posts, :parent_id add_index :posts, :parent_id
execute "CREATE INDEX index_posts_on_mpixels ON posts (((image_width * image_height)::numeric / 1000000.0))" execute "CREATE INDEX index_posts_on_mpixels ON posts (((image_width * image_height)::numeric / 1000000.0))"

View File

@@ -0,0 +1,16 @@
class CreatePostDisapprovals < ActiveRecord::Migration
def self.up
create_table :post_disapprovals do |t|
t.column :user_id, :integer, :null => false
t.column :post_id, :integer, :null => false
t.timestamps
end
add_index :post_disapprovals, :user_id
add_index :post_disapprovals, :post_id
end
def self.down
drop_table :post_disapprovals
end
end

View File

@@ -1,16 +0,0 @@
class CreatePostModerationDetails < ActiveRecord::Migration
def self.up
create_table :post_moderation_details do |t|
t.column :user_id, :integer, :null => false
t.column :post_id, :integer, :null => false
t.timestamps
end
add_index :post_moderation_details, :user_id
add_index :post_moderation_details, :post_id
end
def self.down
drop_table :post_moderation_details
end
end

View File

@@ -0,0 +1,42 @@
require 'test_helper'
class NoteVersionsControllerTest < ActionController::TestCase
context "The note versions 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
setup do
@note = Factory.create(:note)
CurrentUser.id = 20
@note.body = "1 2"
@note.create_version
CurrentUser.id = 30
@note.body = "1 2 3"
@note.create_version
end
should "list all versions" do
get :index
assert_response :success
assert_not_nil(assigns(:note_versions))
assert_equal(3, assigns(:note_versions).size)
end
should "list all versions that match the search criteria" do
get :index, {:search => {:updater_id_equals => "20"}}
assert_response :success
assert_not_nil(assigns(:note_versions))
assert_equal(1, assigns(:note_versions).size)
end
end
end
end

View File

@@ -1,8 +1,40 @@
require 'test_helper' require 'test_helper'
class PoolVersionsControllerTest < ActionController::TestCase class PoolVersionsControllerTest < ActionController::TestCase
# Replace this with your real tests. context "The pool versions controller" do
test "the truth" do setup do
assert true @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
setup do
@pool = Factory.create(:pool)
CurrentUser.id = 20
@pool.versions.create(:post_ids => "1 2")
CurrentUser.id = 30
@pool.versions.create(:post_ids => "1 2 3 4")
end
should "list all versions" do
get :index
assert_response :success
assert_not_nil(assigns(:pool_versions))
assert_equal(3, assigns(:pool_versions).size)
end
should "list all versions that match the search criteria" do
get :index, {:search => {:updater_id_equals => "20"}}
assert_response :success
assert_not_nil(assigns(:pool_versions))
assert_equal(1, assigns(:pool_versions).size)
end
end
end end
end end

View File

@@ -1,37 +1,51 @@
require "test_helper" require "test_helper"
class PostModerationControllerTest < ActionController::TestCase class PostModerationControllerTest < ActionController::TestCase
context "A post moderation controller" do context "The post moderation controller" do
should "" do setup do
ModQueuePost.destroy_all @mod = Factory.create(:moderator_user)
CurrentUser.user = @mod
CurrentUser.ip_addr = "127.0.0.1"
end
teardown do
CurrentUser.user = nil
CurrentUser.ip_addr = nil
end
context "moderate action" do
setup do
@post = Factory.create(:post, :is_pending => true)
end
should "list all pending posts" do
get :moderate, {}, {:user_id => @mod.id}
assert_response :success
end
end
context "approve action" do
setup do
@post = Factory.create(:post, :is_pending => true)
end
should "approve a post" do
post :approve, {:post_id => @post.id}, {:user_id => @mod.id}
@post.reload
assert(!@post.is_pending?)
end
end
context "disapprove action" do
setup do
@post = Factory.create(:post, :is_pending => true)
end
p1 = create_post("hoge", :status => "pending") should "disapprove a post" do
p2 = create_post("hoge", :status => "active") assert_difference("PostDisapproval.count", 1) do
p3 = create_post("moge", :status => "active") post :disapprove, {:post_id => @post.id}, {:user_id => @mod.id}
end
p2.flag!("sage", User.find(1)) end
p2.reload
assert_not_nil(p2.flag_detail)
get :moderate, {}, {:user_id => 1}
assert_response :success
get :moderate, {:query => "moge"}, {:user_id => 1}
assert_response :success
post :moderate, {:id => p1.id, :commit => "Approve"}, {:user_id => 1}
p1.reload
assert_equal("active", p1.status)
post :moderate, {:id => p3.id, :reason => "sage", :commit => "Delete"}, {:user_id => 1}
p3.reload
assert_equal("deleted", p3.status)
assert_not_nil(p3.flag_detail)
assert_equal("sage", p3.flag_detail.reason)
assert_equal(0, ModQueuePost.count)
post :moderate, {:id => "3", :commit => "Hide"}, {:user_id => 1}
assert_equal(1, ModQueuePost.count)
end end
end end
end end

View File

@@ -0,0 +1,105 @@
require "test_helper"
class PostsControllerTest < ActionController::TestCase
context "The posts controller" do
setup do
@users = {}
@users[:anon] = AnonymousUser.new
@users[:member] = Factory.create(:user)
CurrentUser.user = @users[:member]
CurrentUser.ip_addr = "127.0.0.1"
@users[:banned] = Factory.create(:banned_user)
@users[:priv] = Factory.create(:privileged_user)
@users[:contrib] = Factory.create(:contributor_user)
@users[:janitor] = Factory.create(:janitor_user)
@users[:mod] = Factory.create(:moderator_user)
@users[:admin] = Factory.create(:admin_user)
end
teardown do
@users = nil
CurrentUser.user = nil
CurrentUser.ip_addr = nil
end
context "new action" do
should "render" do
get :new, {}, {:user_id => @users[:member]}
assert_response :success
end
end
context "create action" do
should "create a post" do
post :create, {:post => {:source => "", :file => upload_jpeg("#{Rails.root}/test/files/test.jpg"), :tag_string => "hoge", :rating => "s"}}, {:user_id => @users[:member].id}
p = Post.last
assert_equal("hoge", p.tag_string)
assert_equal("jpg", p.file_ext)
assert_equal("s", p.rating)
assert_equal("uploader:#{@users[:member].name}", p.uploader_string)
assert_equal(true, File.exists?(p.file_path))
assert_equal(true, File.exists?(p.preview_path))
end
end
context "update action" do
setup do
@p1 = Factory.create(:post, :tag_string => "hoge")
end
should "update a post" do
put :update, {:post => {:tags => "moge", :rating => "Explicit"}, :id => @p1.id}, {:user_id => @users[:member].id}
@p1.reload
assert_equal("moge", p1.cached_tags)
assert_equal("e", p1.rating)
assert_equal(2, p1.tag_history.size)
post :update, {:post => {:rating => "Safe"}, :id => p1.id}, {:user_id => 3}
assert_equal(3, p1.tag_history.size)
p1.update_attribute(:is_rating_locked, true)
post :update, {:post => {:rating => "Questionable"}, :id => p1.id}, {:user_id => 3}
p1.reload
assert_equal("s", p1.rating)
end
end
should "update a post" do
end
should "list posts" do
get :index, {}, {:user_id => 3}
assert_response :success
get :index, {:tags => "tag1"}, {:user_id => 3}
assert_response :success
get :index, {:format => "json"}, {:user_id => 3}
assert_response :success
get :index, {:format => "xml"}, {:user_id => 3}
assert_response :success
get :index, {:tags => "-tag1"}, {:user_id => 3}
assert_response :success
end
should "list posts through an atom feed" do
get :atom, {}, {:user_id => 3}
assert_response :success
get :atom, {:tags => "tag1"}, {:user_id => 3}
assert_response :success
end
should "display a post" do
get :show, {:id => 1}, {:user_id => 3}
assert_response :success
end
end
def test_popular
get :popular_by_day, {}, {:user_id => 3}
assert_response :success
end
end

View File

@@ -0,0 +1,67 @@
require_relative '../test_helper'
class PostDisapprovalTest < ActiveSupport::TestCase
context "In all cases" do
setup do
@alice = Factory.create(:moderator_user)
CurrentUser.user = @alice
CurrentUser.ip_addr = "127.0.0.1"
MEMCACHE.flush_all
end
teardown do
CurrentUser.user = nil
CurrentUser.ip_addr = nil
end
context "A post disapproval" do
setup do
@post_1 = Factory.create(:post, :is_pending => true)
@post_2 = Factory.create(:post, :is_pending => true)
end
context "made by alice" do
setup do
@disapproval = PostDisapproval.create(:user => @alice, :post => @post_1)
end
context "when the current user is alice" do
setup do
CurrentUser.user = @alice
end
should "remove the associated post from alice's moderation queue" do
assert(!Post.available_for_moderation.map(&:id).include?(@post_1.id))
assert(Post.available_for_moderation.map(&:id).include?(@post_2.id))
end
end
context "when the current user is brittony" do
setup do
@brittony = Factory.create(:moderator_user)
CurrentUser.user = @brittony
end
should "not remove the associated post from brittony's moderation queue" do
assert(Post.available_for_moderation.map(&:id).include?(@post_1.id))
assert(Post.available_for_moderation.map(&:id).include?(@post_2.id))
end
end
end
context "for a post that has been approved" do
setup do
@post = Factory.create(:post)
@user = Factory.create(:user)
@disapproval = PostDisapproval.create(:user => @user, :post => @post)
end
should "be pruned" do
assert_difference("PostDisapproval.count", -1) do
PostDisapproval.prune!
end
end
end
end
end
end

View File

@@ -1,52 +0,0 @@
require_relative '../test_helper'
class PostModerationDetailTest < ActiveSupport::TestCase
setup do
user = Factory.create(:user)
CurrentUser.user = user
CurrentUser.ip_addr = "127.0.0.1"
MEMCACHE.flush_all
end
teardown do
CurrentUser.user = nil
CurrentUser.ip_addr = nil
end
context "A post moderation detail" do
should "hide posts" do
posts = []
posts << Factory.create(:post)
posts << Factory.create(:post)
posts << Factory.create(:post)
user = Factory.create(:user)
detail = PostModerationDetail.create(:user => user, :post => posts[0])
results = PostModerationDetail.filter(posts, user)
assert_equal(2, results.size)
assert(results.all? {|x| x.id != posts[0].id})
results = PostModerationDetail.filter(posts, user, true)
assert_equal(1, results.size)
assert_equal(posts[0].id, results[0].id)
user = Factory.create(:user)
results = PostModerationDetail.filter(posts, user)
assert_equal(3, results.size)
results = PostModerationDetail.filter(posts, user, true)
assert_equal(0, results.size)
end
should "prune itself" do
post = Factory.create(:post, :is_flagged => true)
user = Factory.create(:user)
detail = PostModerationDetail.create(:user => user, :post => post)
assert_difference("PostModerationDetail.count", 0) do
PostModerationDetail.prune!
end
post.is_flagged = false
post.save
assert(post.errors.empty?)
assert_difference("PostModerationDetail.count", -1) do
PostModerationDetail.prune!
end
end
end
end

View File

@@ -175,12 +175,11 @@ class PostTest < ActiveSupport::TestCase
end end
end end
context "An unapproved post" do context "An unapproved post" do
should "preserve the approver's identity when approved" do should "preserve the approver's identity when approved" do
user = CurrentUser.user
post = Factory.create(:post, :is_pending => true) post = Factory.create(:post, :is_pending => true)
post.approve! post.approve!
assert_equal("approver:#{user.name}", post.approver_string) assert_equal("approver:#{CurrentUser.name}", post.approver_string)
end end
should "preserve the unapproval association even when removed" do should "preserve the unapproval association even when removed" do