require "spec_helper"

describe GraphQL::Relay::PageInfo do
  def get_page_info(result)
    result["data"]["empire"]["bases"]["pageInfo"]
  end

  def get_last_cursor(result)
    result["data"]["empire"]["bases"]["edges"].last["cursor"]
  end

  let(:cursor_of_last_base) {
    result = query(query_string, "first" => 3)
    last_cursor = get_last_cursor(result)
  }

  let(:query_string) {%|
    query getShips($first: Int, $after: String, $last: Int, $before: String, $order: String, $nameIncludes: String){
      empire {
        bases(first: $first, after: $after, last: $last, before: $before, order: $order, nameIncludes: $nameIncludes) {
          edges {
            cursor
          }
          pageInfo {
            hasNextPage
            hasPreviousPage
          }
        }
      }
    }
  |}

  describe 'hasNextPage / hasPreviousPage' do
    it "hasNextPage is true if there are more items" do
      result = query(query_string, "first" => 2)
      assert_equal(true, get_page_info(result)["hasNextPage"])
      assert_equal(false, get_page_info(result)["hasPreviousPage"], "hasPreviousPage is false if 'last' is missing")

      last_cursor = get_last_cursor(result)
      result = query(query_string, "first" => 100, "after" => last_cursor)
      assert_equal(false, get_page_info(result)["hasNextPage"])
      assert_equal(false, get_page_info(result)["hasPreviousPage"])
    end

    it "hasPreviousPage if there are more items" do
      result = query(query_string, "last" => 100, "before" => cursor_of_last_base)
      assert_equal(false, get_page_info(result)["hasNextPage"])
      assert_equal(false, get_page_info(result)["hasPreviousPage"])

      result = query(query_string, "last" => 1, "before" => cursor_of_last_base)
      assert_equal(false, get_page_info(result)["hasNextPage"])
      assert_equal(true, get_page_info(result)["hasPreviousPage"])
    end


    it "has both if first and last are present" do
      result = query(query_string, "last" => 1, "first" => 1, "before" => cursor_of_last_base)
      assert_equal(true, get_page_info(result)["hasNextPage"])
      assert_equal(true, get_page_info(result)["hasPreviousPage"])
    end
  end



end