spec/graphql/relay/relation_connection_spec.rb in graphql-1.5.15 vs spec/graphql/relay/relation_connection_spec.rb in graphql-1.6.0

- old
+ new

@@ -102,10 +102,29 @@ assert_equal(["Death Star", "Shield Generator", "Headquarters"], get_names(result)) assert_equal(false, result["data"]["empire"]["bases"]["pageInfo"]["hasNextPage"]) assert_equal(false, result["data"]["empire"]["bases"]["pageInfo"]["hasPreviousPage"]) end + it 'works with before and after specified together' do + result = star_wars_query(query_string, "first" => 2) + assert_equal(["Death Star", "Shield Generator"], get_names(result)) + + first_cursor = get_last_cursor(result) + + # There is no records between before and after if they point to the same cursor + result = star_wars_query(query_string, "before" => first_cursor, "after" => first_cursor, "last" => 2) + assert_equal([], get_names(result)) + + result = star_wars_query(query_string, "after" => first_cursor, "first" => 2) + assert_equal(["Headquarters"], get_names(result)) + + second_cursor = get_last_cursor(result) + + result = star_wars_query(query_string, "after" => first_cursor, "before" => second_cursor, "first" => 3) + assert_equal([], get_names(result)) + end + it 'handles cursors beyond the bounds of the array' do overreaching_cursor = Base64.strict_encode64("100") result = star_wars_query(query_string, "after" => overreaching_cursor, "first" => 2) assert_equal([], get_names(result)) end @@ -184,22 +203,23 @@ assert_equal(2, result["data"]["empire"]["bases"]["edges"].size) assert_equal(false, result["data"]["empire"]["bases"]["pageInfo"]["hasNextPage"], "hasNextPage is false when first is not specified") end it "applies to queries by `last`" do - last_cursor = "Ng==" second_to_last_two_names = ["Death Star", "Shield Generator"] + first_and_second_names = ["Yavin", "Echo Base"] + + last_cursor = "Ng==" result = star_wars_query(query_string, "last" => 100, "before" => last_cursor) assert_equal(second_to_last_two_names, get_names(result)) assert_equal(true, result["data"]["empire"]["bases"]["pageInfo"]["hasPreviousPage"]) result = star_wars_query(query_string, "before" => last_cursor) - assert_equal(second_to_last_two_names, get_names(result)) + assert_equal(first_and_second_names, get_names(result)) assert_equal(false, result["data"]["empire"]["bases"]["pageInfo"]["hasPreviousPage"], "hasPreviousPage is false when last is not specified") third_cursor = "Mw==" - first_and_second_names = ["Yavin", "Echo Base"] result = star_wars_query(query_string, "last" => 100, "before" => third_cursor) assert_equal(first_and_second_names, get_names(result)) result = star_wars_query(query_string, "before" => third_cursor) assert_equal(first_and_second_names, get_names(result)) @@ -397,7 +417,151 @@ it "is chosen for a relation" do relation = StarWars::Base.where(faction_id: 1) assert relation.is_a?(ActiveRecord::Relation) connection = GraphQL::Relay::BaseConnection.connection_for_nodes(relation) assert_equal GraphQL::Relay::RelationConnection, connection + end + + describe "for an ActiveRecord::Relation" do + describe "#edge_nodes" do + it "returns the nodes for the current page" do + # Offset + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2), {}) + assert_equal [StarWars::Base.find(3), StarWars::Base.find(4), StarWars::Base.find(5), StarWars::Base.find(6)], connection.edge_nodes, + + cursor1 = connection.cursor_from_node(StarWars::Base.find(3)) + cursor2 = connection.cursor_from_node(StarWars::Base.find(4)) + cursor3 = connection.cursor_from_node(StarWars::Base.find(5)) + cursor4 = connection.cursor_from_node(StarWars::Base.find(6)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2), { first: 3 }) + assert_equal [StarWars::Base.find(3), StarWars::Base.find(4), StarWars::Base.find(5)], connection.edge_nodes + + assert_equal cursor1, connection.cursor_from_node(StarWars::Base.find(3)) + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(4)) + assert_equal cursor3, connection.cursor_from_node(StarWars::Base.find(5)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2), { last: 3 }) + assert_equal [StarWars::Base.find(4), StarWars::Base.find(5), StarWars::Base.find(6)], connection.edge_nodes + + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(4)) + assert_equal cursor3, connection.cursor_from_node(StarWars::Base.find(5)) + assert_equal cursor4, connection.cursor_from_node(StarWars::Base.find(6)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2), { last: 2 }) + assert_equal [StarWars::Base.find(5), StarWars::Base.find(6)], connection.edge_nodes + + assert_equal cursor3, connection.cursor_from_node(StarWars::Base.find(5)) + assert_equal cursor4, connection.cursor_from_node(StarWars::Base.find(6)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2), { first: 3, last: 1 }) + assert_equal [StarWars::Base.find(5)], connection.edge_nodes + + assert_equal cursor3, connection.cursor_from_node(StarWars::Base.find(5)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2), { first: 2, last: 1 }) + assert_equal [StarWars::Base.find(4)], connection.edge_nodes + + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(4)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2), { after: cursor1 }) + assert_equal [StarWars::Base.find(4), StarWars::Base.find(5), StarWars::Base.find(6)], connection.edge_nodes + + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(4)) + assert_equal cursor3, connection.cursor_from_node(StarWars::Base.find(5)) + assert_equal cursor4, connection.cursor_from_node(StarWars::Base.find(6)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2), { after: cursor1, before: cursor1 }) + assert_equal [], connection.edge_nodes + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2), { after: cursor1, before: cursor3 }) + assert_equal [StarWars::Base.find(4)], connection.edge_nodes + + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(4)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2), { after: cursor1, before: cursor4 }) + assert_equal [StarWars::Base.find(4), StarWars::Base.find(5)], connection.edge_nodes + + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(4)) + assert_equal cursor3, connection.cursor_from_node(StarWars::Base.find(5)) + + + # Limit + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.limit(5), {}) + assert_equal [StarWars::Base.find(1), StarWars::Base.find(2), StarWars::Base.find(3), StarWars::Base.find(4), StarWars::Base.find(5)], connection.edge_nodes + + cursor1 = connection.cursor_from_node(StarWars::Base.find(1)) + cursor2 = connection.cursor_from_node(StarWars::Base.find(2)) + cursor3 = connection.cursor_from_node(StarWars::Base.find(3)) + cursor4 = connection.cursor_from_node(StarWars::Base.find(4)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.limit(5), { first: 2 }) + assert_equal [StarWars::Base.find(1), StarWars::Base.find(2)], connection.edge_nodes + + assert_equal cursor1, connection.cursor_from_node(StarWars::Base.find(1)) + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(2)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.limit(5), { first: 2, last: 1 }) + assert_equal [StarWars::Base.find(2)], connection.edge_nodes + + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(2)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.limit(5), { after: cursor2, first: 2 }) + assert_equal [StarWars::Base.find(3), StarWars::Base.find(4)], connection.edge_nodes + + assert_equal cursor3, connection.cursor_from_node(StarWars::Base.find(3)) + assert_equal cursor4, connection.cursor_from_node(StarWars::Base.find(4)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.limit(5), { after: cursor2, first: 2, last: 1 }) + assert_equal [StarWars::Base.find(4)], connection.edge_nodes + + assert_equal cursor4, connection.cursor_from_node(StarWars::Base.find(4)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.limit(5), { first: 2, last: 5 }) + assert_equal [StarWars::Base.find(1), StarWars::Base.find(2)], connection.edge_nodes + + assert_equal cursor1, connection.cursor_from_node(StarWars::Base.find(1)) + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(2)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.limit(5), { first: 1, last: 5 }) + assert_equal [StarWars::Base.find(1)], connection.edge_nodes + + assert_equal cursor1, connection.cursor_from_node(StarWars::Base.find(1)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.limit(5), { after: cursor1, before: cursor1 }) + assert_equal [], connection.edge_nodes + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.limit(5), { after: cursor1, before: cursor3 }) + assert_equal [StarWars::Base.find(2)], connection.edge_nodes + + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(2)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.limit(5), { after: cursor1, before: cursor4 }) + assert_equal [StarWars::Base.find(2), StarWars::Base.find(3)], connection.edge_nodes + + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(2)) + assert_equal cursor3, connection.cursor_from_node(StarWars::Base.find(3)) + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.limit(5), { last: 2, before: cursor4 }) + assert_equal [StarWars::Base.find(2), StarWars::Base.find(3)], connection.edge_nodes + + assert_equal cursor2, connection.cursor_from_node(StarWars::Base.find(2)) + assert_equal cursor3, connection.cursor_from_node(StarWars::Base.find(3)) + + + # Limit and offset + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2).limit(3), { first: 2 }) + assert_equal [StarWars::Base.find(3), StarWars::Base.find(4)], connection.edge_nodes + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2).limit(3), { first: 2, last: 1 }) + assert_equal [StarWars::Base.find(4)], connection.edge_nodes + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2).limit(3), { first: 2, last: 5 }) + assert_equal [StarWars::Base.find(3), StarWars::Base.find(4)], connection.edge_nodes + + connection = GraphQL::Relay::RelationConnection.new(StarWars::Base.offset(2).limit(3), { first: 1, last: 5 }) + assert_equal [StarWars::Base.find(3)], connection.edge_nodes + + end + end end end