require 'test_helper'

class PostApprovalsControllerTest < ActionDispatch::IntegrationTest
  context "The post approvals controller" do
    setup do
      @approver = create(:approver, name: "eiki")
    end

    context "create action" do
      context "for a pending post" do
        should "approve the post" do
          @post = create(:post, is_pending: true)
          post_auth post_approvals_path(post_id: @post.id, format: :js), @approver

          assert_response :success
          assert(!@post.reload.is_pending?)
        end
      end

      context "for a deleted post" do
        should "undelete the post" do
          @post = create(:post, is_deleted: true)
          post_auth post_approvals_path(post_id: @post.id, format: :js), @approver

          assert_response :success
          assert(!@post.reload.is_deleted?)
        end
      end

      context "for an appealed post" do
        should "undelete the post and mark the appeal as successful" do
          @appeal = create(:post_appeal)
          post_auth post_approvals_path(post_id: @appeal.post_id, format: :js), @approver

          assert_response :success
          assert_equal(false, @appeal.reload.post.is_deleted?)
          assert_equal(true, @appeal.succeeded?)
        end
      end

      context "for a flagged post" do
        should "approve the post and mark the flag as rejected" do
          @flag = create(:post_flag)
          post_auth post_approvals_path(post_id: @flag.post_id, format: :js), @approver

          assert_response :success
          assert_equal(false, @flag.reload.post.is_deleted?)
          assert_equal(false, @flag.post.is_flagged?)
          assert_equal(true, @flag.rejected?)
        end
      end

      should "not allow non-approvers to approve posts" do
        @post = create(:post, is_pending: true)
        post_auth post_approvals_path(post_id: @post.id, format: :js), create(:user)

        assert_response 403
        assert_equal(true, @post.reload.is_pending?)
      end
    end

    context "index action" do
      setup do
        @post = create(:post, tag_string: "touhou", is_pending: true, uploader: build(:user, name: "komachi", created_at: 2.weeks.ago))
        @post_approval = create(:post_approval, post: @post)
        @user_approval = create(:post_approval, user: @approver)
        @unrelated_approval = create(:post_approval)
      end

      should "render" do
        get post_approvals_path
        assert_response :success
      end

      should respond_to_search({}).with { [@unrelated_approval, @user_approval, @post_approval] }

      context "using includes" do
        should respond_to_search(user_name: "eiki").with { @user_approval }
        should respond_to_search(post_tags_match: "touhou").with { @post_approval }
        should respond_to_search(post: {uploader_name: "komachi"}).with { @post_approval }
      end
    end

    context "show action" do
      setup do
        @approval = create(:post_approval)
      end

      should "render for html" do
        get post_approval_path(@approval)

        assert_redirected_to post_approvals_path(search: { id: @approval.id })
      end

      should "render for json" do
        get post_approval_path(@approval), as: :json

        assert_response :success
      end
    end
  end
end
