Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
activeadmin / spec / unit / views / tabbed_navigation_spec.rb
Size: Mime:
require 'rails_helper'

include ActiveAdmin
describe ActiveAdmin::Views::TabbedNavigation do

  let(:menu){ ActiveAdmin::Menu.new }

  let(:assigns){ { active_admin_menu: menu } }
  let(:helpers){ mock_action_view }

  let(:tabbed_navigation) do
    arbre(assigns, helpers) {
      insert_tag(ActiveAdmin::Views::TabbedNavigation, active_admin_menu)
    }.children.first
  end

  let(:html) { Capybara.string(tabbed_navigation.to_s) }

  before do
    allow(helpers).to receive(:admin_logged_in?).and_return(false)
  end

  describe "rendering a menu" do

    before do
      menu.add label: "Blog Posts", url: :admin_posts_path

      menu.add label: "Reports", url: "/admin/reports" do |reports|
        reports.add label: "A Sub Reports", url: "/admin/a-sub-reports"
        reports.add label: "B Sub Reports", url: "/admin/b-sub-reports"
        reports.add label: proc{ "Label Proc Sub Reports" }, url: "/admin/label-proc-sub-reports", id: "Label Proc Sub Reports"
      end

      menu.add label: "Administration", url: "/admin/administration" do |administration|
        administration.add label: "User administration",
                           url: '/admin/user-administration',
                           priority: 10,
                           if: proc { false }
      end

      menu.add label: "Management", url: "#" do |management|
        management.add label: "Order management",
                       url: '/admin/order-management',
                       priority: 10,
                       if: proc { false }
        management.add label: "Bill management",
                       url: '/admin/bill-management',
                       priority: 10,
                       if: :admin_logged_in?
      end

      menu.add label: "Charles Smith", id: "current_user", url: -> { nil }
    end

    it "should generate a ul" do
      expect(html).to have_selector("ul")
    end

    it "should generate an li for each item" do
      expect(html).to have_selector("ul > li")
    end

    it "should generate a link for each item" do
      expect(html).to have_selector("a[href='/admin/posts']", text: "Blog Posts")
    end

    it "should generate a nested list for children" do
      expect(html).to have_selector("li > ul")
    end

    it "should generate a nested list with li for each child" do
      expect(html).to have_selector("ul > li#a_sub_reports")
      expect(html).to have_selector("ul > li#b_sub_reports")
    end

    it "should generate a valid id from a label proc" do
      expect(html).to have_selector("ul > li#label_proc_sub_reports")
    end

    it "should not generate a link for user administration" do
      expect(html).to_not have_selector("a[href='/admin/user-administration']", text: "User administration")
    end

    it "should generate the administration parent menu" do
      expect(html).to have_selector("a[href='/admin/administration']", text: "Administration")
    end

    it "should not generate a link for order management" do
      expect(html).to_not have_selector("a[href='/admin/order-management']", text: "Order management")
    end

    it "should not generate a link for bill management" do
      expect(html).to_not have_selector("a[href='/admin/bill-management']", text: "Bill management")
    end

    it "should not generate the management parent menu" do
      expect(html).to_not have_selector("a[href='#']", text: "Management")
    end

    context "when url is nil" do
      it "should generate a span" do
        selector = "li#current_user > span"
        expect(html).to have_selector(selector, text: "Charles Smith")
      end
    end

    describe "marking current item" do

      it "should add the 'current' class to the li" do
        assigns[:current_tab] = menu["Blog Posts"]
        expect(html).to have_selector("li.current")
      end

      it "should add the 'current' and 'has_nested' classes to the li and 'current' to the sub li" do
        assigns[:current_tab] = menu["Reports"]["A Sub Reports"]
        expect(html).to have_selector("li#reports.current")
        expect(html).to have_selector("li#reports.has_nested")
        expect(html).to have_selector("li#a_sub_reports.current")
      end

    end

  end

  describe "returning the menu items to display" do

    it "should return one item with no if block" do
      menu.add label: "Hello World", url: "/"
      expect(tabbed_navigation.menu_items).to eq menu.items
    end

    it "should not include menu items with an if block that returns false" do
      menu.add label: "Don't Show", url: "/", priority: 10, if: proc{ false }
      expect(tabbed_navigation.menu_items).to be_empty
    end

    it "should not include menu items with an if block that calls a method that returns false" do
      menu.add label: "Don't Show", url: "/", priority: 10, if: :admin_logged_in?
      expect(tabbed_navigation.menu_items).to be_empty
    end

    it "should not display any items that have no children to display" do
      menu.add label: "Parent", url: "#" do |p|
        p.add label: "Child", url: "/", priority: 10, if: proc{ false }
      end
      expect(tabbed_navigation.menu_items).to be_empty
    end

    it "should display a parent that has a child to display" do
      menu.add label: "Parent", url: "#" do |p|
        p.add label: "Hidden Child", url: "/", priority: 10, if: proc{ false }
        p.add label: "Child", url: "/"
      end
      expect(tabbed_navigation.menu_items.size).to eq(1)
    end

  end
end