public async Task Reads_All_Pages()
            {
                int page = 0;

                string CreateComment(int index)
                {
                    return(@"
                { 
                  id: ""comment" + index + @""",
                  body: ""comment " + index + @""" 
                }");
                }

                string CreateIssue(int number, int commentCount, bool hasNextPage)
                {
                    return(@"
          {
            id: ""issue" + number + @""",
            number: " + number + @",
            comments: {
              ""pageInfo"": {
                ""hasNextPage"": " + hasNextPage.ToString().ToLower() + @",
                ""endCursor"": """ + "comment_end" + number + @"""
              },
              ""nodes"": [" +
                           string.Join(",", Enumerable.Range(number * 10, commentCount).Select(x => CreateComment(x))) + @"
              ]
            }
          }");
                }

                string Execute(string query, IDictionary <string, string> variables)
                {
                    switch (page++)
                    {
                    case 0:
                        Assert.Null(variables);
                        return(@"{
  data: {
    ""repository"": {
      ""id"": ""repoid"",
      ""issues"": {
        ""pageInfo"": {
          ""hasNextPage"": true,
          ""endCursor"": ""issue_end0""
        },
        ""nodes"": [" +
                               CreateIssue(1, 1, false) + "," +
                               CreateIssue(2, 3, true) + "," +
                               CreateIssue(3, 0, false) + @"
        ]
      }
    }
  }
}");

                    case 1:
                        Assert.NotNull(variables);
                        Assert.Equal("issue2", variables["__id"]);
                        Assert.Equal("comment_end2", variables["__after"]);
                        return(@"{
  data: {
    ""node"": {
      ""__typename"": ""Issue"",
      ""comments"": {
        ""pageInfo"": {
          ""hasNextPage"": false,
          ""endCursor"": ""comment_end""
        },
        ""nodes"": [" +
                               CreateComment(23) + "," +
                               CreateComment(24) + @"
        ]
      }
    }
  }
}");

                    case 2:
                        Assert.NotNull(variables);
                        Assert.Equal("repoid", variables["__id"]);
                        Assert.Equal("issue_end0", variables["__after"]);
                        return(@"{
  data: {
    ""node"": {
      ""__typename"": ""Repository"",
      ""issues"": {
        ""pageInfo"": {
          ""hasNextPage"": false,
          ""endCursor"": ""issue_end1""
        },
        ""nodes"": [" +
                               CreateIssue(4, 0, false) + "," +
                               CreateIssue(5, 0, false) + @"
        ]
      }
    }
  }
}");

                    default:
                        throw new NotSupportedException("Should not get here");
                    }
                }

                var connection = new MockConnection(Execute);
                var result     = (await connection.Run(TestQuery)).ToList();

                Assert.Equal(Enumerable.Range(1, 5).ToList(), result.Select(x => x.Number).ToList());
                Assert.Single(result[0].Comments);
                Assert.Equal(5, result[1].Comments.Count);
                Assert.Empty(result[2].Comments);
                Assert.Empty(result[3].Comments);
                Assert.Empty(result[4].Comments);
            }
        public async Task Reads_All_Pages()
        {
            int page = 0;

            string Execute(string _, IDictionary <string, string> variables)
            {
                switch (page++)
                {
                case 0:
                    Assert.Null(variables);
                    return(@"{
  data: {
    ""repository"": {
      ""id"": ""repoid"",
      ""issues"": {
        ""pageInfo"": {
          ""hasNextPage"": true,
          ""endCursor"": ""end0""
        },
        ""nodes"": [
          { ""number"": 0 },
          { ""number"": 1 },
          { ""number"": 2 },
        ]
      }
    }
  }
}");

                case 1:
                    Assert.NotNull(variables);
                    Assert.Equal(variables["__id"], "repoid");
                    Assert.Equal(variables["__after"], "end0");
                    return(@"{
  data: {
    ""node"": {
      ""__typename"": ""Repository"",
      ""issues"": {
        ""pageInfo"": {
          ""hasNextPage"": true,
          ""endCursor"": ""end1""
        },
        ""nodes"": [
          { ""number"": 3 },
          { ""number"": 4 },
        ]
      }
    }
  }
}");

                case 2:
                    Assert.NotNull(variables);
                    Assert.Equal(variables["__after"], "end1");
                    return(@"{
  data: {
    ""node"": {
      ""__typename"": ""Repository"",
      ""issues"": {
        ""pageInfo"": {
          ""hasNextPage"": false,
          ""endCursor"": ""end2""
        },
        ""nodes"": [
          { ""number"": 5 },
        ]
      }
    }
  }
}");

                default:
                    throw new NotSupportedException("Should not get here");
                }
            }

            var connection = new MockConnection(Execute);
            var result     = (await connection.Run(TestQuery())).ToList();

            Assert.Equal(Enumerable.Range(0, 6).ToList(), result);
        }
Example #3
0
        public async Task Reads_All_Pages()
        {
            int page = 0;

            string Execute(string _, IDictionary <string, string> variables)
            {
                switch (page++)
                {
                case 0:
                    Assert.Null(variables);
                    return(@"{
	""data"": {
		""repository"": {
			""id"": ""repoId"",
			""intList1"": {
				""pageInfo"": {
					""hasNextPage"": true,
					""endCursor"": ""endCursor1""
				},
				""nodes"": [{
						""number"": 1
					}, {
						""number"": 2
					}, {
						""number"": 3
					}
				]
			},
			""intList2"": {
				""pageInfo"": {
					""hasNextPage"": true,
					""endCursor"": ""endCursor2""
				},
				""nodes"": [{
						""number"": 4
					}, {
						""number"": 5
					}, {
						""number"": 6
					}
				]
			}
		}
	}
}");

                case 1:
                    Assert.NotNull(variables);
                    Assert.Equal("repoId", variables["__id"]);
                    Assert.Equal("endCursor2", variables["__after"]);

                    return(@"{
	""data"": {
		""node"": {
			""__typename"": ""Repository"",
			""issues"": {
				""pageInfo"": {
					""hasNextPage"": false,
					""endCursor"": ""endCursor2.1""
				},
				""nodes"": [{
						""number"": 4
					}, {
						""number"": 5
					}
				]
			}
		}
	}
}");

                case 2:
                    Assert.NotNull(variables);
                    Assert.Equal("repoId", variables["__id"]);
                    Assert.Equal("endCursor1", variables["__after"]);

                    return(@"{
	""data"": {
		""node"": {
			""__typename"": ""Repository"",
			""issues"": {
				""pageInfo"": {
					""hasNextPage"": false,
					""endCursor"": ""endCursor1.1""
				},
				""nodes"": [{
						""number"": 4
					}, {
						""number"": 5
					}, {
						""number"": 6
					}
				]
			}
		}
	}
}");

                default:
                    throw new NotSupportedException("Should not get here");
                }
            }

            var query = new Query()
                        .Repository("foo", "bar")
                        .Select(repository => new
            {
                IntList1 = repository.Issues(null, null, null, null, null)
                           .AllPages()
                           .Select(issue => issue.Number)
                           .ToList(),
                IntList2 = repository.Issues(null, null, null, null, null)
                           .AllPages()
                           .Select(issue => issue.Number)
                           .ToList()
            }).Compile();


            var connection = new MockConnection(Execute);
            var result     = (await connection.Run(query));

            Assert.Equal(6, result.IntList1.Count);
            Assert.Equal(5, result.IntList2.Count);
        }