Feature: link_to helper

  Scenario: link_to produces relative links
    Given a fixture app "indexable-app"
    And an empty file named "config.rb"
    And a file named "source/link_to.html.erb" with:
    """
    absolute: <%= link_to "Needs Index", "/needs_index.html", :relative => true %>
    relative: <%= link_to "Relative", "needs_index.html", :relative => true %>
    """
    And a file named "source/link_to/sub.html.erb" with:
    """
    absolute: <%= link_to "Needs Index", "/needs_index.html", :relative => true %>
    relative: <%= link_to "Relative", "../needs_index.html", :relative => true %>
    """
    And the Server is running at "indexable-app"
    When I go to "/link_to.html"
    Then I should see 'absolute: <a href="needs_index.html">Needs Index</a>'
    Then I should see 'relative: <a href="needs_index.html">Relative</a>'
    When I go to "/link_to/sub.html"
    Then I should see 'absolute: <a href="../needs_index.html">Needs Index</a>'
    Then I should see 'relative: <a href="../needs_index.html">Relative</a>'

  Scenario: link_to relative works with strip_index_file
    Given a fixture app "indexable-app"
    And a file named "config.rb" with:
    """
    set :relative_links, true
    set :strip_index_file, true
    helpers do
      def menu_items(path='link_to.html')
        sitemap.find_resource_by_destination_path(path).children
      end
    end
    """
    And a file named "source/link_to.html.erb" with:
    """
    <% menu_items.each do |item| %>
        <%= link_to(item.metadata[:page]['title'], item.url) %>
        <%= link_to(item.metadata[:page]['title'], item) %>
    <% end %>
    """
    And a file named "source/link_to/sub.html.erb" with:
    """
    <% menu_items.each do |item| %>
        <%= link_to(item.metadata[:page]['title'], item.url) %>
        <%= link_to(item.metadata[:page]['title'], item) %>
    <% end %>
    """
    And the Server is running at "indexable-app"
    When I go to "/link_to.html"
    Then I should see '"link_to/sub.html"'
    Then I should not see "/link_to/sub.html"
    When I go to "/link_to/sub.html"
    Then I should see '"sub.html"'
    Then I should not see "/link_to/sub.html"

  Scenario: link_to produces relative links when :relative_links is set to true
    Given a fixture app "indexable-app"
    And a file named "config.rb" with:
    """
    set :relative_links, true
    """
    And a file named "source/link_to.html.erb" with:
    """
    absolute: <%= link_to "Needs Index", "/needs_index.html" %>
    relative: <%= link_to "Relative", "needs_index.html", :relative => false %>
    unknown: <%= link_to "Unknown", "foo.html" %>
    """
    And a file named "source/link_to/sub.html.erb" with:
    """
    absolute: <%= link_to "Needs Index", "/needs_index.html" %>
    relative: <%= link_to "Relative", "../needs_index.html" %>
    """
    And the Server is running at "indexable-app"
    When I go to "/link_to.html"
    Then I should see 'absolute: <a href="needs_index.html">Needs Index</a>'
    Then I should see 'relative: <a href="/needs_index.html">Relative</a>'
    Then I should see 'unknown: <a href="foo.html">Unknown</a>'
    When I go to "/link_to/sub.html"
    Then I should see 'absolute: <a href="../needs_index.html">Needs Index</a>'
    Then I should see 'relative: <a href="../needs_index.html">Relative</a>'
  
  Scenario: link_to knows about directory indexes
    Given a fixture app "indexable-app"
    And a file named "source/link_to.html.erb" with:
    """
    absolute: <%= link_to "Needs Index", "/needs_index.html", :relative => true %>
    relative: <%= link_to "Relative", "needs_index.html", :relative => true %>
    """
    And a file named "source/link_to/sub.html.erb" with:
    """
    absolute: <%= link_to "Needs Index", "/needs_index.html", :relative => true %>
    relative: <%= link_to "Relative", "../needs_index.html", :relative => true %>
    """
    And the Server is running at "indexable-app"
    When I go to "/link_to/"
    Then I should see 'absolute: <a href="../needs_index/">Needs Index</a>'
    Then I should see 'relative: <a href="../needs_index/">Relative</a>'
    When I go to "/link_to/sub/"
    Then I should see 'absolute: <a href="../../needs_index/">Needs Index</a>'
    Then I should see 'relative: <a href="../../needs_index/">Relative</a>'

  Scenario: link_to can take a Resource
    Given a fixture app "indexable-app"
    And a file named "source/link_to.html.erb" with:
    """
    <%= link_to "Needs Index", sitemap.find_resource_by_path("/needs_index.html") %>
    """
    And the Server is running at "indexable-app"
    When I go to "/link_to/"
    Then I should see '<a href="/needs_index/">Needs Index</a>'

  Scenario: Setting http_prefix
    Given a fixture app "indexable-app"
    And a file named "config.rb" with:
    """
    set :http_prefix, "/foo"
    """
    And a file named "source/link_to.html.erb" with:
    """
    <%= link_to "Needs Index", "/needs_index.html" %>
    """
    And the Server is running at "indexable-app"
    When I go to "/link_to.html"
    Then I should see '<a href="/foo/needs_index.html">Needs Index</a>'

  Scenario: link_to preserves query string and anchor and isn't messed up by them
    Given a fixture app "indexable-app"
    And a file named "source/link_to.html.erb" with:
    """
    <%= link_to "Needs Index Anchor", "/needs_index.html#foo" %>
    <%= link_to "Needs Index Query", "/needs_index.html?foo" %>
    <%= link_to "Needs Index Query and Anchor", "/needs_index.html?foo#foo" %>
    """
    And the Server is running at "indexable-app"
    When I go to "/link_to/"
    Then I should see '<a href="/needs_index/#foo">Needs Index Anchor</a>'
    Then I should see '<a href="/needs_index/?foo">Needs Index Query</a>'
    Then I should see '<a href="/needs_index/?foo#foo">Needs Index Query and Anchor</a>'

  Scenario: link_to accepts a :query option that appends a query string
    Given a fixture app "indexable-app"
    And a file named "source/link_to.html.erb" with:
    """
    <%= link_to "Needs Index String", "/needs_index.html", :query => "foo" %>
    <%= link_to "Needs Index Hash", "/needs_index.html", :query => { :foo => :bar } %>
    """
    And the Server is running at "indexable-app"
    When I go to "/link_to/"
    Then I should see '<a href="/needs_index/?foo">Needs Index String</a>'
    Then I should see '<a href="/needs_index/?foo=bar">Needs Index Hash</a>'