diff --git a/SharpBucket/V2/EndPoints/IssuesResource.cs b/SharpBucket/V2/EndPoints/IssuesResource.cs index 4fa85cd..a506489 100644 --- a/SharpBucket/V2/EndPoints/IssuesResource.cs +++ b/SharpBucket/V2/EndPoints/IssuesResource.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Threading; - +using System.Threading.Tasks; using SharpBucket.V2.Pocos; namespace SharpBucket.V2.EndPoints @@ -66,6 +66,27 @@ public IAsyncEnumerable EnumerateIssuesAsync(EnumerateParameters paramete } #endif + /// + /// Creates a new issue in the specified repository. + /// + /// The issue to create. + /// The created issue. + public Issue PostIssue(Issue issue) + { + return SharpBucketV2.Post(issue, BaseUrl); + } + + /// + /// Creates a new issue in the specified repository. + /// + /// The issue to create. + /// The cancellation token. + /// The created issue. + public Task PostIssueAsync(Issue issue, CancellationToken token = default) + { + return SharpBucketV2.PostAsync(issue, BaseUrl, token); + } + #region Issue Resource /// diff --git a/SharpBucket/V2/RequestExecutorV2.cs b/SharpBucket/V2/RequestExecutorV2.cs index 7f92bc2..aedde3d 100644 --- a/SharpBucket/V2/RequestExecutorV2.cs +++ b/SharpBucket/V2/RequestExecutorV2.cs @@ -63,6 +63,15 @@ private class JsonSerializerStrategy : PocoJsonSerializerStrategy { protected override object SerializeEnum(Enum p) { + if (p is IssuePriority) + return p.ToString().ToLower(); + + if (p is IssueKind) + return p.ToString().ToLower(); + + if (p is IssueStatus) + return p.ToString().ToLower(); + return p.ToString(); } diff --git a/SharpBucketTests/V2/EndPoints/IssuesResourceTests.cs b/SharpBucketTests/V2/EndPoints/IssuesResourceTests.cs index 4db51b5..ec0a6ea 100644 --- a/SharpBucketTests/V2/EndPoints/IssuesResourceTests.cs +++ b/SharpBucketTests/V2/EndPoints/IssuesResourceTests.cs @@ -4,6 +4,8 @@ using NUnit.Framework; using SharpBucket.V2; using SharpBucket.V2.EndPoints; +using SharpBucket.V2.Pocos; +using SharpBucketTests.V2.Pocos; using Shouldly; namespace SharpBucketTests.V2.EndPoints @@ -100,5 +102,85 @@ public void EnumerateIssuesAsync_NotExistingRepository_ThrowException() async () => await NotExistingRepository.EnumerateIssuesAsync().ToListAsync()); exception.HttpStatusCode.ShouldBe(HttpStatusCode.NotFound); } + + [Test] + public void PostIssue_NewIssue_IssueIsCreated() + { + var issueResource = SampleRepositories.TestRepository.RepositoryResource.IssuesResource(); + var initialIssues = issueResource.ListIssues(); + var newIssue = new Issue + { + title = "newIssue", + kind = IssueKind.Task, + state = IssueStatus.Open, + priority = IssuePriority.Minor + }; + + var createdIssue = issueResource.PostIssue(newIssue); + + createdIssue.ShouldBeFilled(); + createdIssue.title.ShouldBe(newIssue.title); + createdIssue.kind.ShouldBe(newIssue.kind); + createdIssue.state.ShouldBe(newIssue.state); + createdIssue.priority.ShouldBe(newIssue.priority); + + var currentIssues = issueResource.ListIssues(); + currentIssues.Count.ShouldBeGreaterThan(initialIssues.Count); + } + + [Test] + public void PostIssue_IssueWithNullTitle_ThrowsException() + { + var issueResource = SampleRepositories.TestRepository.RepositoryResource.IssuesResource(); + var newIssue = new Issue + { + title = null, + kind = IssueKind.Task, + state = IssueStatus.Open, + priority = IssuePriority.Minor + }; + + Should.Throw(() => issueResource.PostIssue(newIssue)); + } + + [Test] + public async Task PostIssueAsync_NewIssue_IssueIsCreated() + { + var issueResource = SampleRepositories.TestRepository.RepositoryResource.IssuesResource(); + var initialIssues = issueResource.ListIssues(); + var newIssue = new Issue + { + title = "newIssue", + kind = IssueKind.Task, + state = IssueStatus.Open, + priority = IssuePriority.Minor + }; + + var createdIssue = await issueResource.PostIssueAsync(newIssue); + + createdIssue.ShouldBeFilled(); + createdIssue.title.ShouldBe(newIssue.title); + createdIssue.kind.ShouldBe(newIssue.kind); + createdIssue.state.ShouldBe(newIssue.state); + createdIssue.priority.ShouldBe(newIssue.priority); + + var currentIssues = issueResource.ListIssues(); + currentIssues.Count.ShouldBeGreaterThan(initialIssues.Count); + } + + [Test] + public async Task PostIssueAsync_IssueWithNullTitle_ThrowsException() + { + var issueResource = SampleRepositories.TestRepository.RepositoryResource.IssuesResource(); + var newIssue = new Issue + { + title = null, + kind = IssueKind.Task, + state = IssueStatus.Open, + priority = IssuePriority.Minor + }; + + Should.Throw(async () => await issueResource.PostIssueAsync(newIssue)); + } } } diff --git a/SharpBucketTests/V2/Pocos/IssueAssertions.cs b/SharpBucketTests/V2/Pocos/IssueAssertions.cs new file mode 100644 index 0000000..e8823ca --- /dev/null +++ b/SharpBucketTests/V2/Pocos/IssueAssertions.cs @@ -0,0 +1,17 @@ +using SharpBucket.V2.Pocos; +using Shouldly; + +namespace SharpBucketTests.V2.Pocos +{ + public static class IssueAssertions + { + public static void ShouldBeFilled(this Issue issue) + { + issue.ShouldNotBeNull(); + issue.content.ShouldNotBeNull(); + issue.links.ShouldNotBeNull(); + issue.reporter.ShouldBeFilled(); + issue.repository.ShouldNotBeNull(); + } + } +} \ No newline at end of file