From de0f804e701687fdadbbffde234228196f56bb18 Mon Sep 17 00:00:00 2001 From: Francisco Cruz Date: Wed, 29 Nov 2023 10:54:50 -0600 Subject: [PATCH] added optional parameter to write to json only implemented atm for issue, wrote a test for issue read-write --- .../Serialization/IJsonSerializable.cs | 3 +- src/redmine-net-api/Types/Attachment.cs | 4 +- src/redmine-net-api/Types/Attachments.cs | 3 +- src/redmine-net-api/Types/ChangeSet.cs | 3 +- .../Types/CustomFieldPossibleValue.cs | 3 +- src/redmine-net-api/Types/CustomFieldValue.cs | 3 +- src/redmine-net-api/Types/Detail.cs | 4 +- src/redmine-net-api/Types/Error.cs | 3 +- src/redmine-net-api/Types/File.cs | 3 +- src/redmine-net-api/Types/Group.cs | 3 +- src/redmine-net-api/Types/Identifiable.cs | 3 +- src/redmine-net-api/Types/IdentifiableName.cs | 3 +- src/redmine-net-api/Types/Issue.cs | 55 ++++++++++++++++--- src/redmine-net-api/Types/IssueCategory.cs | 3 +- src/redmine-net-api/Types/IssueCustomField.cs | 4 +- src/redmine-net-api/Types/IssueRelation.cs | 4 +- src/redmine-net-api/Types/Journal.cs | 2 +- src/redmine-net-api/Types/MembershipRole.cs | 3 +- .../Types/MyAccountCustomField.cs | 2 +- src/redmine-net-api/Types/News.cs | 3 +- src/redmine-net-api/Types/NewsComment.cs | 2 +- src/redmine-net-api/Types/Permission.cs | 3 +- src/redmine-net-api/Types/Project.cs | 3 +- .../Types/ProjectMembership.cs | 3 +- src/redmine-net-api/Types/Search.cs | 2 +- src/redmine-net-api/Types/TimeEntry.cs | 3 +- src/redmine-net-api/Types/Upload.cs | 3 +- src/redmine-net-api/Types/User.cs | 3 +- src/redmine-net-api/Types/Version.cs | 3 +- src/redmine-net-api/Types/WikiPage.cs | 3 +- .../Tests/Sync/IssueTests.cs | 38 +++++++++++++ 31 files changed, 141 insertions(+), 39 deletions(-) diff --git a/src/redmine-net-api/Serialization/IJsonSerializable.cs b/src/redmine-net-api/Serialization/IJsonSerializable.cs index c325545f..183315c7 100644 --- a/src/redmine-net-api/Serialization/IJsonSerializable.cs +++ b/src/redmine-net-api/Serialization/IJsonSerializable.cs @@ -27,7 +27,8 @@ public interface IJsonSerializable /// /// /// - void WriteJson(JsonWriter writer); + /// + void WriteJson(JsonWriter writer, bool full = false); /// /// /// diff --git a/src/redmine-net-api/Types/Attachment.cs b/src/redmine-net-api/Types/Attachment.cs index b6e188a6..2c5f3606 100644 --- a/src/redmine-net-api/Types/Attachment.cs +++ b/src/redmine-net-api/Types/Attachment.cs @@ -166,8 +166,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.ATTACHMENT)) { diff --git a/src/redmine-net-api/Types/Attachments.cs b/src/redmine-net-api/Types/Attachments.cs index 7797e7e7..0e70e25b 100644 --- a/src/redmine-net-api/Types/Attachments.cs +++ b/src/redmine-net-api/Types/Attachments.cs @@ -36,7 +36,8 @@ public void ReadJson(JsonReader reader) { } /// /// /// - public void WriteJson(JsonWriter writer) + /// + public void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.ATTACHMENTS)) { diff --git a/src/redmine-net-api/Types/ChangeSet.cs b/src/redmine-net-api/Types/ChangeSet.cs index 5a362d68..07a7b036 100644 --- a/src/redmine-net-api/Types/ChangeSet.cs +++ b/src/redmine-net-api/Types/ChangeSet.cs @@ -138,7 +138,8 @@ public void ReadJson(JsonReader reader) /// /// /// - public void WriteJson(JsonWriter writer) { } + /// + public void WriteJson(JsonWriter writer, bool full = false) { } #endregion #region Implementation of IEquatable diff --git a/src/redmine-net-api/Types/CustomFieldPossibleValue.cs b/src/redmine-net-api/Types/CustomFieldPossibleValue.cs index 0934e711..b28959e5 100644 --- a/src/redmine-net-api/Types/CustomFieldPossibleValue.cs +++ b/src/redmine-net-api/Types/CustomFieldPossibleValue.cs @@ -127,7 +127,8 @@ public void ReadJson(JsonReader reader) /// /// /// - public void WriteJson(JsonWriter writer) { } + /// + public void WriteJson(JsonWriter writer, bool full = false) { } #endregion #region Implementation of IEquatable diff --git a/src/redmine-net-api/Types/CustomFieldValue.cs b/src/redmine-net-api/Types/CustomFieldValue.cs index 0a0f1033..7588b583 100644 --- a/src/redmine-net-api/Types/CustomFieldValue.cs +++ b/src/redmine-net-api/Types/CustomFieldValue.cs @@ -128,7 +128,8 @@ public void ReadJson(JsonReader reader) /// /// /// - public void WriteJson(JsonWriter writer) + /// + public void WriteJson(JsonWriter writer, bool full = false) { } diff --git a/src/redmine-net-api/Types/Detail.cs b/src/redmine-net-api/Types/Detail.cs index 298e93b7..9b2e6d43 100644 --- a/src/redmine-net-api/Types/Detail.cs +++ b/src/redmine-net-api/Types/Detail.cs @@ -124,11 +124,13 @@ public void WriteXml(XmlWriter writer) { } #endregion #region Implementation of IJsonSerialization + /// /// /// /// - public void WriteJson(JsonWriter writer) { } + /// + public void WriteJson(JsonWriter writer, bool full = false) { } /// /// diff --git a/src/redmine-net-api/Types/Error.cs b/src/redmine-net-api/Types/Error.cs index ef6b7b7e..2ce3e3c0 100644 --- a/src/redmine-net-api/Types/Error.cs +++ b/src/redmine-net-api/Types/Error.cs @@ -105,7 +105,8 @@ public void ReadJson(JsonReader reader) /// /// /// - public void WriteJson(JsonWriter writer) { } + /// + public void WriteJson(JsonWriter writer, bool full = false) { } #endregion #region Implementation of IEquatable diff --git a/src/redmine-net-api/Types/File.cs b/src/redmine-net-api/Types/File.cs index 2afc20e1..9dfeaf38 100644 --- a/src/redmine-net-api/Types/File.cs +++ b/src/redmine-net-api/Types/File.cs @@ -185,7 +185,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.FILE)) { diff --git a/src/redmine-net-api/Types/Group.cs b/src/redmine-net-api/Types/Group.cs index 9db8382a..2646d0a2 100644 --- a/src/redmine-net-api/Types/Group.cs +++ b/src/redmine-net-api/Types/Group.cs @@ -142,7 +142,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.GROUP)) { diff --git a/src/redmine-net-api/Types/Identifiable.cs b/src/redmine-net-api/Types/Identifiable.cs index 799355b8..99cce122 100644 --- a/src/redmine-net-api/Types/Identifiable.cs +++ b/src/redmine-net-api/Types/Identifiable.cs @@ -72,7 +72,8 @@ public virtual void ReadJson(JsonReader reader) { } /// /// /// - public virtual void WriteJson(JsonWriter writer) { } + /// + public virtual void WriteJson(JsonWriter writer, bool full = false) { } #endregion #region Implementation of IEquatable> diff --git a/src/redmine-net-api/Types/IdentifiableName.cs b/src/redmine-net-api/Types/IdentifiableName.cs index 277e6929..80db0841 100644 --- a/src/redmine-net-api/Types/IdentifiableName.cs +++ b/src/redmine-net-api/Types/IdentifiableName.cs @@ -147,7 +147,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { writer.WriteIdIfNotNull(RedmineKeys.ID, this); if (!Name.IsNullOrWhiteSpace()) diff --git a/src/redmine-net-api/Types/Issue.cs b/src/redmine-net-api/Types/Issue.cs index 7864a2c5..090859f7 100644 --- a/src/redmine-net-api/Types/Issue.cs +++ b/src/redmine-net-api/Types/Issue.cs @@ -420,7 +420,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.ISSUE)) { @@ -434,16 +435,52 @@ public override void WriteJson(JsonWriter writer) } writer.WriteBoolean(RedmineKeys.IS_PRIVATE, IsPrivate); - writer.WriteIdIfNotNull(RedmineKeys.PROJECT_ID, Project); - writer.WriteIdIfNotNull(RedmineKeys.PRIORITY_ID, Priority); - writer.WriteIdIfNotNull(RedmineKeys.STATUS_ID, Status); - writer.WriteIdIfNotNull(RedmineKeys.CATEGORY_ID, Category); - writer.WriteIdIfNotNull(RedmineKeys.TRACKER_ID, Tracker); - writer.WriteIdIfNotNull(RedmineKeys.ASSIGNED_TO_ID, AssignedTo); - writer.WriteIdIfNotNull(RedmineKeys.FIXED_VERSION_ID, FixedVersion); + if (full) + { + if (Project != null) + using (new JsonObject(writer, RedmineKeys.PROJECT)) + Project.WriteJson(writer); + + if (Tracker != null) + using (new JsonObject(writer, RedmineKeys.TRACKER)) + Tracker.WriteJson(writer); + if(Status != null) + using (new JsonObject(writer, RedmineKeys.STATUS)) + Status.WriteJson(writer); + if (Priority != null) + using (new JsonObject(writer, RedmineKeys.PRIORITY)) + Priority.WriteJson(writer); + if (Author != null) + using (new JsonObject(writer, RedmineKeys.AUTHOR)) + Author.WriteJson(writer); + if (Category != null) + using (new JsonObject(writer, RedmineKeys.CATEGORY)) + Category.WriteJson(writer); + if (AssignedTo != null) + using (new JsonObject(writer, RedmineKeys.ASSIGNED_TO)) + AssignedTo.WriteJson(writer); + if (ParentIssue != null) + using (new JsonObject(writer, RedmineKeys.PARENT)) + ParentIssue.WriteJson(writer); + if (FixedVersion != null) + using (new JsonObject(writer, RedmineKeys.FIXED_VERSION)) + FixedVersion.WriteJson(writer); + + } + else + { + writer.WriteIdIfNotNull(RedmineKeys.PROJECT_ID, Project); + writer.WriteIdIfNotNull(RedmineKeys.PRIORITY_ID, Priority); + writer.WriteIdIfNotNull(RedmineKeys.STATUS_ID, Status); + writer.WriteIdIfNotNull(RedmineKeys.CATEGORY_ID, Category); + writer.WriteIdIfNotNull(RedmineKeys.TRACKER_ID, Tracker); + writer.WriteIdIfNotNull(RedmineKeys.ASSIGNED_TO_ID, AssignedTo); + writer.WriteIdIfNotNull(RedmineKeys.FIXED_VERSION_ID, FixedVersion); + writer.WriteIdOrEmpty(RedmineKeys.PARENT_ISSUE_ID, ParentIssue); + } + writer.WriteValueOrEmpty(RedmineKeys.ESTIMATED_HOURS, EstimatedHours); - writer.WriteIdOrEmpty(RedmineKeys.PARENT_ISSUE_ID, ParentIssue); writer.WriteDateOrEmpty(RedmineKeys.START_DATE, StartDate); writer.WriteDateOrEmpty(RedmineKeys.DUE_DATE, DueDate); writer.WriteDateOrEmpty(RedmineKeys.UPDATED_ON, UpdatedOn); diff --git a/src/redmine-net-api/Types/IssueCategory.cs b/src/redmine-net-api/Types/IssueCategory.cs index c7fb203e..b703f3f4 100644 --- a/src/redmine-net-api/Types/IssueCategory.cs +++ b/src/redmine-net-api/Types/IssueCategory.cs @@ -130,7 +130,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.ISSUE_CATEGORY)) { diff --git a/src/redmine-net-api/Types/IssueCustomField.cs b/src/redmine-net-api/Types/IssueCustomField.cs index d278d5fc..67b576aa 100644 --- a/src/redmine-net-api/Types/IssueCustomField.cs +++ b/src/redmine-net-api/Types/IssueCustomField.cs @@ -124,11 +124,13 @@ public override void WriteXml(XmlWriter writer) #endregion #region Implementation of IJsonSerialization + /// /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { if (Values == null) { diff --git a/src/redmine-net-api/Types/IssueRelation.cs b/src/redmine-net-api/Types/IssueRelation.cs index 7f7e8381..c8874c8b 100644 --- a/src/redmine-net-api/Types/IssueRelation.cs +++ b/src/redmine-net-api/Types/IssueRelation.cs @@ -124,11 +124,13 @@ public override void WriteXml(XmlWriter writer) #endregion #region Implementation of IJsonSerialization + /// /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { AssertValidIssueRelationType(); diff --git a/src/redmine-net-api/Types/Journal.cs b/src/redmine-net-api/Types/Journal.cs index 9558fa8a..2f7a7c54 100644 --- a/src/redmine-net-api/Types/Journal.cs +++ b/src/redmine-net-api/Types/Journal.cs @@ -147,7 +147,7 @@ public override void ReadJson(JsonReader reader) } /// - public override void WriteJson(JsonWriter writer) + public override void WriteJson(JsonWriter writer, bool full = false) { writer.WriteProperty(RedmineKeys.NOTES, Notes); } diff --git a/src/redmine-net-api/Types/MembershipRole.cs b/src/redmine-net-api/Types/MembershipRole.cs index 25af2590..84cd3cf1 100644 --- a/src/redmine-net-api/Types/MembershipRole.cs +++ b/src/redmine-net-api/Types/MembershipRole.cs @@ -98,7 +98,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { writer.WriteProperty(RedmineKeys.ID, Id.ToString(CultureInfo.InvariantCulture)); } diff --git a/src/redmine-net-api/Types/MyAccountCustomField.cs b/src/redmine-net-api/Types/MyAccountCustomField.cs index a09a6bbe..ef00760f 100644 --- a/src/redmine-net-api/Types/MyAccountCustomField.cs +++ b/src/redmine-net-api/Types/MyAccountCustomField.cs @@ -104,7 +104,7 @@ public override void ReadJson(JsonReader reader) } /// - public override void WriteJson(JsonWriter writer) + public override void WriteJson(JsonWriter writer, bool full = false) { } diff --git a/src/redmine-net-api/Types/News.cs b/src/redmine-net-api/Types/News.cs index e5fbb3b4..5bd970b1 100644 --- a/src/redmine-net-api/Types/News.cs +++ b/src/redmine-net-api/Types/News.cs @@ -180,7 +180,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.NEWS)) { diff --git a/src/redmine-net-api/Types/NewsComment.cs b/src/redmine-net-api/Types/NewsComment.cs index 48496829..4bd8995e 100644 --- a/src/redmine-net-api/Types/NewsComment.cs +++ b/src/redmine-net-api/Types/NewsComment.cs @@ -94,7 +94,7 @@ public override void ReadJson(JsonReader reader) } /// - public override void WriteJson(JsonWriter writer) + public override void WriteJson(JsonWriter writer, bool full = false) { } diff --git a/src/redmine-net-api/Types/Permission.cs b/src/redmine-net-api/Types/Permission.cs index 13fb4e9d..19a011cf 100644 --- a/src/redmine-net-api/Types/Permission.cs +++ b/src/redmine-net-api/Types/Permission.cs @@ -99,7 +99,8 @@ public void ReadJson(JsonReader reader) /// /// /// - public void WriteJson(JsonWriter writer) { } + /// + public void WriteJson(JsonWriter writer, bool full = false) { } #endregion #region Implementation of IEquatable diff --git a/src/redmine-net-api/Types/Project.cs b/src/redmine-net-api/Types/Project.cs index 44dd0c0d..5cef1301 100644 --- a/src/redmine-net-api/Types/Project.cs +++ b/src/redmine-net-api/Types/Project.cs @@ -269,7 +269,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.PROJECT)) { diff --git a/src/redmine-net-api/Types/ProjectMembership.cs b/src/redmine-net-api/Types/ProjectMembership.cs index 8ed99f79..85f983d8 100644 --- a/src/redmine-net-api/Types/ProjectMembership.cs +++ b/src/redmine-net-api/Types/ProjectMembership.cs @@ -142,7 +142,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.MEMBERSHIP)) { diff --git a/src/redmine-net-api/Types/Search.cs b/src/redmine-net-api/Types/Search.cs index d9355764..5fb067bd 100644 --- a/src/redmine-net-api/Types/Search.cs +++ b/src/redmine-net-api/Types/Search.cs @@ -87,7 +87,7 @@ public void WriteXml(XmlWriter writer) } /// - public void WriteJson(JsonWriter writer) + public void WriteJson(JsonWriter writer, bool full = false) { } diff --git a/src/redmine-net-api/Types/TimeEntry.cs b/src/redmine-net-api/Types/TimeEntry.cs index 1a088178..715b1628 100644 --- a/src/redmine-net-api/Types/TimeEntry.cs +++ b/src/redmine-net-api/Types/TimeEntry.cs @@ -202,7 +202,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.TIME_ENTRY)) { diff --git a/src/redmine-net-api/Types/Upload.cs b/src/redmine-net-api/Types/Upload.cs index 42b25a75..4c8c6f4d 100644 --- a/src/redmine-net-api/Types/Upload.cs +++ b/src/redmine-net-api/Types/Upload.cs @@ -140,7 +140,8 @@ public void ReadJson(JsonReader reader) /// /// /// - public void WriteJson(JsonWriter writer) + /// + public void WriteJson(JsonWriter writer, bool full = false) { writer.WriteStartObject(); writer.WriteProperty(RedmineKeys.TOKEN, Token); diff --git a/src/redmine-net-api/Types/User.cs b/src/redmine-net-api/Types/User.cs index 7a93bfcf..46f4dd3d 100644 --- a/src/redmine-net-api/Types/User.cs +++ b/src/redmine-net-api/Types/User.cs @@ -279,7 +279,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.USER)) { diff --git a/src/redmine-net-api/Types/Version.cs b/src/redmine-net-api/Types/Version.cs index e094ee27..07b1f007 100644 --- a/src/redmine-net-api/Types/Version.cs +++ b/src/redmine-net-api/Types/Version.cs @@ -197,7 +197,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.VERSION)) { diff --git a/src/redmine-net-api/Types/WikiPage.cs b/src/redmine-net-api/Types/WikiPage.cs index bba1fcf7..f973b953 100644 --- a/src/redmine-net-api/Types/WikiPage.cs +++ b/src/redmine-net-api/Types/WikiPage.cs @@ -183,7 +183,8 @@ public override void ReadJson(JsonReader reader) /// /// /// - public override void WriteJson(JsonWriter writer) + /// + public override void WriteJson(JsonWriter writer, bool full = false) { using (new JsonObject(writer, RedmineKeys.WIKI_PAGE)) { diff --git a/tests/redmine-net-api.Tests/Tests/Sync/IssueTests.cs b/tests/redmine-net-api.Tests/Tests/Sync/IssueTests.cs index ab3b58bd..fe22735d 100644 --- a/tests/redmine-net-api.Tests/Tests/Sync/IssueTests.cs +++ b/tests/redmine-net-api.Tests/Tests/Sync/IssueTests.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.IO; +using Newtonsoft.Json; using Padi.RedmineApi.Tests.Infrastructure; using Redmine.Net.Api; using Redmine.Net.Api.Exceptions; @@ -316,6 +318,42 @@ public void Should_Clone_Issue() Assert.True(issueToClone.CustomFields.Count != clonedIssue.CustomFields.Count); } + [Fact, Order(15)] + public void Should_Issue_Be_Equal() + { + const string ISSUE_ID = "96"; + + var issue = fixture.RedmineManager.GetObject(ISSUE_ID, new NameValueCollection + { + { RedmineKeys.INCLUDE, $"{RedmineKeys.CHILDREN},{RedmineKeys.ATTACHMENTS},{RedmineKeys.RELATIONS},{RedmineKeys.CHANGE_SETS},{RedmineKeys.JOURNALS},{RedmineKeys.WATCHERS}" } + }); + + Assert.NotNull(issue); + + var json = string.Empty; + using (var swriter = new StringWriter()) + { + using (var writer = new JsonTextWriter(swriter)) + { + issue.WriteJson(writer); + json = swriter.ToString(); + Assert.False(string.IsNullOrWhiteSpace(json)); + } + } + + using (var sreader = new StringReader(json)) + { + using (var reader = new JsonTextReader(sreader)) + { + var issue2 = new Issue(); + issue2.ReadJson(reader); + Assert.Equal(issue, issue2); + } + } + + } + + [Fact] public void Should_Get_Issue_With_Hours() {