require "test_helper"

module Issues
  class DataControllerTest < ActionDispatch::IntegrationTest
    ##
    # test all routes which lead to this controller
    def test_routes
      assert_routing(
        { :path => "/issues/1/reporters", :method => :get },
        { :controller => "issues/reporters", :action => "index", :issue_id => "1" }
      )
    end

    def test_index_missing_issue_as_moderator
      session_for(create(:moderator_user))
      get issue_reporters_path(999111)

      assert_redirected_to :controller => "/errors", :action => :not_found
    end

    def test_index_missing_issue_as_administrator
      session_for(create(:administrator_user))
      get issue_reporters_path(999111)

      assert_redirected_to :controller => "/errors", :action => :not_found
    end

    def test_index_assigned_to_moderator_as_unauthorized
      issue = create(:issue, :assigned_role => "moderator")

      get issue_reporters_path(issue)

      assert_redirected_to login_path(:referer => issue_reporters_path(issue))
    end

    def test_index_assigned_to_moderator_as_regular_user
      issue = create(:issue, :assigned_role => "moderator")

      session_for(create(:user))
      get issue_reporters_path(issue)

      assert_redirected_to :controller => "/errors", :action => :forbidden
    end

    def test_index_assigned_to_moderator_as_administrator
      issue = create(:issue, :assigned_role => "moderator")

      session_for(create(:administrator_user))
      get issue_reporters_path(issue)

      assert_redirected_to :controller => "/errors", :action => :not_found
    end

    def test_index_assigned_to_moderator_as_moderator
      issue = create(:issue, :assigned_role => "moderator")

      session_for(create(:moderator_user))
      get issue_reporters_path(issue)

      assert_response :success
    end

    def test_index_assigned_to_administrator_as_unauthorized
      issue = create(:issue, :assigned_role => "administrator")

      get issue_reporters_path(issue)

      assert_redirected_to login_path(:referer => issue_reporters_path(issue))
    end

    def test_index_assigned_to_administrator_as_regular_user
      issue = create(:issue, :assigned_role => "administrator")

      session_for(create(:user))
      get issue_reporters_path(issue)

      assert_redirected_to :controller => "/errors", :action => :forbidden
    end

    def test_index_assigned_to_administrator_as_moderator
      issue = create(:issue, :assigned_role => "administrator")

      session_for(create(:moderator_user))
      get issue_reporters_path(issue)

      assert_redirected_to :controller => "/errors", :action => :not_found
    end

    def test_index_assigned_to_administrator_as_administrator
      issue = create(:issue, :assigned_role => "administrator")

      session_for(create(:administrator_user))
      get issue_reporters_path(issue)

      assert_response :success
    end
  end
end
