From c0d2bfcbf3ec2340e6ca164ee9fa39fc073b313a Mon Sep 17 00:00:00 2001 From: automagic Date: Wed, 31 Dec 2014 12:16:01 -0800 Subject: [PATCH 1/3] Allow Paging of views in ExecuteView. Unit test. --- Tests/ViewTests.cs | 17 +++++++++++++++++ ZendeskApi_v2/Requests/Views.cs | 29 ++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Tests/ViewTests.cs b/Tests/ViewTests.cs index e557ab99..b39db431 100644 --- a/Tests/ViewTests.cs +++ b/Tests/ViewTests.cs @@ -62,6 +62,23 @@ public void CanExecuteViews() Assert.Greater(res.Columns.Count, 0); } + [Test] + public void CanExecutePagedView() + { + var res = api.Views.ExecuteView(31559032, "", true, 25, 2); + + Assert.AreEqual(res.Rows.Count, 25); + + var nextPage = res.NextPage + .Split('?').Last() + .Split('&').Select(x => new KeyValuePair(x.Split('=').First(), x.Split('=').Last())) + .Where(x => x.Key == "page") + .Select(x => x.Value) + .FirstOrDefault(); + + Assert.AreEqual(nextPage, "3"); + } + [Test] public void CanPreviewViews() { diff --git a/ZendeskApi_v2/Requests/Views.cs b/ZendeskApi_v2/Requests/Views.cs index 6039b540..106197a1 100644 --- a/ZendeskApi_v2/Requests/Views.cs +++ b/ZendeskApi_v2/Requests/Views.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using System.Globalization; +using System.Linq; #if ASYNC using System.Threading.Tasks; #endif @@ -15,7 +17,7 @@ public interface IViews : ICore GroupViewResponse GetActiveViews(); GroupViewResponse GetCompactViews(); IndividualViewResponse GetView(long id); - ExecutedViewResponse ExecuteView(long id, string sortCol = "", bool ascending = true); + ExecutedViewResponse ExecuteView(long id, string sortCol = "", bool ascending = true, int? perPage = null, int? page = null); ExecutedViewResponse PreviewView(PreviewViewRequest preview); GroupViewCountResponse GetViewCounts(IEnumerable viewIds); IndividualViewCountResponse GetViewCount(long viewId); @@ -62,11 +64,32 @@ public IndividualViewResponse GetView(long id) return GenericGet(string.Format("views/{0}.json", id)); } - public ExecutedViewResponse ExecuteView(long id, string sortCol = "", bool ascending = true) + public ExecutedViewResponse ExecuteView(long id, string sortCol = "", bool ascending = true, int? perPage = null, int? page = null) { var resource = string.Format("views/{0}/execute.json", id); + + var parameters = new Dictionary(); + if (!string.IsNullOrEmpty(sortCol)) - resource += string.Format("?sort_by={0}&sort_order={1}", sortCol, ascending ? "" : "desc"); + { + parameters.Add("sort_by", sortCol); + parameters.Add("sort_order", ascending ? "" : "desc"); + } + + if (perPage.HasValue) + { + parameters.Add("per_page", perPage.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (page.HasValue) + { + parameters.Add("page", page.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (parameters.Any()) + { + resource += "?" + string.Join("&", parameters.Select(x => x.Key + "=" + x.Value)); + } return GenericGet(resource); } From b72bce3416c6958622232e1c15d2c64fa73c3c55 Mon Sep 17 00:00:00 2001 From: automagic Date: Fri, 2 Jan 2015 12:53:43 -0800 Subject: [PATCH 2/3] Paging of various GetTicket Methods. Move paging logic into base class method. Improve GroupResponseBase to report current page, page size and totoal pages in addition to total count. Make async methods consistent. --- Tests/TicketTests.cs | 50 +++++++ Tests/ViewTests.cs | 7 +- ZendeskApi_v2/Core.cs | 124 +++++++++++++++++- ZendeskApi_v2/Extensions/RequestExtensions.cs | 12 +- ZendeskApi_v2/Models/GroupResponseBase.cs | 53 +++++++- ZendeskApi_v2/Requests/Tickets.cs | 92 ++++++------- ZendeskApi_v2/Requests/Views.cs | 33 +---- 7 files changed, 291 insertions(+), 80 deletions(-) diff --git a/Tests/TicketTests.cs b/Tests/TicketTests.cs index fab679bf..72fb5ea6 100644 --- a/Tests/TicketTests.cs +++ b/Tests/TicketTests.cs @@ -7,6 +7,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using ZendeskApi_v2; +using ZendeskApi_v2.Extensions; using ZendeskApi_v2.Models.Constants; using ZendeskApi_v2.Models.Shared; using ZendeskApi_v2.Models.Tickets; @@ -85,6 +86,31 @@ public void CanGetTickets() Assert.True(ticketsByUser.Count > 0); } + [Test] + public void CanGetTicketsPaged() + { + const int count = 50; + var tickets = api.Tickets.GetAllTickets(count); + + Assert.AreEqual(count, tickets.Tickets.Count); // 50 + Assert.AreNotEqual(tickets.Count, tickets.Tickets.Count); // 50 != total count of tickets (assumption) + + const int page = 3; + var thirdPage = api.Tickets.GetAllTickets(count, page); + + Assert.AreEqual(count, thirdPage.Tickets.Count); + + var nextPage = thirdPage.NextPage.GetQueryStringDict() + .Where(x => x.Key == "page") + .Select(x => x.Value) + .FirstOrDefault(); + + Assert.NotNull(nextPage); + + Assert.AreEqual(nextPage, (page + 1).ToString()); + } + + [Test] public void CanGetTicketById() { @@ -251,6 +277,30 @@ public void CanGetTicketComments() Assert.IsNotEmpty(comments.Comments[1].Body); } + [Test] + public void CanGetTicketCommentsPaged() + { + const int perPage = 5; + const int page = 2; + var commentsRes = api.Tickets.GetTicketComments(2, perPage, page); + + Assert.AreEqual(commentsRes.Comments.Count, perPage); + Assert.AreEqual(commentsRes.PageSize, perPage); + Assert.AreEqual(commentsRes.Page, page); + + Assert.IsNotEmpty(commentsRes.Comments[1].Body); + + var nextPageValue = commentsRes.NextPage.GetQueryStringDict() + .Where(x => x.Key == "page") + .Select(x => x.Value) + .FirstOrDefault(); + + Assert.NotNull(nextPageValue); + + Assert.AreEqual(nextPageValue, (page + 1).ToString()); + } + + [Test] public void CanCreateTicketWithRequester() { diff --git a/Tests/ViewTests.cs b/Tests/ViewTests.cs index b39db431..28e3cbfe 100644 --- a/Tests/ViewTests.cs +++ b/Tests/ViewTests.cs @@ -6,6 +6,7 @@ using System.Text; using NUnit.Framework; using ZendeskApi_v2; +using ZendeskApi_v2.Extensions; using ZendeskApi_v2.Models.Constants; using ZendeskApi_v2.Models.Shared; using ZendeskApi_v2.Models.Tickets; @@ -69,13 +70,13 @@ public void CanExecutePagedView() Assert.AreEqual(res.Rows.Count, 25); - var nextPage = res.NextPage - .Split('?').Last() - .Split('&').Select(x => new KeyValuePair(x.Split('=').First(), x.Split('=').Last())) + var nextPage = res.NextPage.GetQueryStringDict() .Where(x => x.Key == "page") .Select(x => x.Value) .FirstOrDefault(); + Assert.NotNull(nextPage); + Assert.AreEqual(nextPage, "3"); } diff --git a/ZendeskApi_v2/Core.cs b/ZendeskApi_v2/Core.cs index 8f269733..ded8f4ff 100644 --- a/ZendeskApi_v2/Core.cs +++ b/ZendeskApi_v2/Core.cs @@ -1,5 +1,7 @@  using System; -using System.IO; + using System.Collections.Generic; + using System.Globalization; + using System.IO; using System.Linq; using System.Net; using System.Text; @@ -134,8 +136,69 @@ public RequestResult RunRequest(string resource, string requestMethod, object bo protected T GenericGet(string resource) { + return RunRequest(resource, "GET"); } + + protected T GenericPagedGet(string resource, int? perPage = null, int? page = null) + { + var parameters = new Dictionary(); + + var paramString = ""; + if (perPage.HasValue) + { + parameters.Add("per_page", perPage.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (page.HasValue) + { + parameters.Add("page", page.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (parameters.Any()) + { + paramString = "?" + string.Join("&", parameters.Select(x => x.Key + "=" + x.Value)); + } + + + return GenericGet(resource + paramString); + } + + protected T GenericPagedSortedGet(string resource, int? perPage = null, int? page = null, string sortCol = null, bool? sortAscending = null ) + { + var parameters = new Dictionary(); + + var paramString = ""; + if (perPage.HasValue) + { + parameters.Add("per_page", perPage.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (page.HasValue) + { + parameters.Add("page", page.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (!string.IsNullOrEmpty(sortCol)) + { + parameters.Add("sort_by", sortCol); + } + + if (sortAscending.HasValue) + { + parameters.Add("sort_order", sortAscending.Value ? "" : "desc"); + } + + if (parameters.Any()) + { + paramString = "?" + string.Join("&", parameters.Select(x => x.Key + "=" + x.Value)); + } + + + return GenericGet(resource + paramString); + } + + protected bool GenericDelete(string resource) { @@ -264,6 +327,65 @@ protected async Task GenericGetAsync(string resource) return await RunRequestAsync(resource, "GET"); } + protected async Task GenericPagedGetAsync(string resource, int? perPage = null, int? page = null) + { + var parameters = new Dictionary(); + + var paramString = ""; + if (perPage.HasValue) + { + parameters.Add("per_page", perPage.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (page.HasValue) + { + parameters.Add("page", page.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (parameters.Any()) + { + paramString = "?" + string.Join("&", parameters.Select(x => x.Key + "=" + x.Value)); + } + + + return await GenericGetAsync(resource + paramString); + } + + protected async Task GenericPagedSortedGetAsync(string resource, int? perPage = null, int? page = null, string sortCol = null, bool? sortAscending = null) + { + var parameters = new Dictionary(); + + var paramString = ""; + if (perPage.HasValue) + { + parameters.Add("per_page", perPage.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (page.HasValue) + { + parameters.Add("page", page.Value.ToString(CultureInfo.InvariantCulture)); + } + + if (!string.IsNullOrEmpty(sortCol)) + { + parameters.Add("sort_by", sortCol); + } + + if (sortAscending.HasValue) + { + parameters.Add("sort_order", sortAscending.Value ? "" : "desc"); + } + + if (parameters.Any()) + { + paramString = "?" + string.Join("&", parameters.Select(x => x.Key + "=" + x.Value)); + } + + + return await GenericGetAsync(resource + paramString); + } + + protected async Task GenericDeleteAsync(string resource) { var res = RunRequestAsync(resource, "DELETE"); diff --git a/ZendeskApi_v2/Extensions/RequestExtensions.cs b/ZendeskApi_v2/Extensions/RequestExtensions.cs index 7a3932c1..b3719fb5 100644 --- a/ZendeskApi_v2/Extensions/RequestExtensions.cs +++ b/ZendeskApi_v2/Extensions/RequestExtensions.cs @@ -56,6 +56,16 @@ public static int GetEpoch(this DateTime date) { var t = date - new DateTime(1970, 1, 1); return (int)t.TotalSeconds; - } + } + + public static Dictionary GetQueryStringDict(this string url) + { + var queryPart = !url.Contains("?") ? url : url.Split('?')[1]; + + return (from match in queryPart.Split('&') + where match.Contains('=') + select match.Split('=')) + .ToDictionary(x => x.First(), x => x.Last()); + } } } diff --git a/ZendeskApi_v2/Models/GroupResponseBase.cs b/ZendeskApi_v2/Models/GroupResponseBase.cs index 46ef78f3..9eca3592 100644 --- a/ZendeskApi_v2/Models/GroupResponseBase.cs +++ b/ZendeskApi_v2/Models/GroupResponseBase.cs @@ -2,9 +2,8 @@ // http://at-my-window.blogspot.com/?page=json-class-generator using System; -using System.Collections.Generic; using Newtonsoft.Json; -using Newtonsoft.Json.Linq; +using ZendeskApi_v2.Extensions; namespace ZendeskApi_v2.Models { @@ -18,5 +17,55 @@ public class GroupResponseBase [JsonProperty("count")] public int Count { get; set; } + + [JsonProperty("page")] + public int Page + { + get { return GetPageFromParameter(); } + } + + [JsonProperty("per_page")] + public int PageSize + { + get { return GetPageSizeFromParameter(); } + } + + [JsonProperty("total_pages")] + public int TotalPages + { + get { return (int)Math.Ceiling(Count/(decimal)PageSize); } + } + + private int GetPageFromParameter() + { + if (string.IsNullOrEmpty(PreviousPage)) + return 1; + + if (string.IsNullOrEmpty(NextPage)) + return TotalPages; + + var dict = NextPage.GetQueryStringDict(); + if (dict.ContainsKey("page")) + { + return int.Parse(dict["page"]) - 1; + } + + return 0; + } + + private int GetPageSizeFromParameter() + { + var page = NextPage ?? PreviousPage; + if (page == null) + return 100; + + var dict = page.GetQueryStringDict(); + if (dict.ContainsKey("per_page")) + { + return int.Parse(dict["per_page"]); + } + + return 100; + } } } diff --git a/ZendeskApi_v2/Requests/Tickets.cs b/ZendeskApi_v2/Requests/Tickets.cs index 4da652c5..77d83c1f 100644 --- a/ZendeskApi_v2/Requests/Tickets.cs +++ b/ZendeskApi_v2/Requests/Tickets.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Globalization; +using System.Linq; using System.Net; #if ASYNC using System.Threading.Tasks; @@ -23,15 +25,15 @@ public interface ITickets : ICore bool ReorderTicketForms(long[] orderedTicketFormIds); IndividualTicketFormResponse CloneTicketForm(long ticketFormId); bool DeleteTicketForm(long id); - GroupTicketResponse GetAllTickets(); - GroupTicketResponse GetTicketsByViewID(int id); - GroupTicketResponse GetTicketsByOrganizationID(long id); + GroupTicketResponse GetAllTickets(int? perPage = null, int? page = null); + GroupTicketResponse GetTicketsByViewID(int id, int? perPage = null, int? page = null); + GroupTicketResponse GetTicketsByOrganizationID(long id); GroupTicketResponse GetTicketsByOrganizationID(long id, int pageNumber, int itemsPerPage); - GroupTicketResponse GetRecentTickets(); - GroupTicketResponse GetTicketsByUserID(long userId); - GroupTicketResponse GetTicketsWhereUserIsCopied(long userId); + GroupTicketResponse GetRecentTickets(int? perPage = null, int? page = null); + GroupTicketResponse GetTicketsByUserID(long userId, int? perPage = null, int? page = null); + GroupTicketResponse GetTicketsWhereUserIsCopied(long userId, int? perPage = null, int? page = null); IndividualTicketResponse GetTicket(long id); - GroupCommentResponse GetTicketComments(long ticketId); + GroupCommentResponse GetTicketComments(long ticketId, int? perPage = null, int? page = null); GroupTicketResponse GetMultipleTickets(IEnumerable ids); IndividualTicketResponse CreateTicket(Ticket ticket); @@ -78,14 +80,14 @@ public interface ITickets : ICore #endif #if ASYNC - Task GetAllTicketsAsync(); - Task GetTicketsByViewIDAsync(int id); - Task GetTicketsByOrganizationIDAsync(long id); - Task GetRecentTicketsAsync(); - Task GetTicketsByUserIDAsync(long userId); - Task GetTicketsWhereUserIsCopiedAsync(long userId); + Task GetAllTicketsAsync(int? perPage = null, int? page = null); + Task GetTicketsByViewIDAsync(int id, int? perPage = null, int? page = null); + Task GetTicketsByOrganizationIDAsync(long id, int? perPage = null, int? page = null); + Task GetRecentTicketsAsync(int? perPage = null, int? page = null); + Task GetTicketsByUserIDAsync(long userId, int? perPage = null, int? page = null); + Task GetTicketsWhereUserIsCopiedAsync(long userId, int? perPage = null, int? page = null); Task GetTicketAsync(long id); - Task GetTicketCommentsAsync(long ticketId); + Task GetTicketCommentsAsync(long ticketId, int? perPage = null, int? page = null); Task GetMultipleTicketsAsync(IEnumerable ids); Task CreateTicketAsync(Ticket ticket); @@ -193,17 +195,19 @@ public bool DeleteTicketForm(long id) { return GenericDelete(string.Format("{0}/{1}.json", _ticket_forms, id)); } - - public GroupTicketResponse GetAllTickets() - { - return GenericGet(_tickets + ".json"); + + public GroupTicketResponse GetAllTickets(int? perPage = null, int? page = null) + { + + return GenericPagedGet(_tickets + ".json", perPage, page); } - public GroupTicketResponse GetTicketsByViewID(int id) + public GroupTicketResponse GetTicketsByViewID(int id, int? perPage = null, int? page = null) { - return GenericGet(string.Format("{0}/{1}/{2}.json", _views, id, _tickets)); + + return GenericPagedGet(string.Format("{0}/{1}/{2}.json", _views, id, _tickets), perPage, page); } public GroupTicketResponse GetTicketsByOrganizationID(long id) @@ -213,22 +217,22 @@ public GroupTicketResponse GetTicketsByOrganizationID(long id) public GroupTicketResponse GetTicketsByOrganizationID(long id, int pageNumber, int itemsPerPage) { - return GenericGet(string.Format("{0}/{1}/{2}.json?page={3}&per_page={4}", _organizations, id, _tickets, pageNumber, itemsPerPage)); + return GenericPagedGet(string.Format("{0}/{1}/{2}.json", _organizations, id, _tickets), itemsPerPage, pageNumber); } - public GroupTicketResponse GetRecentTickets() + public GroupTicketResponse GetRecentTickets(int? perPage = null, int? page = null) { - return GenericGet("tickets/recent.json"); + return GenericPagedGet("tickets/recent.json", perPage, page); } - public GroupTicketResponse GetTicketsByUserID(long userId) + public GroupTicketResponse GetTicketsByUserID(long userId, int? perPage = null, int? page = null) { - return GenericGet(string.Format("users/{0}/tickets/requested.json", userId)); + return GenericPagedGet(string.Format("users/{0}/tickets/requested.json", userId), perPage, page); } - public GroupTicketResponse GetTicketsWhereUserIsCopied(long userId) + public GroupTicketResponse GetTicketsWhereUserIsCopied(long userId, int? perPage = null, int? page = null) { - return GenericGet(string.Format("users/{0}/tickets/ccd.json", userId)); + return GenericPagedGet(string.Format("users/{0}/tickets/ccd.json", userId), perPage, page); } public IndividualTicketResponse GetTicket(long id) @@ -236,9 +240,9 @@ public IndividualTicketResponse GetTicket(long id) return GenericGet(string.Format("{0}/{1}.json", _tickets, id)); } - public GroupCommentResponse GetTicketComments(long ticketId) + public GroupCommentResponse GetTicketComments(long ticketId, int? perPage = null, int? page = null) { - return GenericGet(string.Format("{0}/{1}/comments.json", _tickets, ticketId)); + return GenericPagedGet(string.Format("{0}/{1}/comments.json", _tickets, ticketId), perPage, page); } public GroupTicketResponse GetMultipleTickets(IEnumerable ids) @@ -430,34 +434,34 @@ public IndividualTicketMetricResponse GetTicketMetricsForTicket(long ticket_id) #if ASYNC - public async Task GetAllTicketsAsync() - { - return await GenericGetAsync(_tickets + ".json"); + public async Task GetAllTicketsAsync(int? perPage = null, int? page = null) + { + return await GenericPagedGetAsync(_tickets + ".json", perPage, page); } - public async Task GetTicketsByViewIDAsync(int id) + public async Task GetTicketsByViewIDAsync(int id, int? perPage = null, int? page = null) { - return await GenericGetAsync(string.Format("{0}/{1}/{2}.json", _views, id, _tickets)); + return await GenericPagedGetAsync(string.Format("{0}/{1}/{2}.json", _views, id, _tickets), perPage, page); } - public async Task GetTicketsByOrganizationIDAsync(long id) + public async Task GetTicketsByOrganizationIDAsync(long id, int? perPage = null, int? page = null) { - return await GenericGetAsync(string.Format("{0}/{1}/{2}.json", _organizations, id, _tickets)); + return await GenericPagedGetAsync(string.Format("{0}/{1}/{2}.json", _organizations, id, _tickets), perPage, page); } - public async Task GetRecentTicketsAsync() + public async Task GetRecentTicketsAsync(int? perPage = null, int? page = null) { - return await GenericGetAsync("tickets/recent.json"); + return await GenericPagedGetAsync("tickets/recent.json", perPage, page); } - public async Task GetTicketsByUserIDAsync(long userId) + public async Task GetTicketsByUserIDAsync(long userId, int? perPage = null, int? page = null) { - return await GenericGetAsync(string.Format("users/{0}/tickets/requested.json", userId)); + return await GenericPagedGetAsync(string.Format("users/{0}/tickets/requested.json", userId), perPage, page); } - public async Task GetTicketsWhereUserIsCopiedAsync(long userId) + public async Task GetTicketsWhereUserIsCopiedAsync(long userId, int? perPage = null, int? page = null) { - return await GenericGetAsync(string.Format("users/{0}/tickets/ccd.json", userId)); + return await GenericPagedGetAsync(string.Format("users/{0}/tickets/ccd.json", userId), perPage, page); } public async Task GetTicketAsync(long id) @@ -465,9 +469,9 @@ public async Task GetTicketAsync(long id) return await GenericGetAsync(string.Format("{0}/{1}.json", _tickets, id)); } - public async Task GetTicketCommentsAsync(long ticketId) + public async Task GetTicketCommentsAsync(long ticketId, int? perPage = null, int? page = null) { - return await GenericGetAsync(string.Format("{0}/{1}/comments.json", _tickets, ticketId)); + return await GenericPagedGetAsync(string.Format("{0}/{1}/comments.json", _tickets, ticketId), perPage, page); } public async Task GetMultipleTicketsAsync(IEnumerable ids) diff --git a/ZendeskApi_v2/Requests/Views.cs b/ZendeskApi_v2/Requests/Views.cs index 106197a1..d31419b1 100644 --- a/ZendeskApi_v2/Requests/Views.cs +++ b/ZendeskApi_v2/Requests/Views.cs @@ -28,7 +28,7 @@ public interface IViews : ICore Task GetActiveViewsAsync(); Task GetCompactViewsAsync(); Task GetViewAsync(long id); - Task ExecuteViewAsync(long id, string sortCol = "", bool ascending = true); + Task ExecuteViewAsync(long id, string sortCol = "", bool ascending = true, int? perPage = null, int? page = null); Task PreviewViewAsync(PreviewViewRequest preview); Task GetViewCountsAsync(IEnumerable viewIds); Task GetViewCountAsync(long viewId); @@ -68,30 +68,7 @@ public ExecutedViewResponse ExecuteView(long id, string sortCol = "", bool ascen { var resource = string.Format("views/{0}/execute.json", id); - var parameters = new Dictionary(); - - if (!string.IsNullOrEmpty(sortCol)) - { - parameters.Add("sort_by", sortCol); - parameters.Add("sort_order", ascending ? "" : "desc"); - } - - if (perPage.HasValue) - { - parameters.Add("per_page", perPage.Value.ToString(CultureInfo.InvariantCulture)); - } - - if (page.HasValue) - { - parameters.Add("page", page.Value.ToString(CultureInfo.InvariantCulture)); - } - - if (parameters.Any()) - { - resource += "?" + string.Join("&", parameters.Select(x => x.Key + "=" + x.Value)); - } - - return GenericGet(resource); + return GenericPagedSortedGet(resource, perPage, page, sortCol, ascending); } public ExecutedViewResponse PreviewView(PreviewViewRequest preview) @@ -131,13 +108,11 @@ public async Task GetViewAsync(long id) return await GenericGetAsync(string.Format("views/{0}.json", id)); } - public async Task ExecuteViewAsync(long id, string sortCol = "", bool ascending = true) + public async Task ExecuteViewAsync(long id, string sortCol = "", bool ascending = true, int? perPage = null, int? page = null) { var resource = string.Format("views/{0}/execute.json", id); - if (!string.IsNullOrEmpty(sortCol)) - resource += string.Format("?sort_by={0}&sort_order={1}", sortCol, ascending ? "" : "desc"); - return await GenericGetAsync(resource); + return await GenericPagedSortedGetAsync(resource, page, perPage, sortCol, ascending); } public async Task PreviewViewAsync(PreviewViewRequest preview) From c4cd52c23b8b27afedf8b2042370e66c19ff1537 Mon Sep 17 00:00:00 2001 From: automagic Date: Sat, 3 Jan 2015 09:17:53 -0800 Subject: [PATCH 3/3] Paged Ticket Get Unit Tests --- Tests/Settings.cs | 3 +- Tests/TicketTests.cs | 91 ++++++++++++++++++++++++++++--- Tests/ViewTests.cs | 6 +- ZendeskApi_v2/Requests/Tickets.cs | 14 ++--- 4 files changed, 93 insertions(+), 21 deletions(-) diff --git a/Tests/Settings.cs b/Tests/Settings.cs index 39431cdb..2c8e2e22 100644 --- a/Tests/Settings.cs +++ b/Tests/Settings.cs @@ -29,7 +29,8 @@ public class Settings public const long GroupId = 20402842; public const long OrganizationId = 22560572; - public const string ViewName = "My unsolved tickets"; + public const string ViewName = "My unsolved tickets"; + public const int ViewId = 31559032; public const long TicketFormId = 26227; diff --git a/Tests/TicketTests.cs b/Tests/TicketTests.cs index 72fb5ea6..01c464d4 100644 --- a/Tests/TicketTests.cs +++ b/Tests/TicketTests.cs @@ -124,18 +124,91 @@ public void CanGetTicketById() public void CanGetTicketsByOrganizationId() { var id = Settings.OrganizationId; - var tickets = api.Tickets.GetTicketsByOrganizationID(id, 2, 3); + var tickets = api.Tickets.GetTicketsByOrganizationID(id); Assert.True(tickets.Count > 0); } + [Test] - public void CanGetTicketsByOrganizationIdPaging() + public void CanGetTicketsByOrganizationIdPaged() { var id = Settings.OrganizationId; - var tickets = api.Tickets.GetTicketsByOrganizationID(id); - Assert.True(tickets.Count > 0); + var ticketsRes = api.Tickets.GetTicketsByOrganizationID(id, 2, 3); + + Assert.AreEqual(3, ticketsRes.PageSize); + Assert.AreEqual(3, ticketsRes.Tickets.Count); + Assert.Greater(ticketsRes.Count, 0); + + var nextPage = ticketsRes.NextPage.GetQueryStringDict() + .Where(x => x.Key == "page") + .Select(x => x.Value) + .FirstOrDefault(); + + Assert.NotNull(nextPage); + + Assert.AreEqual("3", nextPage); } - + + [Test] + public void CanGetTicketsByViewIdPaged() + { + var ticketsRes = api.Tickets.GetTicketsByViewID(Settings.ViewId, 10, 2); + + Assert.AreEqual(10, ticketsRes.PageSize); + Assert.AreEqual(10, ticketsRes.Tickets.Count); + Assert.Greater(ticketsRes.Count, 0); + + var nextPage = ticketsRes.NextPage.GetQueryStringDict() + .Where(x => x.Key == "page") + .Select(x => x.Value) + .FirstOrDefault(); + + Assert.NotNull(nextPage); + + Assert.AreEqual("3", nextPage); + } + + [Test] + public void CanGetRecentTicketsPaged() + { + var ticketsRes = api.Tickets.GetRecentTickets(5, 2); + + Assert.AreEqual(5, ticketsRes.PageSize); + Assert.AreEqual(5, ticketsRes.Tickets.Count); + Assert.Greater(ticketsRes.Count, 0); + + var nextPage = ticketsRes.NextPage.GetQueryStringDict() + .Where(x => x.Key == "page") + .Select(x => x.Value) + .FirstOrDefault(); + + Assert.NotNull(nextPage); + + Assert.AreEqual("3", nextPage); + } + + [Test] + public void CanTicketsByUserIdPaged() + { + var ticketsRes = api.Tickets.GetTicketsByUserID(Settings.UserId, 5, 2); + + Assert.AreEqual(5, ticketsRes.PageSize); + Assert.AreEqual(5, ticketsRes.Tickets.Count); + Assert.Greater(ticketsRes.Count, 0); + + var nextPage = ticketsRes.NextPage.GetQueryStringDict() + .Where(x => x.Key == "page") + .Select(x => x.Value) + .FirstOrDefault(); + + Assert.NotNull(nextPage); + + Assert.AreEqual("3", nextPage); + } + + + + [Test] public void CanGetMultipleTickets() { @@ -284,9 +357,9 @@ public void CanGetTicketCommentsPaged() const int page = 2; var commentsRes = api.Tickets.GetTicketComments(2, perPage, page); - Assert.AreEqual(commentsRes.Comments.Count, perPage); - Assert.AreEqual(commentsRes.PageSize, perPage); - Assert.AreEqual(commentsRes.Page, page); + Assert.AreEqual(perPage, commentsRes.Comments.Count); + Assert.AreEqual(page, commentsRes.PageSize); + Assert.AreEqual(page, commentsRes.Page); Assert.IsNotEmpty(commentsRes.Comments[1].Body); @@ -297,7 +370,7 @@ public void CanGetTicketCommentsPaged() Assert.NotNull(nextPageValue); - Assert.AreEqual(nextPageValue, (page + 1).ToString()); + Assert.AreEqual((page + 1).ToString(), nextPageValue); } diff --git a/Tests/ViewTests.cs b/Tests/ViewTests.cs index 28e3cbfe..dba171b6 100644 --- a/Tests/ViewTests.cs +++ b/Tests/ViewTests.cs @@ -66,9 +66,9 @@ public void CanExecuteViews() [Test] public void CanExecutePagedView() { - var res = api.Views.ExecuteView(31559032, "", true, 25, 2); + var res = api.Views.ExecuteView(Settings.ViewId, "", true, 25, 2); - Assert.AreEqual(res.Rows.Count, 25); + Assert.AreEqual(25, res.Rows.Count); var nextPage = res.NextPage.GetQueryStringDict() .Where(x => x.Key == "page") @@ -77,7 +77,7 @@ public void CanExecutePagedView() Assert.NotNull(nextPage); - Assert.AreEqual(nextPage, "3"); + Assert.AreEqual("3", nextPage); } [Test] diff --git a/ZendeskApi_v2/Requests/Tickets.cs b/ZendeskApi_v2/Requests/Tickets.cs index 77d83c1f..42735cb4 100644 --- a/ZendeskApi_v2/Requests/Tickets.cs +++ b/ZendeskApi_v2/Requests/Tickets.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Globalization; -using System.Linq; using System.Net; #if ASYNC using System.Threading.Tasks; @@ -26,7 +24,7 @@ public interface ITickets : ICore IndividualTicketFormResponse CloneTicketForm(long ticketFormId); bool DeleteTicketForm(long id); GroupTicketResponse GetAllTickets(int? perPage = null, int? page = null); - GroupTicketResponse GetTicketsByViewID(int id, int? perPage = null, int? page = null); + GroupTicketResponse GetTicketsByViewID(long viewId, int? perPage = null, int? page = null); GroupTicketResponse GetTicketsByOrganizationID(long id); GroupTicketResponse GetTicketsByOrganizationID(long id, int pageNumber, int itemsPerPage); GroupTicketResponse GetRecentTickets(int? perPage = null, int? page = null); @@ -81,7 +79,7 @@ public interface ITickets : ICore #if ASYNC Task GetAllTicketsAsync(int? perPage = null, int? page = null); - Task GetTicketsByViewIDAsync(int id, int? perPage = null, int? page = null); + Task GetTicketsByViewIDAsync(long viewId, int? perPage = null, int? page = null); Task GetTicketsByOrganizationIDAsync(long id, int? perPage = null, int? page = null); Task GetRecentTicketsAsync(int? perPage = null, int? page = null); Task GetTicketsByUserIDAsync(long userId, int? perPage = null, int? page = null); @@ -204,10 +202,10 @@ public GroupTicketResponse GetAllTickets(int? perPage = null, int? page = null) return GenericPagedGet(_tickets + ".json", perPage, page); } - public GroupTicketResponse GetTicketsByViewID(int id, int? perPage = null, int? page = null) + public GroupTicketResponse GetTicketsByViewID(long viewId, int? perPage = null, int? page = null) { - return GenericPagedGet(string.Format("{0}/{1}/{2}.json", _views, id, _tickets), perPage, page); + return GenericPagedGet(string.Format("{0}/{1}/{2}.json", _views, viewId, _tickets), perPage, page); } public GroupTicketResponse GetTicketsByOrganizationID(long id) @@ -439,9 +437,9 @@ public async Task GetAllTicketsAsync(int? perPage = null, i return await GenericPagedGetAsync(_tickets + ".json", perPage, page); } - public async Task GetTicketsByViewIDAsync(int id, int? perPage = null, int? page = null) + public async Task GetTicketsByViewIDAsync(long viewId, int? perPage = null, int? page = null) { - return await GenericPagedGetAsync(string.Format("{0}/{1}/{2}.json", _views, id, _tickets), perPage, page); + return await GenericPagedGetAsync(string.Format("{0}/{1}/{2}.json", _views, viewId, _tickets), perPage, page); } public async Task GetTicketsByOrganizationIDAsync(long id, int? perPage = null, int? page = null)