Files
danbooru/test/functional/forum_posts_controller_test.rb
evazion b4ce2d83a6 models: remove belongs_to_creator macro.
The belongs_to_creator macro was used to initialize the creator_id field
to the CurrentUser. This made tests complicated because it meant you had
to create and set the current user every time you wanted to create an
object, when lead to the current user being set over and over again. It
also meant you had to constantly be aware of what the CurrentUser was in
many different contexts, which was often confusing. Setting creators
explicitly simplifies everything greatly.
2020-01-21 00:09:38 -06:00

176 lines
5.4 KiB
Ruby

require 'test_helper'
class ForumPostsControllerTest < ActionDispatch::IntegrationTest
context "The forum posts controller" do
setup do
@user = create(:user)
@other_user = create(:user)
@mod = create(:moderator_user)
@forum_topic = as(@user) { create(:forum_topic, title: "my forum topic", creator: @user) }
@forum_post = as(@user) { create(:forum_post, creator: @user, topic: @forum_topic, body: "alias xxx -> yyy") }
end
context "with votes" do
setup do
as_user do
@tag_alias = create(:tag_alias, forum_post: @forum_post, status: "pending")
@vote = create(:forum_post_vote, forum_post: @forum_post, score: 1)
@forum_post.reload
end
end
should "render the vote links" do
get_auth forum_topic_path(@forum_topic), @mod
assert_select "a[title='Vote up']"
end
should "render existing votes" do
get_auth forum_topic_path(@forum_topic), @mod
assert_select "li.vote-score-up"
end
context "after the alias is rejected" do
setup do
as(@mod) do
@tag_alias.reject!
end
get_auth forum_topic_path(@forum_topic), @mod
end
should "hide the vote links" do
assert_select "a[title='Vote up']", false
end
should "still render existing votes" do
assert_select "li.vote-score-up"
end
end
end
context "index action" do
should "list all forum posts" do
get forum_posts_path
assert_response :success
end
context "with search conditions" do
should "list all matching forum posts" do
get forum_posts_path, params: { search: { body_matches: "xxx", topic_title_matches: "my forum topic" }}
assert_response :success
assert_select "#forum-post-#{@forum_post.id}"
end
should "list nothing for when the search matches nothing" do
get forum_posts_path, params: {:search => {:body_matches => "bababa"}}
assert_response :success
assert_select "#forum-post-#{@forum_post.id}", false
end
should "list by creator id" do
get forum_posts_path, params: {:search => {:creator_id => @user.id}}
assert_response :success
assert_select "#forum-post-#{@forum_post.id}"
end
end
context "with private topics" do
setup do
as(@mod) do
@mod_topic = create(:mod_up_forum_topic, creator: @mod)
@mod_posts = create_list(:forum_post, 2, topic: @mod_topic, creator: @mod)
end
@mod_post_ids = ([@forum_post] + @mod_posts).map(&:id).reverse
end
should "list only permitted posts for members" do
get forum_posts_path
assert_response :success
assert_select "#forum-post-#{@forum_post.id}"
assert_select "#forum-post-#{@mod_posts[0].id}", false
end
should "list only permitted posts for mods" do
get_auth forum_posts_path, @mod
assert_response :success
assert_select "#forum-post-#{@mod_posts[0].id}"
end
end
end
context "show action" do
should "raise an error if the user doesn't have permission to view the topic" do
as(@user) { @forum_post.topic.update(min_level: User::Levels::ADMIN) }
get_auth forum_post_path(@forum_post), @user
assert_response 403
end
should "redirect to the forum topic" do
get forum_post_path(@forum_post)
assert_redirected_to forum_topic_path(@forum_post.topic, anchor: "forum_post_#{@forum_post.id}")
end
end
context "edit action" do
should "render if the editor is the creator of the topic" do
get_auth edit_forum_post_path(@forum_post), @user
assert_response :success
end
should "render if the editor is a moderator" do
get_auth edit_forum_post_path(@forum_post), @mod
assert_response :success
end
should "fail if the editor is not the creator of the topic and is not a moderator" do
get_auth edit_forum_post_path(@forum_post), @other_user
assert_response(403)
end
end
context "new action" do
should "render" do
get_auth new_forum_post_path, @user, params: {:topic_id => @forum_topic.id}
assert_response :success
end
end
context "create action" do
should "create a new forum post" do
assert_difference("ForumPost.count", 1) do
post_auth forum_posts_path, @user, params: {:forum_post => {:body => "xaxaxa", :topic_id => @forum_topic.id}}
end
forum_post = ForumPost.last
assert_redirected_to(forum_topic_path(@forum_topic))
end
end
context "destroy action" do
should "destroy the posts" do
delete_auth forum_post_path(@forum_post), @mod
assert_redirected_to(forum_post_path(@forum_post))
@forum_post.reload
assert_equal(true, @forum_post.is_deleted?)
end
end
context "undelete action" do
setup do
as(@mod) do
@forum_post.update(is_deleted: true)
end
end
should "restore the post" do
post_auth undelete_forum_post_path(@forum_post), @mod
assert_redirected_to(forum_post_path(@forum_post))
@forum_post.reload
assert_equal(false, @forum_post.is_deleted?)
end
end
end
end