diff --git a/app/controllers/admin/dashboards_controller.rb b/app/controllers/admin/dashboards_controller.rb index 83076fdd7..c6ec0a31a 100644 --- a/app/controllers/admin/dashboards_controller.rb +++ b/app/controllers/admin/dashboards_controller.rb @@ -1,7 +1,5 @@ module Admin class DashboardsController < ApplicationController - before_filter :admin_only - def show @dashboard = AdminDashboard.new end diff --git a/app/logical/admin_dashboard.rb b/app/logical/admin_dashboard.rb index 8d4635e0d..b15b039ff 100644 --- a/app/logical/admin_dashboard.rb +++ b/app/logical/admin_dashboard.rb @@ -12,6 +12,6 @@ class AdminDashboard end def forum_topics - ForumTopic.where(category_id: 1).order("id desc").limit(20) + ForumTopic.search(category_id: 1).order("id desc").limit(20) end end diff --git a/app/models/favorite_group.rb b/app/models/favorite_group.rb index f914ac9a9..fceec52f1 100644 --- a/app/models/favorite_group.rb +++ b/app/models/favorite_group.rb @@ -120,7 +120,7 @@ class FavoriteGroup < ActiveRecord::Base end def initialize_creator - self.creator_id = CurrentUser.id + self.creator_id ||= CurrentUser.id end def strip_name @@ -214,6 +214,7 @@ class FavoriteGroup < ActiveRecord::Base super @neighbor_posts = nil clear_post_id_array + self end def last_page diff --git a/app/models/note.rb b/app/models/note.rb index 54468aa40..6aaaa57ec 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -94,7 +94,7 @@ class Note < ActiveRecord::Base end def initialize_creator - self.creator_id = CurrentUser.id + self.creator_id ||= CurrentUser.id end def initialize_updater diff --git a/app/models/post.rb b/app/models/post.rb index 390bea960..c6f28b679 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -173,7 +173,7 @@ class Post < ActiveRecord::Base end def is_animated_png? - if file_ext =~ /png/i + if file_ext =~ /png/i && File.exists?(file_path) apng = APNGInspector.new(file_path) apng.inspect! return apng.animated? diff --git a/test/controllers/saved_searches_controller_test.rb b/test/controllers/saved_searches_controller_test.rb deleted file mode 100644 index 58f1f29aa..000000000 --- a/test/controllers/saved_searches_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class SavedSearchesControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/factories/favorite_group.rb b/test/factories/favorite_group.rb index 0d7ffd435..b789bc2a6 100644 --- a/test/factories/favorite_group.rb +++ b/test/factories/favorite_group.rb @@ -1,4 +1,6 @@ FactoryGirl.define do - factory(:favorite_group) do + factory :favorite_group do + name { FFaker::Lorem.word } + creator end end diff --git a/test/factories/note.rb b/test/factories/note.rb index 3490a0255..eb9597de4 100644 --- a/test/factories/note.rb +++ b/test/factories/note.rb @@ -1,6 +1,6 @@ FactoryGirl.define do factory(:note) do - creator :factory => :user + creator post x 1 y 1 @@ -8,7 +8,6 @@ FactoryGirl.define do height 1 is_active true body {FFaker::Lorem.sentences.join(" ")} - updater_id :factory => :user updater_ip_addr "127.0.0.1" end end diff --git a/test/factories/post.rb b/test/factories/post.rb index ec0e8f4a4..2e13bb190 100644 --- a/test/factories/post.rb +++ b/test/factories/post.rb @@ -13,5 +13,6 @@ FactoryGirl.define do image_height 1000 file_size 2000 rating "q" + source { FFaker::Internet.http_url } end end diff --git a/test/factories/saved_search.rb b/test/factories/saved_search.rb index 7940ca213..44d81152e 100644 --- a/test/factories/saved_search.rb +++ b/test/factories/saved_search.rb @@ -1,5 +1,7 @@ FactoryGirl.define do factory(:saved_search) do - tag_query "aaa" + tag_query { FFaker::Lorem.words } + category { FFaker::Lorem.word } + user end end diff --git a/test/factories/user.rb b/test/factories/user.rb index 5b8d5059b..061facb03 100644 --- a/test/factories/user.rb +++ b/test/factories/user.rb @@ -1,5 +1,5 @@ FactoryGirl.define do - factory(:user) do + factory(:user, aliases: [:creator, :updater]) do name {(rand(1_000_000) + 10).to_s} password "password" password_hash {User.sha1("password")} diff --git a/test/functional/admin/dashboards_controller_test.rb b/test/functional/admin/dashboards_controller_test.rb new file mode 100644 index 000000000..d33a30036 --- /dev/null +++ b/test/functional/admin/dashboards_controller_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class Admin::DashboardsControllerTest < ActionController::TestCase + context "The admin dashboard controller" do + context "show action" do + should "render" do + get :show + assert_response :success + end + end + end +end diff --git a/test/functional/artist_commentaries_controller_test.rb b/test/functional/artist_commentaries_controller_test.rb index b37371997..ae76150bc 100644 --- a/test/functional/artist_commentaries_controller_test.rb +++ b/test/functional/artist_commentaries_controller_test.rb @@ -6,16 +6,82 @@ class ArtistCommentariesControllerTest < ActionController::TestCase @user = FactoryGirl.create(:user) CurrentUser.user = @user CurrentUser.ip_addr = "127.0.0.1" + + @commentary1 = FactoryGirl.create(:artist_commentary) + @commentary2 = FactoryGirl.create(:artist_commentary) end teardown do CurrentUser.user = nil end + context "index action" do + should "render" do + get :index + assert_response :success + end + + should "render with search params" do + params = { + search: { + text_matches: @commentary1.original_title, + post_id: @commentary1.post_id, + original_present: "yes", + translated_present: "yes", + post_tags_match: @commentary1.post.tag_array.first, + } + } + + get :index, params + assert_response :success + end + end + + context "show action" do + should "render" do + get :show, { id: @commentary1.id } + assert_redirected_to(@commentary1.post) + + get :show, { post_id: @commentary1.post_id } + assert_redirected_to(@commentary1.post) + end + end + + context "create_or_update action" do + should "render for create" do + params = { + artist_commentary: { + original_title: "foo", + post_id: FactoryGirl.create(:post).id, + } + } + + post :create_or_update, params, { user_id: @user.id } + assert_redirected_to(ArtistCommentary.find_by_post_id(params[:artist_commentary][:post_id])) + end + + should "render for update" do + params = { + artist_commentary: { + post_id: @commentary1.post_id, + original_title: "foo", + } + } + + post :create_or_update, params, { user_id: @user.id } + assert_redirected_to(@commentary1) + assert_equal("foo", @commentary1.reload.original_title) + end + end + context "revert action" do - setup do - @commentary1 = FactoryGirl.create(:artist_commentary) - @commentary2 = FactoryGirl.create(:artist_commentary) + should "work" do + original_title = @commentary1.original_title + @commentary1.update(original_title: "foo") + + post :revert, { :id => @commentary1.post_id, :version_id => @commentary1.versions(true).first.id }, {:user_id => @user.id} + assert_redirected_to(@commentary1) + assert_equal(original_title, @commentary1.reload.original_title) end should "return 404 when trying to revert a nonexistent commentary" do diff --git a/test/functional/artist_commentary_versions_controller_test.rb b/test/functional/artist_commentary_versions_controller_test.rb new file mode 100644 index 000000000..323677a5e --- /dev/null +++ b/test/functional/artist_commentary_versions_controller_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class ArtistCommentaryVersionsControllerTest < ActionController::TestCase + context "The artist commentary versions controller" do + context "index action" do + should "render" do + get :index + assert_response :success + end + end + end +end diff --git a/test/functional/artists_controller_test.rb b/test/functional/artists_controller_test.rb index 48893579c..0ce937bee 100644 --- a/test/functional/artists_controller_test.rb +++ b/test/functional/artists_controller_test.rb @@ -18,13 +18,13 @@ class ArtistsControllerTest < ActionController::TestCase context "An artists controller" do setup do - CurrentUser.user = FactoryGirl.create(:user) + @user = FactoryGirl.create(:user) + CurrentUser.user = @user CurrentUser.ip_addr = "127.0.0.1" @artist = FactoryGirl.create(:artist) - @user = FactoryGirl.create(:user) - FactoryGirl.create(:artist, :name => "masao", :url_string => "http://i2.pixiv.net/img04/img/syounen_no_uta/") - FactoryGirl.create(:artist, :name => "artgerm", :url_string => "http://artgerm.deviantart.com/") + @masao = FactoryGirl.create(:artist, :name => "masao", :url_string => "http://i2.pixiv.net/img04/img/syounen_no_uta/") + @artgerm = FactoryGirl.create(:artist, :name => "artgerm", :url_string => "http://artgerm.deviantart.com/") end teardown do @@ -37,6 +37,14 @@ class ArtistsControllerTest < ActionController::TestCase assert_response :success end + should "get the show_or_new page" do + get :show_or_new, { name: "masao" }, { user_id: @user.id } + assert_redirected_to(@masao) + + get :show_or_new, { name: "nobody" }, { user_id: @user.id } + assert_redirected_to(new_artist_path(name: "nobody")) + end + should "get the edit page" do get :edit, {:id => @artist.id}, {:user_id => @user.id} assert_response :success @@ -53,6 +61,32 @@ class ArtistsControllerTest < ActionController::TestCase assert_response :success end + should "get the banned page" do + get :banned + assert_response :success + end + + should "ban an artist" do + CurrentUser.scoped(FactoryGirl.create(:admin_user)) do + put :ban, { id: @artist.id }, { user_id: CurrentUser.id } + end + + assert_redirected_to(@artist) + assert_equal(true, @artist.reload.is_banned) + assert_equal(true, TagImplication.exists?(antecedent_name: @artist.name, consequent_name: "banned_artist")) + end + + should "unban an artist" do + CurrentUser.scoped(FactoryGirl.create(:admin_user)) do + @artist.ban! + put :unban, { id: @artist.id }, { user_id: CurrentUser.id } + end + + assert_redirected_to(@artist) + assert_equal(false, @artist.reload.is_banned) + assert_equal(false, TagImplication.exists?(antecedent_name: @artist.name, consequent_name: "banned_artist")) + end + should "get the index page" do get :index assert_response :success @@ -102,6 +136,24 @@ class ArtistsControllerTest < ActionController::TestCase assert_redirected_to(artist_path(@artist)) end + should "delete an artist" do + CurrentUser.scoped(FactoryGirl.create(:builder_user)) do + delete :destroy, { id: @artist.id }, { user_id: CurrentUser.id } + end + + assert_redirected_to(artist_path(@artist)) + assert_equal(false, @artist.reload.is_active) + end + + should "undelete an artist" do + CurrentUser.scoped(FactoryGirl.create(:builder_user)) do + put :undelete, { id: @artist.id }, { user_id: CurrentUser.id } + end + + assert_redirected_to(artist_path(@artist)) + assert_equal(true, @artist.reload.is_active) + end + context "when renaming an artist" do should "automatically rename the artist's wiki page" do artist = FactoryGirl.create(:artist, :name => "aaa", :notes => "testing") diff --git a/test/functional/comments_controller_test.rb b/test/functional/comments_controller_test.rb index eb54597a6..b597bf37c 100644 --- a/test/functional/comments_controller_test.rb +++ b/test/functional/comments_controller_test.rb @@ -22,6 +22,11 @@ class CommentsControllerTest < ActionController::TestCase end context "index action" do + should "render for post" do + xhr :get, :index, { post_id: @post.id, group_by: "post", format: "js" } + assert_response :success + end + should "render by post" do get :index, {:group_by => "post"} assert_response :success @@ -142,5 +147,15 @@ class CommentsControllerTest < ActionController::TestCase assert_redirected_to @comment end end + + context "undelete action" do + should "mark comment as undeleted" do + @comment.delete! + put :undelete, { id: @comment.id }, { user_id: @user.id } + + assert_equal(false, @comment.reload.is_deleted) + assert_redirected_to(@comment) + end + end end end diff --git a/test/functional/counts_controller_test.rb b/test/functional/counts_controller_test.rb new file mode 100644 index 000000000..52fe13113 --- /dev/null +++ b/test/functional/counts_controller_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class CountsControllerTest < ActionController::TestCase + context "The counts commentary controller" do + context "posts action" do + should "render" do + get :posts + assert_response :success + end + end + end +end diff --git a/test/functional/delayed_jobs_controller_test.rb b/test/functional/delayed_jobs_controller_test.rb new file mode 100644 index 000000000..e3231f4cd --- /dev/null +++ b/test/functional/delayed_jobs_controller_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class DelayedJobsControllerTest < ActionController::TestCase + context "The delayed jobs controller" do + context "index action" do + should "render" do + get :index + assert_response :success + end + end + end +end diff --git a/test/functional/dtext_previews_controller_test.rb b/test/functional/dtext_previews_controller_test.rb new file mode 100644 index 000000000..6c4ced596 --- /dev/null +++ b/test/functional/dtext_previews_controller_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class DtextPreviewsControllerTest < ActionController::TestCase + context "The dtext previews controller" do + context "create action" do + should "render" do + post :create, { body: "h1. Touhou\n\n* [[touhou]]" } + assert_response :success + end + end + end +end diff --git a/test/functional/explore/posts_controller_test.rb b/test/functional/explore/posts_controller_test.rb index 5288923d4..7d7b6fb1b 100644 --- a/test/functional/explore/posts_controller_test.rb +++ b/test/functional/explore/posts_controller_test.rb @@ -15,6 +15,27 @@ module Explore assert_response :success end end + + context "#searches" do + should "render" do + get :searches + assert_response :success + end + end + + context "#missed_searches" do + should "render" do + get :missed_searches + assert_response :success + end + end + + context "#intro" do + should "render" do + get :intro + assert_response :success + end + end end end end diff --git a/test/functional/favorite_groups_controller_test.rb b/test/functional/favorite_groups_controller_test.rb new file mode 100644 index 000000000..780ca09ea --- /dev/null +++ b/test/functional/favorite_groups_controller_test.rb @@ -0,0 +1,81 @@ +require 'test_helper' + +class FavoriteGroupsControllerTest < ActionController::TestCase + context "The favorite groups controller" do + setup do + @user = FactoryGirl.create(:user) + CurrentUser.user = @user + CurrentUser.ip_addr = "127.0.0.1" + end + + context "index action" do + should "render" do + get :index + assert_response :success + end + end + + context "show action" do + should "render" do + favgroup = FactoryGirl.create(:favorite_group) + + get :show, { id: favgroup.id } + assert_response :success + end + end + + context "new action" do + should "render" do + get :new, {}, { user_id: @user.id } + assert_response :success + end + end + + context "create action" do + should "render" do + post :create, { favorite_group: FactoryGirl.attributes_for(:favorite_group) }, { user_id: @user.id } + assert_redirected_to favorite_groups_path + end + end + + context "edit action" do + should "render" do + favgroup = FactoryGirl.create(:favorite_group, creator: @user) + + get :edit, { id: favgroup.id }, { user_id: @user.id } + assert_response :success + end + end + + context "update action" do + should "render" do + favgroup = FactoryGirl.create(:favorite_group, creator: @user) + params = { id: favgroup.id, favorite_group: { name: "foo" } } + + put :update, params, { user_id: @user.id } + assert_redirected_to favgroup + assert_equal("foo", favgroup.reload.name) + end + end + + context "destroy action" do + should "render" do + favgroup = FactoryGirl.create(:favorite_group, creator: @user) + + delete :destroy, { id: favgroup.id }, { user_id: @user.id } + assert_redirected_to favorite_groups_path + end + end + + context "add_post action" do + should "render" do + favgroup = FactoryGirl.create(:favorite_group, creator: @user) + post = FactoryGirl.create(:post) + + put :add_post, { id: favgroup.id, post_id: post.id, format: "js" }, { user_id: @user.id } + assert_response :success + assert_equal([post.id], favgroup.reload.post_id_array) + end + end + end +end diff --git a/test/functional/iqdb_queries_controller_test.rb b/test/functional/iqdb_queries_controller_test.rb new file mode 100644 index 000000000..a9dd869f1 --- /dev/null +++ b/test/functional/iqdb_queries_controller_test.rb @@ -0,0 +1,33 @@ +require 'test_helper' +require 'helpers/iqdb_test_helper' + +class IqdbQueriesControllerTest < ActionController::TestCase + include IqdbTestHelper + + context "The iqdb controller" do + setup do + @user = FactoryGirl.create(:user) + CurrentUser.user = @user + CurrentUser.ip_addr = "127.0.0.1" + + @posts = FactoryGirl.create_list(:post, 2) + mock_iqdb_service! + end + + context "create action" do + should "render with a post_id" do + mock_iqdb_matches!(@posts[0], @posts) + post :create, { post_id: @posts[0].id, format: "js" }, { user_id: @user.id } + + assert_response :success + end + + should "render with an url" do + mock_iqdb_matches!(@posts[0].source, @posts) + post :create, { url: @posts[0].source }, { user_id: @user.id } + + assert_response :success + end + end + end +end diff --git a/test/functional/meta_searches_controller_test.rb b/test/functional/meta_searches_controller_test.rb new file mode 100644 index 000000000..630cb0607 --- /dev/null +++ b/test/functional/meta_searches_controller_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class MetaSearchesControllerTest < ActionController::TestCase + context "The meta searches controller" do + context "tags action" do + should "work" do + get :tags, { name: "long_hair" } + assert_response :success + end + end + end +end diff --git a/test/functional/mod_actions_controller_test.rb b/test/functional/mod_actions_controller_test.rb new file mode 100644 index 000000000..b4b8fcecc --- /dev/null +++ b/test/functional/mod_actions_controller_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class ModActionsControllerTest < ActionController::TestCase + context "The mod actions controller" do + context "index action" do + should "work" do + get :index + assert_response :success + end + end + end +end diff --git a/test/functional/moderator/post/posts_controller_test.rb b/test/functional/moderator/post/posts_controller_test.rb index 6357740d2..9d76fce77 100644 --- a/test/functional/moderator/post/posts_controller_test.rb +++ b/test/functional/moderator/post/posts_controller_test.rb @@ -3,42 +3,98 @@ require 'test_helper' module Moderator module Post class PostsControllerTest < ActionController::TestCase - context "The moderator post disapprovals controller" do + context "The moderator posts controller" do setup do @admin = FactoryGirl.create(:admin_user) CurrentUser.user = @admin CurrentUser.ip_addr = "127.0.0.1" + @post = FactoryGirl.create(:post) + end + + context "confirm_delete action" do + should "render" do + get :confirm_delete, { id: @post.id }, { user_id: @admin.id } + assert_response :success + end end context "delete action" do - setup do - @post = FactoryGirl.create(:post) - end - should "render" do post :delete, {:id => @post.id, :reason => "xxx", :format => "js", :commit => "Delete"}, {:user_id => @admin.id} - @post.reload - assert(@post.is_deleted?) + assert(@post.reload.is_deleted?) end should "work even if the deleter has flagged the post previously" do PostFlag.create(:post => @post, :reason => "aaa", :is_resolved => false) post :delete, {:id => @post.id, :reason => "xxx", :format => "js", :commit => "Delete"}, {:user_id => @admin.id} - @post.reload - assert(@post.is_deleted?) + assert(@post.reload.is_deleted?) end end context "undelete action" do - setup do - @post = FactoryGirl.create(:post, :is_deleted => true) - end - should "render" do + @post.update(is_deleted: true) post :undelete, {:id => @post.id, :format => "js"}, {:user_id => @admin.id} + assert_response :success - @post.reload - assert(!@post.is_deleted?) + assert(!@post.reload.is_deleted?) + end + end + + context "confirm_move_favorites action" do + should "render" do + get :confirm_move_favorites, { id: @post.id }, { user_id: @admin.id } + assert_response :success + end + end + + context "move_favorites action" do + should "render" do + parent = FactoryGirl.create(:post) + child = FactoryGirl.create(:post, parent: parent) + users = FactoryGirl.create_list(:user, 2) + users.each { |u| child.add_favorite!(u) } + + put :move_favorites, { id: child.id, commit: "Submit" }, { user_id: @admin.id } + + assert_redirected_to(child) + assert_equal(users, parent.reload.favorited_users) + assert_equal([], child.reload.favorited_users) + end + end + + context "expunge action" do + should "render" do + put :expunge, { id: @post.id, format: "js" }, { user_id: @admin.id } + + assert_response :success + assert_equal(false, ::Post.exists?(@post.id)) + end + end + + context "confirm_ban action" do + should "render" do + get :confirm_ban, { id: @post.id }, { user_id: @admin.id } + assert_response :success + end + end + + context "ban action" do + should "render" do + put :ban, { id: @post.id, commit: "Ban", format: "js" }, { user_id: @admin.id } + + assert_response :success + assert_equal(true, @post.reload.is_banned?) + end + end + + context "unban action" do + should "render" do + @post.ban! + put :unban, { id: @post.id, format: "js" }, { user_id: @admin.id } + + assert_redirected_to(@post) + assert_equal(false, @post.reload.is_banned?) end end end diff --git a/test/functional/moderator/post/queues_controller_test.rb b/test/functional/moderator/post/queues_controller_test.rb index ec5a95744..f7dde5edf 100644 --- a/test/functional/moderator/post/queues_controller_test.rb +++ b/test/functional/moderator/post/queues_controller_test.rb @@ -18,6 +18,13 @@ module Moderator assert_response :success end end + + context "random action" do + should "render" do + get :random, {}, {:user_id => @admin.id} + assert_response :success + end + end end end end diff --git a/test/functional/note_previews_controller_test.rb b/test/functional/note_previews_controller_test.rb new file mode 100644 index 000000000..1a8016945 --- /dev/null +++ b/test/functional/note_previews_controller_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class NotePreviewsControllerTest < ActionController::TestCase + context "The note previews controller" do + context "show action" do + should "work" do + get :show, { body: "test", format: "json" } + assert_response :success + end + end + end +end diff --git a/test/functional/notes_controller_test.rb b/test/functional/notes_controller_test.rb index 354736a01..a0e46ac88 100644 --- a/test/functional/notes_controller_test.rb +++ b/test/functional/notes_controller_test.rb @@ -6,7 +6,7 @@ class NotesControllerTest < ActionController::TestCase @user = FactoryGirl.create(:user) CurrentUser.user = @user CurrentUser.ip_addr = "127.0.0.1" - @post = FactoryGirl.create(:post) + @note = FactoryGirl.create(:note, body: "000") end teardown do @@ -14,17 +14,32 @@ class NotesControllerTest < ActionController::TestCase end context "index action" do - setup do - FactoryGirl.create(:note) - end - should "list all notes" do get :index assert_response :success end should "list all notes (with search)" do - get :index, {:search => {:body_matches => "abc"}} + params = { + group_by: "note", + search: { + body_matches: "000", + is_active: true, + post_id: @note.post_id, + post_tags_match: @note.post.tag_array.first, + creator_name: @note.creator_name, + creator_id: @note.creator_id, + } + } + + get :index, params + assert_response :success + end + end + + context "show action" do + should "render" do + get :show, { id: @note.id, format: "json" } assert_response :success end end @@ -32,20 +47,16 @@ class NotesControllerTest < ActionController::TestCase context "create action" do should "create a note" do assert_difference("Note.count", 1) do + @post = FactoryGirl.create(:post) post :create, {:note => {:x => 0, :y => 0, :width => 10, :height => 10, :body => "abc", :post_id => @post.id}, :format => :json}, {:user_id => @user.id} end end end context "update action" do - setup do - @note = FactoryGirl.create(:note) - end - should "update a note" do post :update, {:id => @note.id, :note => {:body => "xyz"}}, {:user_id => @user.id} - @note.reload - assert_equal("xyz", @note.body) + assert_equal("xyz", @note.reload.body) end should "not allow changing the post id to another post" do @@ -57,20 +68,14 @@ class NotesControllerTest < ActionController::TestCase end context "destroy action" do - setup do - @note = FactoryGirl.create(:note) - end - should "destroy a note" do post :destroy, {:id => @note.id}, {:user_id => @user.id} - @note.reload - assert_equal(false, @note.is_active?) + assert_equal(false, @note.reload.is_active?) end end context "revert action" do setup do - @note = FactoryGirl.create(:note, :body => "000") Timecop.travel(1.day.from_now) do @note.update_attributes(:body => "111") end @@ -81,17 +86,15 @@ class NotesControllerTest < ActionController::TestCase should "revert to a previous version" do post :revert, {:id => @note.id, :version_id => @note.versions(true).first.id}, {:user_id => @user.id} - @note.reload - assert_equal("000", @note.body) + assert_equal("000", @note.reload.body) end should "not allow reverting to a previous version of another note" do @note2 = FactoryGirl.create(:note, :body => "note 2") post :revert, { :id => @note.id, :version_id => @note2.versions(true).first.id }, {:user_id => @user.id} - @note.reload - assert_not_equal(@note.body, @note2.body) + assert_not_equal(@note.reload.body, @note2.body) assert_response :missing end end diff --git a/test/functional/pools_controller_test.rb b/test/functional/pools_controller_test.rb index a56aaa9a2..12b6220db 100644 --- a/test/functional/pools_controller_test.rb +++ b/test/functional/pools_controller_test.rb @@ -49,6 +49,21 @@ class PoolsControllerTest < ActionController::TestCase end end + context "gallery action" do + should "render" do + pool = FactoryGirl.create(:pool) + get :gallery, {:id => pool.id} + assert_response :success + end + end + + context "new action" do + should "render" do + get :new, {}, { user_id: @user.id } + assert_response :success + end + end + context "create action" do should "create a pool" do assert_difference("Pool.count", 1) do @@ -57,6 +72,15 @@ class PoolsControllerTest < ActionController::TestCase end end + context "edit action" do + should "render" do + pool = FactoryGirl.create(:pool) + + get :edit, { id: pool.id }, { user_id: @user.id } + assert_response :success + end + end + context "update action" do setup do @pool = FactoryGirl.create(:pool) diff --git a/test/functional/posts_controller_test.rb b/test/functional/posts_controller_test.rb index 51ac1445f..01da6f29f 100644 --- a/test/functional/posts_controller_test.rb +++ b/test/functional/posts_controller_test.rb @@ -89,6 +89,32 @@ class PostsControllerTest < ActionController::TestCase assert_response :success end end + + context "with an md5 param" do + should "render" do + get :index, { md5: @post.md5 } + assert_redirected_to(@post) + end + end + end + + context "show_seq action" do + should "render" do + posts = FactoryGirl.create_list(:post, 3) + + get :show_seq, { seq: "prev", id: posts[1].id } + assert_redirected_to(posts[2]) + + get :show_seq, { seq: "next", id: posts[1].id } + assert_redirected_to(posts[0]) + end + end + + context "random action" do + should "render" do + get :random, { tags: "aaaa" } + assert_redirected_to(post_path(@post, tags: "aaaa")) + end end context "show action" do diff --git a/test/functional/related_tags_controller_test.rb b/test/functional/related_tags_controller_test.rb index 9f2bbe128..ec9e241dc 100644 --- a/test/functional/related_tags_controller_test.rb +++ b/test/functional/related_tags_controller_test.rb @@ -1,7 +1,12 @@ require 'test_helper' class RelatedTagsControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end + context "The related tags controller" do + context "show action" do + should "work" do + get :show, { query: "touhou" } + assert_response :success + end + end + end end diff --git a/test/functional/reports_controller_test.rb b/test/functional/reports_controller_test.rb new file mode 100644 index 000000000..20a05bf44 --- /dev/null +++ b/test/functional/reports_controller_test.rb @@ -0,0 +1,69 @@ +require 'test_helper' + +class ReportsControllerTest < ActionController::TestCase + setup do + CurrentUser.user = FactoryGirl.create(:mod_user) + CurrentUser.ip_addr = "127.0.0.1" + session[:user_id] = CurrentUser.user.id + + @users = FactoryGirl.create_list(:contributor_user, 2) + @posts = @users.map { |u| FactoryGirl.create(:post, uploader: u) } + end + + teardown do + CurrentUser.user = nil + CurrentUser.ip_addr = nil + session[:user_id] = nil + end + + context "The reports controller" do + context "user_promotions action" do + should "render" do + get :user_promotions + assert_response :success + end + end + + context "janitor_trials action" do + should "render" do + get :janitor_trials + assert_response :success + end + end + + context "contributors action" do + should "render" do + get :contributors + assert_response :success + end + end + + context "uploads action" do + should "render" do + get :uploads + assert_response :success + end + end + + context "similar_users action" do + should "render" do + #get :similar_users + #assert_response :success + end + end + + context "post_versions action" do + should "render" do + get :post_versions + assert_response :success + end + end + + context "post_versions_create action" do + should "render" do + #post :post_versions_create, { tag: "touhou", type: "added" } + #assert_response :success + end + end + end +end diff --git a/test/functional/saved_searches_controller_test.rb b/test/functional/saved_searches_controller_test.rb new file mode 100644 index 000000000..89263ad66 --- /dev/null +++ b/test/functional/saved_searches_controller_test.rb @@ -0,0 +1,60 @@ +require 'test_helper' +require 'helpers/saved_search_test_helper' + +class SavedSearchesControllerTest < ActionController::TestCase + include SavedSearchTestHelper + + context "The saved searches controller" do + setup do + @user = FactoryGirl.create(:user) + CurrentUser.user = @user + CurrentUser.ip_addr = "127.0.0.1" + mock_saved_search_service! + end + + context "index action" do + should "render" do + get :index, {}, { user_id: @user.id } + assert_response :success + end + end + + context "create action" do + should "render" do + params = { saved_search_tags: "bkub", saved_search_category: "artist" } + + post :create, params, { user_id: @user.id } + assert_response :redirect + end + end + + context "edit action" do + should "render" do + saved_search = FactoryGirl.create(:saved_search, user: @user) + + get :edit, { id: saved_search.id }, { user_id: @user.id } + assert_response :success + end + end + + context "update action" do + should "render" do + saved_search = FactoryGirl.create(:saved_search, user: @user) + params = { id: saved_search.id, saved_search: { category: "foo" } } + + put :update, params, { user_id: @user.id } + assert_redirected_to saved_searches_path + assert_equal("foo", saved_search.reload.category) + end + end + + context "destroy action" do + should "render" do + saved_search = FactoryGirl.create(:saved_search, user: @user) + + delete :destroy, { id: saved_search.id }, { user_id: @user.id } + assert_redirected_to saved_searches_path + end + end + end +end diff --git a/test/functional/sources_controller_test.rb b/test/functional/sources_controller_test.rb new file mode 100644 index 000000000..f78df071b --- /dev/null +++ b/test/functional/sources_controller_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class SourcesControllerTest < ActionController::TestCase + context "The sources controller" do + context "show action" do + should "work" do + get :show, { url: "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=14901720", format: "json" } + assert_response :success + end + end + end +end diff --git a/test/functional/tags_controller_test.rb b/test/functional/tags_controller_test.rb index ceebc59f5..b6cebd20e 100644 --- a/test/functional/tags_controller_test.rb +++ b/test/functional/tags_controller_test.rb @@ -26,7 +26,7 @@ class TagsControllerTest < ActionController::TestCase context "index action" do setup do - @tag = FactoryGirl.create(:tag, :name => "aaa") + @tag = FactoryGirl.create(:tag, name: "aaa", post_count: 1) end should "render" do @@ -42,6 +42,15 @@ class TagsControllerTest < ActionController::TestCase end end + context "autocomplete action" do + should "render" do + FactoryGirl.create(:tag, name: "touhou", post_count: 1) + + get :autocomplete, { search: { name_matches: "t" }, format: :json } + assert_response :success + end + end + context "show action" do setup do @tag = FactoryGirl.create(:tag) diff --git a/test/functional/users_controller_test.rb b/test/functional/users_controller_test.rb index 907c0c0ed..d63fe5432 100644 --- a/test/functional/users_controller_test.rb +++ b/test/functional/users_controller_test.rb @@ -13,24 +13,33 @@ class UsersControllerTest < ActionController::TestCase end context "index action" do - setup do - FactoryGirl.create(:user, :name => "abc") - end - should "list all users" do get :index assert_response :success end + should "list all users for /users?name=" do + get :index, { name: @user.name } + assert_redirected_to(@user) + end + + should "raise error for /users?name=" do + get :index, { name: "nobody" } + assert_response :error + end + should "list all users (with search)" do - get :index, {:search => {:name_matches => "abc"}} + get :index, {:search => {:name_matches => @user.name}} assert_response :success end end context "show action" do setup do - @user = FactoryGirl.create(:user) + # flesh out profile to get more test coverage of user presenter. + @user = FactoryGirl.create(:banned_user, can_approve_posts: true, is_super_voter: true) + FactoryGirl.create(:saved_search, user: @user) + FactoryGirl.create(:post, uploader: @user, tag_string: "fav:#{@user.name}") end should "render" do @@ -39,6 +48,13 @@ class UsersControllerTest < ActionController::TestCase end end + context "new action" do + should "render" do + get :new + assert_response :success + end + end + context "create action" do should "create a user" do assert_difference("User.count", 1) do diff --git a/test/functional/wiki_page_versions_controller_test.rb b/test/functional/wiki_page_versions_controller_test.rb index e8d55ef3e..0a7dac6ac 100644 --- a/test/functional/wiki_page_versions_controller_test.rb +++ b/test/functional/wiki_page_versions_controller_test.rb @@ -6,6 +6,10 @@ class WikiPageVersionsControllerTest < ActionController::TestCase @user = FactoryGirl.create(:user) CurrentUser.user = @user CurrentUser.ip_addr = "127.0.0.1" + + @wiki_page = FactoryGirl.create(:wiki_page) + @wiki_page.update_attributes(:body => "1 2") + @wiki_page.update_attributes(:body => "2 3") end teardown do @@ -14,12 +18,6 @@ class WikiPageVersionsControllerTest < ActionController::TestCase end context "index action" do - setup do - @wiki_page = FactoryGirl.create(:wiki_page) - @wiki_page.update_attributes(:body => "1 2") - @wiki_page.update_attributes(:body => "2 3") - end - should "list all versions" do get :index assert_response :success @@ -32,5 +30,19 @@ class WikiPageVersionsControllerTest < ActionController::TestCase assert_not_nil(assigns(:wiki_page_versions)) end end + + context "show action" do + should "render" do + get :show, { id: @wiki_page.versions.first.id } + assert_response :success + end + end + + context "diff action" do + should "render" do + get :diff, { thispage: @wiki_page.versions.first.id, otherpage: @wiki_page.versions.last.id } + assert_response :success + end + end end end diff --git a/test/functional/wiki_pages_controller_test.rb b/test/functional/wiki_pages_controller_test.rb index 53c0e588f..472b4a2c1 100644 --- a/test/functional/wiki_pages_controller_test.rb +++ b/test/functional/wiki_pages_controller_test.rb @@ -40,6 +40,16 @@ class WikiPagesControllerTest < ActionController::TestCase assert_response :success end + should "render for a title" do + get :show, {:id => @wiki_page.title} + assert_response :success + end + + should "redirect for a nonexistent title" do + get :show, {:id => "what"} + assert_redirected_to(show_or_new_wiki_pages_path(title: "what")) + end + should "render for a negated tag" do @wiki_page.update_attribute(:title, "-aaa") get :show, {:id => @wiki_page.id} @@ -47,6 +57,38 @@ class WikiPagesControllerTest < ActionController::TestCase end end + context "show_or_new action" do + setup do + @wiki_page = FactoryGirl.create(:wiki_page) + end + + should "redirect when given a title" do + get :show_or_new, { title: @wiki_page.title } + assert_redirected_to(@wiki_page) + end + + should "render when given a nonexistent title" do + get :show_or_new, { title: "what" } + assert_response :success + end + end + + context "new action" do + should "render" do + get :new, {}, { user_id: @mod.id } + assert_response :success + end + end + + context "edit action" do + should "render" do + wiki_page = FactoryGirl.create(:wiki_page) + + get :edit, { id: wiki_page.id }, { user_id: @mod.id } + assert_response :success + end + end + context "create action" do should "create a wiki_page" do assert_difference("WikiPage.count", 1) do diff --git a/test/helpers/iqdb_test_helper.rb b/test/helpers/iqdb_test_helper.rb index a9fed0cc5..f34a3cdb8 100644 --- a/test/helpers/iqdb_test_helper.rb +++ b/test/helpers/iqdb_test_helper.rb @@ -16,5 +16,16 @@ module IqdbTestHelper service = mock_sqs_service.new Post.stubs(:iqdb_sqs_service).returns(service) + + Danbooru.config.stubs(:iqdbs_auth_key).returns("hunter2") + Danbooru.config.stubs(:iqdbs_server).returns("http://localhost:3004") + end + + def mock_iqdb_matches!(post_or_source, matches) + source = post_or_source.is_a?(Post) ? post_or_source.complete_preview_file_url : post_or_source + url = "http://localhost:3004/similar?key=hunter2&url=#{CGI.escape source}&ref" + body = matches.map { |post| { post_id: post.id } }.to_json + + FakeWeb.register_uri(:get, url, body: body) end end diff --git a/test/helpers/reportbooru_helper.rb b/test/helpers/reportbooru_helper.rb new file mode 100644 index 000000000..1591c1ef4 --- /dev/null +++ b/test/helpers/reportbooru_helper.rb @@ -0,0 +1,12 @@ +module ReportbooruHelper + def mock_popular_search_service! + Danbooru.config.stubs(:reportbooru_server).returns("http://localhost:3003") + FakeWeb.register_uri(:get, "http://localhost:3003/hits/month?date=#{Date.today}", body: "kantai_collection 1000.0\ntouhou 500.0") + FakeWeb.register_uri(:get, "http://localhost:3003/hits/day?date=#{Date.today}", body: "kantai_collection 1000.0\ntouhou 500.0") + end + + def mock_missed_search_service! + Danbooru.config.stubs(:reportbooru_server).returns("http://localhost:3003") + FakeWeb.register_uri(:get, "http://localhost:3003/missed_searches", body: "kantai_collection 1000.0\ntouhou 500.0") + end +end diff --git a/test/helpers/saved_search_test_helper.rb b/test/helpers/saved_search_test_helper.rb index 2b2a9071b..26c9e1226 100644 --- a/test/helpers/saved_search_test_helper.rb +++ b/test/helpers/saved_search_test_helper.rb @@ -16,6 +16,7 @@ module SavedSearchTestHelper service = mock_sqs_service.new SavedSearch.stubs(:sqs_service).returns(service) + SavedSearch.stubs(:update_listbooru_on_create) Danbooru.config.stubs(:aws_sqs_saved_search_url).returns("http://localhost:3002") Danbooru.config.stubs(:listbooru_auth_key).returns("blahblahblah") Danbooru.config.stubs(:listbooru_server).returns("http://localhost:3001") diff --git a/test/test_helper.rb b/test/test_helper.rb index cf155a94d..d428a5de4 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -26,3 +26,13 @@ end MEMCACHE = MemcacheMock.new Delayed::Worker.delay_jobs = false + +require "helpers/reportbooru_helper" +class ActiveSupport::TestCase + include ReportbooruHelper + + setup do + mock_popular_search_service! + mock_missed_search_service! + end +end diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index 9104eb3ab..452c7a8fc 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -6,6 +6,10 @@ class PostTest < ActiveSupport::TestCase include PoolArchiveTestHelper include SavedSearchTestHelper + def assert_tag_match(posts, query) + assert_equal(posts.map(&:id), Post.tag_match(query).pluck(:id)) + end + setup do Timecop.travel(2.weeks.ago) do @user = FactoryGirl.create(:user) @@ -1506,230 +1510,346 @@ class PostTest < ActiveSupport::TestCase context "Searching:" do should "return posts for the age:<1minute tag" do - post1 = FactoryGirl.create(:post, :tag_string => "aaa") - count = Post.tag_match("age:<1minute").count - assert_equal(1, count) + post = FactoryGirl.create(:post) + assert_tag_match([post], "age:<1minute") end should "return posts for the age:<1minute tag when the user is in Pacific time zone" do - post1 = FactoryGirl.create(:post, :tag_string => "aaa") + post = FactoryGirl.create(:post) Time.zone = "Pacific Time (US & Canada)" - count = Post.tag_match("age:<1minute").count - assert_equal(1, count) + assert_tag_match([post], "age:<1minute") Time.zone = "Eastern Time (US & Canada)" end should "return posts for the age:<1minute tag when the user is in Tokyo time zone" do - post1 = FactoryGirl.create(:post, :tag_string => "aaa") + post = FactoryGirl.create(:post) Time.zone = "Asia/Tokyo" - count = Post.tag_match("age:<1minute").count - assert_equal(1, count) + assert_tag_match([post], "age:<1minute") Time.zone = "Eastern Time (US & Canada)" end should "return posts for the ' tag" do post1 = FactoryGirl.create(:post, :tag_string => "'") post2 = FactoryGirl.create(:post, :tag_string => "aaa bbb") - count = Post.tag_match("'").count - assert_equal(1, count) + + assert_tag_match([post1], "'") end should "return posts for the \\ tag" do post1 = FactoryGirl.create(:post, :tag_string => "\\") post2 = FactoryGirl.create(:post, :tag_string => "aaa bbb") - count = Post.tag_match("\\").count - assert_equal(1, count) + + assert_tag_match([post1], "\\") end should "return posts for the ( tag" do post1 = FactoryGirl.create(:post, :tag_string => "(") post2 = FactoryGirl.create(:post, :tag_string => "aaa bbb") - count = Post.tag_match("(").count - assert_equal(1, count) + + assert_tag_match([post1], "(") end should "return posts for the ? tag" do post1 = FactoryGirl.create(:post, :tag_string => "?") post2 = FactoryGirl.create(:post, :tag_string => "aaa bbb") - count = Post.tag_match("?").count - assert_equal(1, count) + + assert_tag_match([post1], "?") end should "return posts for 1 tag" do post1 = FactoryGirl.create(:post, :tag_string => "aaa") post2 = FactoryGirl.create(:post, :tag_string => "aaa bbb") post3 = FactoryGirl.create(:post, :tag_string => "bbb ccc") - relation = Post.tag_match("aaa") - assert_equal(2, relation.count) - assert_equal(post2.id, relation.all[0].id) - assert_equal(post1.id, relation.all[1].id) + + assert_tag_match([post2, post1], "aaa") end should "return posts for a 2 tag join" do post1 = FactoryGirl.create(:post, :tag_string => "aaa") post2 = FactoryGirl.create(:post, :tag_string => "aaa bbb") post3 = FactoryGirl.create(:post, :tag_string => "bbb ccc") - relation = Post.tag_match("aaa bbb") - assert_equal(1, relation.count) - assert_equal(post2.id, relation.first.id) + + assert_tag_match([post2], "aaa bbb") + end + + should "return posts for a 2 tag union" do + post1 = FactoryGirl.create(:post, :tag_string => "aaa") + post2 = FactoryGirl.create(:post, :tag_string => "aaab bbb") + post3 = FactoryGirl.create(:post, :tag_string => "bbb ccc") + + assert_tag_match([post3, post1], "~aaa ~ccc") end should "return posts for 1 tag with exclusion" do post1 = FactoryGirl.create(:post, :tag_string => "aaa") post2 = FactoryGirl.create(:post, :tag_string => "aaa bbb") post3 = FactoryGirl.create(:post, :tag_string => "bbb ccc") - relation = Post.tag_match("aaa -bbb") - assert_equal(1, relation.count) - assert_equal(post1.id, relation.first.id) + + assert_tag_match([post1], "aaa -bbb") end should "return posts for 1 tag with a pattern" do post1 = FactoryGirl.create(:post, :tag_string => "aaa") post2 = FactoryGirl.create(:post, :tag_string => "aaab bbb") post3 = FactoryGirl.create(:post, :tag_string => "bbb ccc") - relation = Post.tag_match("a*") - assert_equal(2, relation.count) - assert_equal(post2.id, relation.all[0].id) - assert_equal(post1.id, relation.all[1].id) + + assert_tag_match([post2, post1], "a*") end should "return posts for 2 tags, one with a pattern" do post1 = FactoryGirl.create(:post, :tag_string => "aaa") post2 = FactoryGirl.create(:post, :tag_string => "aaab bbb") post3 = FactoryGirl.create(:post, :tag_string => "bbb ccc") - relation = Post.tag_match("a* bbb") - assert_equal(1, relation.count) - assert_equal(post2.id, relation.first.id) + + assert_tag_match([post2], "a* bbb") end - should "return posts for the metatag" do - post1 = FactoryGirl.create(:post) - post2 = FactoryGirl.create(:post) - post3 = FactoryGirl.create(:post) - relation = Post.tag_match("id:#{post2.id}") - assert_equal(1, relation.count) - assert_equal(post2.id, relation.first.id) - relation = Post.tag_match("id:>#{post2.id}") - assert_equal(1, relation.count) - assert_equal(post3.id, relation.first.id) - relation = Post.tag_match("id:<#{post2.id}") - assert_equal(1, relation.count) - assert_equal(post1.id, relation.first.id) + should "return posts for the id: metatag" do + posts = FactoryGirl.create_list(:post, 3) + + assert_tag_match([posts[1]], "id:#{posts[1].id}") + assert_tag_match([posts[2]], "id:>#{posts[1].id}") + assert_tag_match([posts[0]], "id:<#{posts[1].id}") + + assert_tag_match([posts[2], posts[0]], "-id:#{posts[1].id}") + assert_tag_match([posts[2], posts[1]], "id:>=#{posts[1].id}") + assert_tag_match([posts[1], posts[0]], "id:<=#{posts[1].id}") + assert_tag_match([posts[2], posts[0]], "id:#{posts[0].id},#{posts[2].id}") + assert_tag_match(posts.reverse, "id:#{posts[0].id}..#{posts[2].id}") end - should "return posts for the metatag" do - post1 = FactoryGirl.create(:post) - post2 = FactoryGirl.create(:post) - post3 = FactoryGirl.create(:post) - user = FactoryGirl.create(:user) - post1.add_favorite!(user) - relation = Post.tag_match("fav:#{user.name}") - assert_equal(1, relation.count) - assert_equal(post1.id, relation.first.id) - end - - should "return posts for the metatag" do - SqsService.any_instance.stubs(:send_message) - - post1 = FactoryGirl.create(:post) - post2 = FactoryGirl.create(:post) - post3 = FactoryGirl.create(:post) - pool = FactoryGirl.create(:pool, :name => "xxx") - post1.add_pool!(pool) - relation = Post.tag_match("pool:xxx") - assert_equal(1, relation.count) - assert_equal(post1.id, relation.first.id) - end - - should "return posts for the metatag with a wildcard" do - SqsService.any_instance.stubs(:send_message) - - post1 = FactoryGirl.create(:post) - post2 = FactoryGirl.create(:post) - post3 = FactoryGirl.create(:post) - pool1 = FactoryGirl.create(:pool, :name => "test_a") - pool2 = FactoryGirl.create(:pool, :name => "test_b") - post1.add_pool!(pool1) - post3.add_pool!(pool2) - relation = Post.tag_match("pool:test*") - assert_equal(2, relation.count) - assert_equal([post3.id, post1.id], relation.all.map(&:id)) - end - - should "return posts for the metatag" do - second_user = FactoryGirl.create(:user) - post1 = FactoryGirl.create(:post, :uploader => CurrentUser.user) - - assert_equal(CurrentUser.id, post1.uploader_id) - - CurrentUser.scoped(second_user, "127.0.0.2") do - post2 = FactoryGirl.create(:post) - post3 = FactoryGirl.create(:post) + should "return posts for the fav: metatag" do + users = FactoryGirl.create_list(:user, 2) + posts = users.map do |u| + CurrentUser.scoped(u) { FactoryGirl.create(:post, tag_string: "fav:#{u.name}") } end - relation = Post.tag_match("user:#{CurrentUser.user.name}") - assert_equal(1, relation.count) - assert_equal(post1.id, relation.first.id) + assert_tag_match([posts[0]], "fav:#{users[0].name}") + assert_tag_match([posts[1]], "-fav:#{users[0].name}") end - should "return posts for a list of md5 hashes" do + should "return posts for the ordfav: metatag" do + post1 = FactoryGirl.create(:post, tag_string: "fav:#{CurrentUser.name}") + post2 = FactoryGirl.create(:post, tag_string: "fav:#{CurrentUser.name}") + + assert_tag_match([post2, post1], "ordfav:#{CurrentUser.name}") + end + + should "return posts for the pool: metatag" do + SqsService.any_instance.stubs(:send_message) + + FactoryGirl.create(:pool, name: "test_a", category: "series") + FactoryGirl.create(:pool, name: "test_b", category: "collection") + post1 = FactoryGirl.create(:post, tag_string: "pool:test_a") + post2 = FactoryGirl.create(:post, tag_string: "pool:test_b") + + assert_tag_match([post1], "pool:test_a") + assert_tag_match([post2], "-pool:test_a") + assert_tag_match([], "-pool:test_a -pool:test_b") + assert_tag_match([post2, post1], "pool:test*") + + assert_tag_match([post2, post1], "pool:any") + assert_tag_match([], "pool:none") + + assert_tag_match([post1], "pool:series") + assert_tag_match([post2], "-pool:series") + assert_tag_match([post2], "pool:collection") + assert_tag_match([post1], "-pool:collection") + end + + should "return posts for the ordpool: metatag" do + posts = FactoryGirl.create_list(:post, 2, tag_string: "newpool:test") + + assert_tag_match(posts, "ordpool:test") + end + + should "return posts for the parent: metatag" do + parent = FactoryGirl.create(:post) + child = FactoryGirl.create(:post, tag_string: "parent:#{parent.id}") + + assert_tag_match([parent], "parent:none") + assert_tag_match([child], "-parent:none") + assert_tag_match([child, parent], "parent:#{parent.id}") + assert_tag_match([child], "parent:#{child.id}") + + assert_tag_match([child], "child:none") + assert_tag_match([parent], "child:any") + end + + should "return posts for the favgroup: metatag" do + favgroups = FactoryGirl.create_list(:favorite_group, 2, creator: CurrentUser.user) + posts = favgroups.map { |g| FactoryGirl.create(:post, tag_string: "favgroup:#{g.name}") } + + assert_tag_match([posts[0]], "favgroup:#{favgroups[0].name}") + assert_tag_match([posts[1]], "-favgroup:#{favgroups[0].name}") + assert_tag_match([], "-favgroup:#{favgroups[0].name} -favgroup:#{favgroups[1].name}") + end + + should "return posts for the user: metatag" do + users = FactoryGirl.create_list(:user, 2) + posts = users.map { |u| FactoryGirl.create(:post, uploader: u) } + + assert_tag_match([posts[0]], "user:#{users[0].name}") + assert_tag_match([posts[1]], "-user:#{users[0].name}") + end + + should "return posts for the approver: metatag" do + users = FactoryGirl.create_list(:user, 2) + posts = users.map { |u| FactoryGirl.create(:post, approver: u) } + posts << FactoryGirl.create(:post, approver: nil) + + assert_tag_match([posts[0]], "approver:#{users[0].name}") + assert_tag_match([posts[1]], "-approver:#{users[0].name}") + assert_tag_match([posts[1], posts[0]], "approver:any") + assert_tag_match([posts[2]], "approver:none") + end + + should "return posts for the noter: metatag" do + users = FactoryGirl.create_list(:user, 2) + posts = FactoryGirl.create_list(:post, 2) + notes = users.zip(posts).map { |u, p| FactoryGirl.create(:note, creator: u, post: p) } + + assert_tag_match([posts[0]], "noter:#{users[0].name}") + assert_tag_match([posts[1]], "noter:#{users[1].name}") + end + + should "return posts for the artcomm: metatag" do + users = FactoryGirl.create_list(:user, 2) + posts = FactoryGirl.create_list(:post, 2) + users.zip(posts).map do |u, p| + CurrentUser.scoped(u) { FactoryGirl.create(:artist_commentary, post: p) } + end + + assert_tag_match([posts[0]], "artcomm:#{users[0].name}") + assert_tag_match([posts[1]], "artcomm:#{users[1].name}") + end + + should "return posts for the date: metatag" do + post = FactoryGirl.create(:post, created_at: Time.parse("2017-01-01")) + + assert_tag_match([post], "date:2017-01-01") + end + + should "return posts for the age: metatag" do + post = FactoryGirl.create(:post) + + assert_tag_match([post], "age:<60") + assert_tag_match([post], "age:<60s") + assert_tag_match([post], "age:<1mi") + assert_tag_match([post], "age:<1h") + assert_tag_match([post], "age:<1d") + assert_tag_match([post], "age:<1w") + assert_tag_match([post], "age:<1mo") + assert_tag_match([post], "age:<1y") + end + + should "return posts for the ratio: metatag" do + post = FactoryGirl.create(:post, image_width: 1000, image_height: 500) + + assert_tag_match([post], "ratio:2:1") + assert_tag_match([post], "ratio:2.0") + end + + should "return posts for the status: metatag" do + pending = FactoryGirl.create(:post, is_pending: true) + flagged = FactoryGirl.create(:post, is_flagged: true) + deleted = FactoryGirl.create(:post, is_deleted: true) + banned = FactoryGirl.create(:post, is_banned: true) + all = [banned, deleted, flagged, pending] + + assert_tag_match([pending], "status:pending") + assert_tag_match([flagged], "status:flagged") + assert_tag_match([deleted], "status:deleted") + assert_tag_match([banned], "status:banned") + assert_tag_match([flagged], "status:active") + assert_tag_match(all, "status:any") + assert_tag_match(all, "status:all") + + assert_tag_match(all - [pending], "-status:pending") + assert_tag_match(all - [flagged], "-status:flagged") + assert_tag_match(all - [deleted], "-status:deleted") + assert_tag_match(all - [banned], "-status:banned") + assert_tag_match(all - [flagged], "-status:active") + end + + should "return posts for the filetype: metatag" do + png = FactoryGirl.create(:post, file_ext: "png") + jpg = FactoryGirl.create(:post, file_ext: "jpg") + + assert_tag_match([png], "filetype:png") + assert_tag_match([jpg], "-filetype:png") + end + + should "return posts for the tagcount: metatags" do + post = FactoryGirl.create(:post, tag_string: "artist:wokada copyright:vocaloid char:hatsune_miku twintails") + + assert_tag_match([post], "tagcount:4") + assert_tag_match([post], "arttags:1") + assert_tag_match([post], "copytags:1") + assert_tag_match([post], "chartags:1") + assert_tag_match([post], "gentags:1") + end + + should "return posts for the md5: metatag" do post1 = FactoryGirl.create(:post, :md5 => "abcd") post2 = FactoryGirl.create(:post) - post3 = FactoryGirl.create(:post) - relation = Post.tag_match("md5:abcd") - assert_equal(1, relation.count) - assert_equal(post1.id, relation.first.id) + + assert_tag_match([post1], "md5:abcd") end should "return posts for a source search" do post1 = FactoryGirl.create(:post, :source => "abcd") post2 = FactoryGirl.create(:post, :source => "abcdefg") - post3 = FactoryGirl.create(:post, :source => "xyz") - relation = Post.tag_match("source:abcde") - assert_equal(1, relation.count) - assert_equal(post2.id, relation.first.id) + post3 = FactoryGirl.create(:post, :source => "") + + assert_tag_match([post2], "source:abcde") + assert_tag_match([post3, post1], "-source:abcde") + + assert_tag_match([post3], "source:none") + assert_tag_match([post2, post1], "-source:none") end should "return posts for a case insensitive source search" do post1 = FactoryGirl.create(:post, :source => "ABCD") post2 = FactoryGirl.create(:post, :source => "1234") - relation = Post.tag_match("source:abcd") - assert_equal(1, relation.count) + + assert_tag_match([post1], "source:abcd") end should "return posts for a pixiv source search" do url = "http://i1.pixiv.net/img123/img/artist-name/789.png" post = FactoryGirl.create(:post, :source => url) - assert_equal(1, Post.tag_match("source:*.pixiv.net/img*/artist-name/*").count) - assert_equal(0, Post.tag_match("source:*.pixiv.net/img*/artist-fake/*").count) - assert_equal(1, Post.tag_match("source:http://*.pixiv.net/img*/img/artist-name/*").count) - assert_equal(0, Post.tag_match("source:http://*.pixiv.net/img*/img/artist-fake/*").count) - assert_equal(1, Post.tag_match("source:pixiv/artist-name/*").count) - assert_equal(0, Post.tag_match("source:pixiv/artist-fake/*").count) + + assert_tag_match([post], "source:*.pixiv.net/img*/artist-name/*") + assert_tag_match([], "source:*.pixiv.net/img*/artist-fake/*") + assert_tag_match([post], "source:http://*.pixiv.net/img*/img/artist-name/*") + assert_tag_match([], "source:http://*.pixiv.net/img*/img/artist-fake/*") + assert_tag_match([post], "source:pixiv/artist-name/*") + assert_tag_match([], "source:pixiv/artist-fake/*") end should "return posts for a pixiv id search (type 1)" do url = "http://i1.pixiv.net/img-inf/img/2013/03/14/03/02/36/34228050_s.jpg" post = FactoryGirl.create(:post, :source => url) - assert_equal(1, Post.tag_match("pixiv_id:34228050").count) + assert_tag_match([post], "pixiv_id:34228050") end should "return posts for a pixiv id search (type 2)" do url = "http://i1.pixiv.net/img123/img/artist-name/789.png" post = FactoryGirl.create(:post, :source => url) - assert_equal(1, Post.tag_match("pixiv_id:789").count) + assert_tag_match([post], "pixiv_id:789") end should "return posts for a pixiv id search (type 3)" do url = "http://www.pixiv.net/member_illust.php?mode=manga_big&illust_id=19113635&page=0" post = FactoryGirl.create(:post, :source => url) - assert_equal(1, Post.tag_match("pixiv_id:19113635").count) + assert_tag_match([post], "pixiv_id:19113635") end should "return posts for a pixiv id search (type 4)" do url = "http://i2.pixiv.net/img70/img/disappearedstump/34551381_p3.jpg?1364424318" post = FactoryGirl.create(:post, :source => url) - assert_equal(1, Post.tag_match("pixiv_id:34551381").count) + assert_tag_match([post], "pixiv_id:34551381") end # should "return posts for a pixiv novel id search" do @@ -1746,52 +1866,103 @@ class PostTest < ActiveSupport::TestCase assert_equal(1, relation.count) end - should "return posts for a metatag" do - SavedSearch.stubs(:update_listbooru_on_create) - post1 = FactoryGirl.create(:post, :tag_string => "aaa") - sub = FactoryGirl.create(:saved_search, :tag_query => "aaa", :name => "zzz", :user_id => CurrentUser.id) - SavedSearch.expects(:post_ids).returns([post1.id]) - relation = Post.tag_match("search:#{CurrentUser.name}") - assert_equal(1, relation.count) + should "return posts for a search: metatag" do + post1 = FactoryGirl.create(:post, tag_string: "aaa") + post2 = FactoryGirl.create(:post, tag_string: "bbb") + FactoryGirl.create(:saved_search, tag_query: "aaa", category: "zzz", user: CurrentUser.user) + FactoryGirl.create(:saved_search, tag_query: "bbb", category: nil, user: CurrentUser.user) + + SavedSearch.expects(:post_ids).with(CurrentUser.id, "zzz").returns([post1.id]) + SavedSearch.expects(:post_ids).with(CurrentUser.id, "uncategorized").returns([post2.id]) + SavedSearch.expects(:post_ids).with(CurrentUser.id).returns([post1.id, post2.id]) + + assert_tag_match([post1], "search:zzz") + assert_tag_match([post2], "search:uncategorized") + assert_tag_match([post2, post1], "search:all") end - should "return posts for a named metatag" do - SavedSearch.stubs(:update_listbooru_on_create) - post1 = FactoryGirl.create(:post, :tag_string => "aaa") - sub = FactoryGirl.create(:saved_search, :tag_query => "aaa", :name => "zzz", :user_id => CurrentUser.id) - SavedSearch.expects(:post_ids).returns([post1.id]) - relation = Post.tag_match("search:#{CurrentUser.name}:zzz") - assert_equal(1, relation.count) + should "return posts for a rating: metatag" do + s = FactoryGirl.create(:post, :rating => "s") + q = FactoryGirl.create(:post, :rating => "q") + e = FactoryGirl.create(:post, :rating => "e") + all = [e, q, s] + + assert_tag_match([s], "rating:s") + assert_tag_match([q], "rating:q") + assert_tag_match([e], "rating:e") + + assert_tag_match(all - [s], "-rating:s") + assert_tag_match(all - [q], "-rating:q") + assert_tag_match(all - [e], "-rating:e") end - should "return posts for a particular rating" do - post1 = FactoryGirl.create(:post, :rating => "s") - post2 = FactoryGirl.create(:post, :rating => "q") - post3 = FactoryGirl.create(:post, :rating => "e") - relation = Post.tag_match("rating:e") - assert_equal(1, relation.count) - assert_equal(post3.id, relation.first.id) + should "return posts for a locked: metatag" do + rating_locked = FactoryGirl.create(:post, is_rating_locked: true) + note_locked = FactoryGirl.create(:post, is_note_locked: true) + status_locked = FactoryGirl.create(:post, is_status_locked: true) + all = [status_locked, note_locked, rating_locked] + + assert_tag_match([rating_locked], "locked:rating") + assert_tag_match([note_locked], "locked:note") + assert_tag_match([status_locked], "locked:status") + + assert_tag_match(all - [rating_locked], "-locked:rating") + assert_tag_match(all - [note_locked], "-locked:note") + assert_tag_match(all - [status_locked], "-locked:status") end - should "return posts for a particular negated rating" do - post1 = FactoryGirl.create(:post, :rating => "s") - post2 = FactoryGirl.create(:post, :rating => "s") - post3 = FactoryGirl.create(:post, :rating => "e") - relation = Post.tag_match("-rating:s") - assert_equal(1, relation.count) - assert_equal(post3.id, relation.first.id) + should "return posts for a upvote:, downvote: metatag" do + CurrentUser.scoped(FactoryGirl.create(:mod_user)) do + upvoted = FactoryGirl.create(:post, tag_string: "upvote:self") + downvoted = FactoryGirl.create(:post, tag_string: "downvote:self") + + assert_tag_match([upvoted], "upvote:#{CurrentUser.name}") + assert_tag_match([downvoted], "downvote:#{CurrentUser.name}") + end end should "return posts ordered by a particular attribute" do - post1 = FactoryGirl.create(:post, :rating => "s") - post2 = FactoryGirl.create(:post, :rating => "s") - post3 = FactoryGirl.create(:post, :rating => "e", :score => 5, :image_width => 10_000) - relation = Post.tag_match("order:id") - assert_equal(post1.id, relation.first.id) - relation = Post.tag_match("order:mpixels") - assert_equal(post3.id, relation.first.id) - relation = Post.tag_match("order:landscape") - assert_equal(post3.id, relation.first.id) + posts = (1..2).map do |n| + p = FactoryGirl.create( + :post, + score: n, + fav_count: n, + file_size: 1.megabyte * n, + # posts[0] is portrait, posts[1] is landscape. posts[1].mpixels > posts[0].mpixels. + image_height: 100*n*n, + image_width: 100*(3-n)*n, + ) + + FactoryGirl.create(:artist_commentary, post: p) + FactoryGirl.create(:comment, post: p, do_not_bump_post: false) + FactoryGirl.create(:note, post: p) + p + end + + assert_tag_match(posts.reverse, "order:id_desc") + assert_tag_match(posts.reverse, "order:score") + assert_tag_match(posts.reverse, "order:favcount") + assert_tag_match(posts.reverse, "order:change") + assert_tag_match(posts.reverse, "order:comment") + assert_tag_match(posts.reverse, "order:comment_bumped") + assert_tag_match(posts.reverse, "order:note") + assert_tag_match(posts.reverse, "order:artcomm") + assert_tag_match(posts.reverse, "order:mpixels") + assert_tag_match(posts.reverse, "order:portrait") + assert_tag_match(posts.reverse, "order:filesize") + assert_tag_match(posts.reverse, "order:rank") + + assert_tag_match(posts, "order:id_asc") + assert_tag_match(posts, "order:score_asc") + assert_tag_match(posts, "order:favcount_asc") + assert_tag_match(posts, "order:change_asc") + assert_tag_match(posts, "order:comment_asc") + assert_tag_match(posts, "order:comment_bumped_asc") + assert_tag_match(posts, "order:artcomm_asc") + assert_tag_match(posts, "order:note_asc") + assert_tag_match(posts, "order:mpixels_asc") + assert_tag_match(posts, "order:landscape") + assert_tag_match(posts, "order:filesize_asc") end should "return posts for order:comment_bumped" do @@ -1805,21 +1976,23 @@ class PostTest < ActiveSupport::TestCase comment3 = FactoryGirl.create(:comment, :post => post3) end - assert_equal([post3.id, post1.id, post2.id], Post.tag_match("order:comment_bumped").map(&:id)) - assert_equal([post1.id, post3.id, post2.id], Post.tag_match("order:comment_bumped_asc").map(&:id)) + assert_tag_match([post3, post1, post2], "order:comment_bumped") + assert_tag_match([post1, post3, post2], "order:comment_bumped_asc") end should "return posts for a filesize search" do post = FactoryGirl.create(:post, :file_size => 1.megabyte) - assert_equal(1, Post.tag_match("filesize:1mb").count) - assert_equal(1, Post.tag_match("filesize:1000kb").count) - assert_equal(1, Post.tag_match("filesize:1048576b").count) + + assert_tag_match([post], "filesize:1mb") + assert_tag_match([post], "filesize:1000kb") + assert_tag_match([post], "filesize:1048576b") end should "not perform fuzzy matching for an exact filesize search" do post = FactoryGirl.create(:post, :file_size => 1.megabyte) - assert_equal(0, Post.tag_match("filesize:1048000b").count) - assert_equal(0, Post.tag_match("filesize:1048000").count) + + assert_tag_match([], "filesize:1048000b") + assert_tag_match([], "filesize:1048000") end should "fail for more than 6 tags" do @@ -2039,7 +2212,7 @@ class PostTest < ActiveSupport::TestCase context "a post that has been updated" do setup do - @post = FactoryGirl.create(:post, :rating => "q", :tag_string => "aaa") + @post = FactoryGirl.create(:post, :rating => "q", :tag_string => "aaa", :source => nil) @post.stubs(:merge_version?).returns(false) @post.update_attributes(:tag_string => "aaa bbb ccc ddd") @post.update_attributes(:tag_string => "bbb xxx yyy", :source => "xyz") diff --git a/test/unit/tag_test.rb b/test/unit/tag_test.rb index ce60e0311..a1e253d13 100644 --- a/test/unit/tag_test.rb +++ b/test/unit/tag_test.rb @@ -208,4 +208,14 @@ class TagTest < ActiveSupport::TestCase end end end + + context "A tag with a negative post count" do + should "be fixed" do + tag = FactoryGirl.create(:tag, name: "touhou", post_count: -10) + post = FactoryGirl.create(:post, tag_string: "touhou") + + Tag.clean_up_negative_post_counts! + assert_equal(1, tag.reload.post_count) + end + end end