require "test_helper"

class UserRolesHelperTest < ActionView::TestCase
  attr_accessor :current_user

  def test_role_icon_normal
    self.current_user = create(:user)

    icon = role_icon(current_user, "moderator")
    assert_dom_equal "", icon

    icon = role_icon(current_user, "importer")
    assert_dom_equal "", icon

    icon = role_icon(create(:moderator_user), "moderator")
    icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
    assert_dom icon_dom, "svg:root", :count => 1 do
      assert_dom "> title", :text => "This user is a moderator"
    end

    icon = role_icon(create(:importer_user), "importer")
    icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
    assert_dom icon_dom, "svg:root", :count => 1 do
      assert_dom "> title", :text => "This user is a importer"
    end
  end

  def test_role_icon_administrator
    self.current_user = create(:administrator_user)

    create(:user) do |user|
      icon = role_icon(user, "moderator")
      icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
      assert_dom icon_dom, "a:root[href='#{grant_role_path(user, 'moderator')}']", :count => 1 do
        assert_dom "> svg", :count => 1 do
          assert_dom "> title", :text => "Grant moderator access"
        end
      end

      icon = role_icon(user, "importer")
      icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
      assert_dom icon_dom, "a:root[href='#{grant_role_path(user, 'importer')}']", :count => 1 do
        assert_dom "> svg", :count => 1 do
          assert_dom "> title", :text => "Grant importer access"
        end
      end
    end

    create(:moderator_user) do |user|
      icon = role_icon(user, "moderator")
      icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
      assert_dom icon_dom, "a:root[href='#{revoke_role_path(user, 'moderator')}']", :count => 1 do
        assert_dom "> svg", :count => 1 do
          assert_dom "> title", :text => "Revoke moderator access"
        end
      end

      icon = role_icon(user, "importer")
      icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
      assert_dom icon_dom, "a:root[href='#{grant_role_path(user, 'importer')}']", :count => 1 do
        assert_dom "> svg", :count => 1 do
          assert_dom "> title", :text => "Grant importer access"
        end
      end
    end

    create(:importer_user) do |user|
      icon = role_icon(user, "moderator")
      icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
      assert_dom icon_dom, "a:root[href='#{grant_role_path(user, 'moderator')}']", :count => 1 do
        assert_dom "> svg", :count => 1 do
          assert_dom "> title", :text => "Grant moderator access"
        end
      end

      icon = role_icon(user, "importer")
      icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
      assert_dom icon_dom, "a:root[href='#{revoke_role_path(user, 'importer')}']", :count => 1 do
        assert_dom "> svg", :count => 1 do
          assert_dom "> title", :text => "Revoke importer access"
        end
      end
    end
  end

  def test_role_icons_normal
    self.current_user = create(:user)

    icons = role_icons(current_user)
    assert_dom_equal "", icons

    icons = role_icons(create(:moderator_user))
    icons_dom = Rails::Dom::Testing.html_document_fragment.parse(icons)
    assert_dom icons_dom, "svg:root > title", :text => "This user is a moderator"

    icons = role_icons(create(:importer_user))
    icons_dom = Rails::Dom::Testing.html_document_fragment.parse(icons)
    assert_dom icons_dom, "svg:root > title", :text => "This user is a importer"

    icons = role_icons(create(:super_user))
    icons_dom = Rails::Dom::Testing.html_document_fragment.parse(icons)
    assert_dom icons_dom, "svg:root", :count => 3 do
      assert_dom "> title", :text => "This user is an administrator"
      assert_dom "> title", :text => "This user is a moderator"
      assert_dom "> title", :text => "This user is a importer"
    end
  end

  def test_role_icons_administrator
    self.current_user = create(:administrator_user)

    create(:user) do |user|
      icons = role_icons(user)
      icons_dom = Rails::Dom::Testing.html_document_fragment.parse(icons)
      assert_dom icons_dom, "a:root", :count => 3
      assert_dom icons_dom, "a:root[href='#{grant_role_path(user, 'administrator')}']" do
        assert_dom "> svg > title", :text => "Grant administrator access"
      end
      assert_dom icons_dom, "a:root[href='#{grant_role_path(user, 'moderator')}']" do
        assert_dom "> svg > title", :text => "Grant moderator access"
      end
      assert_dom icons_dom, "a:root[href='#{grant_role_path(user, 'importer')}']" do
        assert_dom "> svg > title", :text => "Grant importer access"
      end
    end

    create(:moderator_user) do |user|
      icons = role_icons(user)
      icons_dom = Rails::Dom::Testing.html_document_fragment.parse(icons)
      assert_dom icons_dom, "a:root", :count => 3
      assert_dom icons_dom, "a:root[href='#{grant_role_path(user, 'administrator')}']" do
        assert_dom "> svg > title", :text => "Grant administrator access"
      end
      assert_dom icons_dom, "a:root[href='#{revoke_role_path(user, 'moderator')}']" do
        assert_dom "> svg > title", :text => "Revoke moderator access"
      end
      assert_dom icons_dom, "a:root[href='#{grant_role_path(user, 'importer')}']" do
        assert_dom "> svg > title", :text => "Grant importer access"
      end
    end

    create(:importer_user) do |user|
      icons = role_icons(user)
      icons_dom = Rails::Dom::Testing.html_document_fragment.parse(icons)
      assert_dom icons_dom, "a:root", :count => 3
      assert_dom icons_dom, "a:root[href='#{grant_role_path(user, 'administrator')}']" do
        assert_dom "> svg > title", :text => "Grant administrator access"
      end
      assert_dom icons_dom, "a:root[href='#{grant_role_path(user, 'moderator')}']" do
        assert_dom "> svg > title", :text => "Grant moderator access"
      end
      assert_dom icons_dom, "a:root[href='#{revoke_role_path(user, 'importer')}']" do
        assert_dom "> svg > title", :text => "Revoke importer access"
      end
    end

    create(:super_user) do |user|
      icons = role_icons(user)
      icons_dom = Rails::Dom::Testing.html_document_fragment.parse(icons)
      assert_dom icons_dom, "a:root", :count => 3
      assert_dom icons_dom, "a:root[href='#{revoke_role_path(user, 'administrator')}']" do
        assert_dom "> svg > title", :text => "Revoke administrator access"
      end
      assert_dom icons_dom, "a:root[href='#{revoke_role_path(user, 'moderator')}']" do
        assert_dom "> svg > title", :text => "Revoke moderator access"
      end
      assert_dom icons_dom, "a:root[href='#{revoke_role_path(user, 'importer')}']" do
        assert_dom "> svg > title", :text => "Revoke importer access"
      end
    end
  end
end
