# frozen_string_literal: true
require 'test_helper'

module Admin
  class CommentControllerTest < ActionDispatch::IntegrationTest
    include ActiveJob::TestHelper

    test "should post update" do
      auth_manager
      comment = quiz_comments(:com5)
      post admin_update_comment_url(test_hash: comment.test_hash, id: comment.id),
           params: { quiz_comment: { message: 'updated comment' } }

      assert_redirected_to admin_result_url(test_hash: comment.test_hash)
      assert flash[:success]
      refute_equal comment.message, QuizComment.find_by(id: comment.id).message
    end

    test "should require message to update" do
      auth_manager
      comment = quiz_comments(:com5)
      post admin_update_comment_url(test_hash: comment.test_hash, id: comment.id),
           params: { quiz_comment: { message: '' } }

      assert_redirected_to admin_result_url(test_hash: comment.test_hash)
      assert flash[:error]
      assert_equal comment.message, QuizComment.find_by(id: comment.id).message
    end

    test "should post create" do
      auth_reviewer
      candidate = candidates(:stacy)

      assert_difference("QuizComment.count") do
        post admin_create_comment_url(test_hash: candidate.test_hash),
             params: { quiz_comment: { message: 'this is a test comment' } }
      end

      assert_redirected_to admin_result_url(test_hash: candidate.test_hash)
      assert flash[:success]
    end

    test "admin can post comment" do
      auth_admin
      candidate = candidates(:stacy)

      assert_difference("QuizComment.count") do
        post admin_create_comment_url(test_hash: candidate.test_hash),
             params: { quiz_comment: { message: 'this is an admin comment' } }
      end

      assert_redirected_to admin_result_url(test_hash: candidate.test_hash)
      assert flash[:success]
    end

    test "should queue emails on create" do
      auth_reviewer
      candidate = candidates(:stacy)

      assert_enqueued_jobs 1 do
        assert_difference("QuizComment.count", 1) do
          post admin_create_comment_url(test_hash: candidate.test_hash),
               params: { quiz_comment: { message: 'this is a test comment' } }
        end
      end
    end

    test "should require comment to create" do
      auth_reviewer
      candidate = candidates(:stacy)

      assert_difference("QuizComment.count", 0) do
        post admin_create_comment_url(test_hash: candidate.test_hash),
             params: { quiz_comment: { message: '' } }
      end

      assert_redirected_to admin_result_url(test_hash: candidate.test_hash)
      assert flash[:error]
    end

    test "should not edit others comments" do
      auth_reviewer
      comment = quiz_comments(:com5)
      post admin_update_comment_url(test_hash: comment.test_hash, id: comment.id),
           params: { quiz_comment: { message: 'updated comment' } }

      assert_redirected_to admin_login_url
      assert_equal comment.message, QuizComment.find_by(id: comment.id).message
    end

    test "can not comment on Gustov" do
      auth_reviewer
      candidate = candidates(:gustov)

      assert_difference("QuizComment.count", 0) do
        post admin_create_comment_url(test_hash: candidate.test_hash),
             params: { quiz_comment: { message: 'this is a test comment' } }
      end

      assert_redirected_to admin_login_url
    end
  end
end
