From 625a3141f267cd5df08746591cb3170dbea89505 Mon Sep 17 00:00:00 2001 From: Mario Sica-Teasdale Date: Wed, 20 Oct 2021 11:30:50 -0400 Subject: [PATCH 1/3] Implement projectIssueNote mock --- NGitLab.Mock/Clients/IssueClient.cs | 1 + .../Clients/ProjectIssueNoteClient.cs | 53 ++++++++++++++++--- NGitLab.Mock/Issue.cs | 6 +++ NGitLab.Mock/Note.cs | 3 ++ NGitLab.Mock/ProjectIssueNote.cs | 28 ++++++++++ NGitLab/Models/Issue.cs | 3 ++ NGitLab/Models/IssueCreate.cs | 3 ++ NGitLab/Models/Note.cs | 3 ++ NGitLab/Models/ProjectIssueNote.cs | 3 ++ NGitLab/Models/ProjectIssueNoteCreate.cs | 3 ++ 10 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 NGitLab.Mock/ProjectIssueNote.cs diff --git a/NGitLab.Mock/Clients/IssueClient.cs b/NGitLab.Mock/Clients/IssueClient.cs index ec56d1cf..e9971ce7 100644 --- a/NGitLab.Mock/Clients/IssueClient.cs +++ b/NGitLab.Mock/Clients/IssueClient.cs @@ -38,6 +38,7 @@ public Models.Issue Create(IssueCreate issueCreate) Description = issueCreate.Description, Title = issueCreate.Title, Author = Context.User, + Confidential = issueCreate.Confidential, }; if (!string.IsNullOrEmpty(issueCreate.Labels)) diff --git a/NGitLab.Mock/Clients/ProjectIssueNoteClient.cs b/NGitLab.Mock/Clients/ProjectIssueNoteClient.cs index bcba8e5c..a29a4da2 100644 --- a/NGitLab.Mock/Clients/ProjectIssueNoteClient.cs +++ b/NGitLab.Mock/Clients/ProjectIssueNoteClient.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Linq; + using NGitLab.Models; namespace NGitLab.Mock.Clients @@ -14,24 +16,59 @@ public ProjectIssueNoteClient(ClientContext context, int projectId) _projectId = projectId; } - public ProjectIssueNote Create(ProjectIssueNoteCreate create) + public Models.ProjectIssueNote Create(ProjectIssueNoteCreate create) { - throw new NotImplementedException(); + using (Context.BeginOperationScope()) + { + var project = GetProject(_projectId, ProjectPermission.Contribute); + var issue = project.Issues.First(iss => iss.Id == create.IssueId); + + var projectIssueNote = new ProjectIssueNote + { + Body = create.Body, + Confidential = create.Confidential, + Author = Context.User, + }; + issue.Notes.Add(projectIssueNote); + + return projectIssueNote.ToProjectIssueNote(); + } } - public ProjectIssueNote Edit(ProjectIssueNoteEdit edit) + public Models.ProjectIssueNote Edit(ProjectIssueNoteEdit edit) { - throw new NotImplementedException(); + using (Context.BeginOperationScope()) + { + var project = GetProject(_projectId, ProjectPermission.Contribute); + var issue = project.Issues.First(iss => iss.Id == edit.IssueId); + var note = issue.Notes.First(n => (int)n.Id == edit.NoteId); + + note.Body = edit.Body; + + return note.ToProjectIssueNote(); + } } - public IEnumerable ForIssue(int issueId) + public IEnumerable ForIssue(int issueId) { - throw new NotImplementedException(); + using (Context.BeginOperationScope()) + { + var project = GetProject(_projectId, ProjectPermission.Contribute); + var issue = project.Issues.First(iss => iss.Id == issueId); + + return issue.Notes.Select(n => n.ToProjectIssueNote()); + } } - public ProjectIssueNote Get(int issueId, int noteId) + public Models.ProjectIssueNote Get(int issueId, int noteId) { - throw new NotImplementedException(); + using (Context.BeginOperationScope()) + { + var project = GetProject(_projectId, ProjectPermission.Contribute); + var issue = project.Issues.First(iss => iss.Id == issueId); + + return issue.Notes.First(n => (int)n.Id == noteId).ToProjectIssueNote(); + } } } } diff --git a/NGitLab.Mock/Issue.cs b/NGitLab.Mock/Issue.cs index f69d4b5a..942e06c6 100644 --- a/NGitLab.Mock/Issue.cs +++ b/NGitLab.Mock/Issue.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -38,6 +39,10 @@ public UserRef Assignee public DateTimeOffset? ClosedAt { get; set; } + public bool Confidential { get; set; } + + public IList Notes { get; set; } + public string WebUrl => Server.MakeUrl($"{Project.PathWithNamespace}/-/issues/{Iid.ToString(CultureInfo.InvariantCulture)}"); public IssueState State @@ -87,6 +92,7 @@ public Models.Issue ToClientIssue() CreatedAt = CreatedAt.UtcDateTime, UpdatedAt = UpdatedAt.UtcDateTime, WebUrl = WebUrl, + Confidential = Confidential, }; } } diff --git a/NGitLab.Mock/Note.cs b/NGitLab.Mock/Note.cs index 477ec32f..5065eff1 100644 --- a/NGitLab.Mock/Note.cs +++ b/NGitLab.Mock/Note.cs @@ -34,6 +34,8 @@ protected Note() public bool Resolved { get; set; } + public bool Confidential { get; set; } + public Models.Note ToClientEvent() { return new Models.Note @@ -46,6 +48,7 @@ public Models.Note ToClientEvent() System = System, Resolved = Resolved, UpdatedAt = UpdatedAt.UtcDateTime, + Confidential = Confidential, }; } } diff --git a/NGitLab.Mock/ProjectIssueNote.cs b/NGitLab.Mock/ProjectIssueNote.cs new file mode 100644 index 00000000..0774adce --- /dev/null +++ b/NGitLab.Mock/ProjectIssueNote.cs @@ -0,0 +1,28 @@ +namespace NGitLab.Mock +{ + public sealed class ProjectIssueNote : Note + { + public new Issue Parent => (Issue)base.Parent; + + public override string NoteableType => "Issue"; + + public override int NoticableId => Parent.Id; + + public override int NoticableIid => Parent.Iid; + + internal Models.ProjectIssueNote ToProjectIssueNote() + { + return new Models.ProjectIssueNote + { + NoteId = (int)Id, + Body = Body, + Author = Author.ToClientAuthor(), + CreatedAt = CreatedAt.UtcDateTime, + UpdatedAt = UpdatedAt.UtcDateTime, + System = System, + Resolvable = Resolvable, + Confidential = Confidential, + }; + } + } +} diff --git a/NGitLab/Models/Issue.cs b/NGitLab/Models/Issue.cs index 9d38c2c0..e27e405e 100644 --- a/NGitLab/Models/Issue.cs +++ b/NGitLab/Models/Issue.cs @@ -56,5 +56,8 @@ public class Issue [DataMember(Name = "epic")] public IssueEpic Epic; + + [DataMember(Name = "confidential")] + public bool Confidential; } } diff --git a/NGitLab/Models/IssueCreate.cs b/NGitLab/Models/IssueCreate.cs index 046c43b2..456bafb3 100644 --- a/NGitLab/Models/IssueCreate.cs +++ b/NGitLab/Models/IssueCreate.cs @@ -25,5 +25,8 @@ public class IssueCreate [DataMember(Name = "labels")] public string Labels; + + [DataMember(Name = "confidential")] + public bool Confidential; } } diff --git a/NGitLab/Models/Note.cs b/NGitLab/Models/Note.cs index 3e4490e8..84bc2922 100644 --- a/NGitLab/Models/Note.cs +++ b/NGitLab/Models/Note.cs @@ -32,5 +32,8 @@ public class Note [DataMember(Name = "system")] public bool System; + + [DataMember(Name = "confidential")] + public bool Confidential; } } diff --git a/NGitLab/Models/ProjectIssueNote.cs b/NGitLab/Models/ProjectIssueNote.cs index bca3727a..b50fad3f 100644 --- a/NGitLab/Models/ProjectIssueNote.cs +++ b/NGitLab/Models/ProjectIssueNote.cs @@ -38,5 +38,8 @@ public class ProjectIssueNote [DataMember(Name = "resolvable")] public bool Resolvable; + + [DataMember(Name = "confidential")] + public bool Confidential; } } diff --git a/NGitLab/Models/ProjectIssueNoteCreate.cs b/NGitLab/Models/ProjectIssueNoteCreate.cs index 830eb328..fc734ea8 100644 --- a/NGitLab/Models/ProjectIssueNoteCreate.cs +++ b/NGitLab/Models/ProjectIssueNoteCreate.cs @@ -11,5 +11,8 @@ public class ProjectIssueNoteCreate [Required] [DataMember(Name = "body")] public string Body; + + [DataMember(Name = "confidential")] + public bool Confidential; } } From df7a49278d6e0b0ab12a9c9effa1abf6b0630ff3 Mon Sep 17 00:00:00 2001 From: MarioSicaTeasdale Date: Wed, 20 Oct 2021 15:06:23 -0400 Subject: [PATCH 2/3] Fix publicAPI --- NGitLab.Mock/PublicAPI.Unshipped.txt | 12 ++++++++++++ NGitLab/PublicAPI.Unshipped.txt | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/NGitLab.Mock/PublicAPI.Unshipped.txt b/NGitLab.Mock/PublicAPI.Unshipped.txt index 61ce75f7..4e8719ce 100644 --- a/NGitLab.Mock/PublicAPI.Unshipped.txt +++ b/NGitLab.Mock/PublicAPI.Unshipped.txt @@ -391,6 +391,8 @@ NGitLab.Mock.Issue.Author.get -> NGitLab.Mock.UserRef NGitLab.Mock.Issue.Author.set -> void NGitLab.Mock.Issue.ClosedAt.get -> System.DateTimeOffset? NGitLab.Mock.Issue.ClosedAt.set -> void +NGitLab.Mock.Issue.Confidential.get -> bool +NGitLab.Mock.Issue.Confidential.set -> void NGitLab.Mock.Issue.CreatedAt.get -> System.DateTimeOffset NGitLab.Mock.Issue.Description.get -> string NGitLab.Mock.Issue.Description.set -> void @@ -403,6 +405,8 @@ NGitLab.Mock.Issue.Labels.get -> string[] NGitLab.Mock.Issue.Labels.set -> void NGitLab.Mock.Issue.Milestone.get -> NGitLab.Mock.Milestone NGitLab.Mock.Issue.Milestone.set -> void +NGitLab.Mock.Issue.Notes.get -> System.Collections.Generic.IList +NGitLab.Mock.Issue.Notes.set -> void NGitLab.Mock.Issue.Project.get -> NGitLab.Mock.Project NGitLab.Mock.Issue.ProjectId.get -> int NGitLab.Mock.Issue.State.get -> NGitLab.Mock.IssueState @@ -580,6 +584,8 @@ NGitLab.Mock.Note.Author.get -> NGitLab.Mock.UserRef NGitLab.Mock.Note.Author.set -> void NGitLab.Mock.Note.Body.get -> string NGitLab.Mock.Note.Body.set -> void +NGitLab.Mock.Note.Confidential.get -> bool +NGitLab.Mock.Note.Confidential.set -> void NGitLab.Mock.Note.CreatedAt.get -> System.DateTimeOffset NGitLab.Mock.Note.CreatedAt.set -> void NGitLab.Mock.Note.Id.get -> long @@ -753,6 +759,9 @@ NGitLab.Mock.ProjectHook.WikiPagesEvents.get -> bool NGitLab.Mock.ProjectHook.WikiPagesEvents.set -> void NGitLab.Mock.ProjectHookCollection NGitLab.Mock.ProjectHookCollection.ProjectHookCollection(NGitLab.Mock.GitLabObject container) -> void +NGitLab.Mock.ProjectIssueNote +NGitLab.Mock.ProjectIssueNote.ProjectIssueNote() -> void +NGitLab.Mock.ProjectIssueNote.Parent.get -> NGitLab.Mock.Issue NGitLab.Mock.ReleaseCollection NGitLab.Mock.ReleaseCollection.Add(string tagName, string name, string description, NGitLab.Mock.User user) -> NGitLab.Mock.ReleaseInfo NGitLab.Mock.ReleaseCollection.Add(string tagName, string name, string reference, string description, NGitLab.Mock.User user) -> NGitLab.Mock.ReleaseInfo @@ -949,6 +958,9 @@ override NGitLab.Mock.NoteCollection.Add(T item) -> void override NGitLab.Mock.PipelineCollection.Add(NGitLab.Mock.Pipeline pipeline) -> void override NGitLab.Mock.ProjectCollection.Add(NGitLab.Mock.Project project) -> void override NGitLab.Mock.ProjectHookCollection.Add(NGitLab.Mock.ProjectHook item) -> void +override NGitLab.Mock.ProjectIssueNote.NoteableType.get -> string +override NGitLab.Mock.ProjectIssueNote.NoticableId.get -> int +override NGitLab.Mock.ProjectIssueNote.NoticableIid.get -> int override NGitLab.Mock.ReleaseCollection.Add(NGitLab.Mock.ReleaseInfo release) -> void override NGitLab.Mock.RunnerCollection.Add(NGitLab.Mock.Runner item) -> void override NGitLab.Mock.RunnerRef.Equals(object obj) -> bool diff --git a/NGitLab/PublicAPI.Unshipped.txt b/NGitLab/PublicAPI.Unshipped.txt index fbc4bedf..2d5fa422 100644 --- a/NGitLab/PublicAPI.Unshipped.txt +++ b/NGitLab/PublicAPI.Unshipped.txt @@ -1467,6 +1467,7 @@ NGitLab.Models.Issue NGitLab.Models.Issue.Assignee -> NGitLab.Models.Assignee NGitLab.Models.Issue.Assignees -> NGitLab.Models.Assignee[] NGitLab.Models.Issue.Author -> NGitLab.Models.Author +NGitLab.Models.Issue.Confidential -> bool NGitLab.Models.Issue.CreatedAt -> System.DateTime NGitLab.Models.Issue.Description -> string NGitLab.Models.Issue.DueDate -> System.DateTime? @@ -1485,6 +1486,7 @@ NGitLab.Models.Issue.UpdatedAt -> System.DateTime NGitLab.Models.Issue.WebUrl -> string NGitLab.Models.IssueCreate NGitLab.Models.IssueCreate.AssigneeId -> int? +NGitLab.Models.IssueCreate.Confidential -> bool NGitLab.Models.IssueCreate.Description -> string NGitLab.Models.IssueCreate.Id -> int NGitLab.Models.IssueCreate.IssueCreate() -> void @@ -1937,6 +1939,7 @@ NGitLab.Models.Note NGitLab.Models.Note.Author.get -> NGitLab.Models.User NGitLab.Models.Note.Author.set -> void NGitLab.Models.Note.Body -> string +NGitLab.Models.Note.Confidential -> bool NGitLab.Models.Note.CreatedAt -> System.DateTime NGitLab.Models.Note.Id -> long NGitLab.Models.Note.Note() -> void @@ -2165,6 +2168,7 @@ NGitLab.Models.ProjectIssueNote NGitLab.Models.ProjectIssueNote.Attachment -> string NGitLab.Models.ProjectIssueNote.Author -> NGitLab.Models.Author NGitLab.Models.ProjectIssueNote.Body -> string +NGitLab.Models.ProjectIssueNote.Confidential -> bool NGitLab.Models.ProjectIssueNote.CreatedAt -> System.DateTime NGitLab.Models.ProjectIssueNote.NoteableId -> int NGitLab.Models.ProjectIssueNote.NoteableType -> string @@ -2176,6 +2180,7 @@ NGitLab.Models.ProjectIssueNote.System -> bool NGitLab.Models.ProjectIssueNote.UpdatedAt -> System.DateTime NGitLab.Models.ProjectIssueNoteCreate NGitLab.Models.ProjectIssueNoteCreate.Body -> string +NGitLab.Models.ProjectIssueNoteCreate.Confidential -> bool NGitLab.Models.ProjectIssueNoteCreate.IssueId -> int NGitLab.Models.ProjectIssueNoteCreate.ProjectIssueNoteCreate() -> void NGitLab.Models.ProjectIssueNoteEdit From b2a9d985139f353c3475abbe5acb74d18888d5ef Mon Sep 17 00:00:00 2001 From: MarioSicaTeasdale Date: Wed, 20 Oct 2021 16:28:12 -0400 Subject: [PATCH 3/3] Handle issue/note null case in ProjectIssueNoteClient Mock --- .../Clients/ProjectIssueNoteClient.cs | 44 +++++++++++++------ 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/NGitLab.Mock/Clients/ProjectIssueNoteClient.cs b/NGitLab.Mock/Clients/ProjectIssueNoteClient.cs index a29a4da2..83f5135c 100644 --- a/NGitLab.Mock/Clients/ProjectIssueNoteClient.cs +++ b/NGitLab.Mock/Clients/ProjectIssueNoteClient.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using NGitLab.Models; @@ -20,8 +19,7 @@ public Models.ProjectIssueNote Create(ProjectIssueNoteCreate create) { using (Context.BeginOperationScope()) { - var project = GetProject(_projectId, ProjectPermission.Contribute); - var issue = project.Issues.First(iss => iss.Id == create.IssueId); + var issue = GetIssue(create.IssueId); var projectIssueNote = new ProjectIssueNote { @@ -39,9 +37,7 @@ public Models.ProjectIssueNote Edit(ProjectIssueNoteEdit edit) { using (Context.BeginOperationScope()) { - var project = GetProject(_projectId, ProjectPermission.Contribute); - var issue = project.Issues.First(iss => iss.Id == edit.IssueId); - var note = issue.Notes.First(n => (int)n.Id == edit.NoteId); + var note = GetIssueNote(edit.IssueId, edit.NoteId); note.Body = edit.Body; @@ -53,10 +49,7 @@ public Models.ProjectIssueNote Edit(ProjectIssueNoteEdit edit) { using (Context.BeginOperationScope()) { - var project = GetProject(_projectId, ProjectPermission.Contribute); - var issue = project.Issues.First(iss => iss.Id == issueId); - - return issue.Notes.Select(n => n.ToProjectIssueNote()); + return GetIssue(issueId).Notes.Select(n => n.ToProjectIssueNote()); } } @@ -64,11 +57,34 @@ public Models.ProjectIssueNote Get(int issueId, int noteId) { using (Context.BeginOperationScope()) { - var project = GetProject(_projectId, ProjectPermission.Contribute); - var issue = project.Issues.First(iss => iss.Id == issueId); + return GetIssueNote(issueId, noteId).ToProjectIssueNote(); + } + } + + private Issue GetIssue(int issueId) + { + var project = GetProject(_projectId, ProjectPermission.Contribute); + var issue = project.Issues.FirstOrDefault(iss => iss.Id == issueId); + + if (issue == null) + { + throw new GitLabNotFoundException("Issue does not exist."); + } + + return issue; + } - return issue.Notes.First(n => (int)n.Id == noteId).ToProjectIssueNote(); + private ProjectIssueNote GetIssueNote(int issueId, int issueNoteId) + { + var issue = GetIssue(issueId); + var note = issue.Notes.FirstOrDefault(n => (int)n.Id == issueNoteId); + + if (note == null) + { + throw new GitLabNotFoundException("Issue Note does not exist."); } + + return note; } } }