diff --git a/src/main/scala/gitbucket/core/api/AddLabelsToAnIssue.scala b/src/main/scala/gitbucket/core/api/AddLabelsToAnIssue.scala new file mode 100644 index 0000000..cd6f5eb --- /dev/null +++ b/src/main/scala/gitbucket/core/api/AddLabelsToAnIssue.scala @@ -0,0 +1,6 @@ +package gitbucket.core.api + +/** + * https://developer.github.com/v3/issues/labels/#add-labels-to-an-issue + */ +case class AddLabelsToAnIssue(labels: Seq[String]) diff --git a/src/main/scala/gitbucket/core/controller/api/ApiIssueLabelControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiIssueLabelControllerBase.scala index 688b498..b06dcee 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiIssueLabelControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiIssueLabelControllerBase.scala @@ -1,5 +1,5 @@ package gitbucket.core.controller.api -import gitbucket.core.api.{ApiError, ApiLabel, CreateALabel, JsonFormat} +import gitbucket.core.api.{AddLabelsToAnIssue, ApiError, ApiLabel, CreateALabel, JsonFormat} import gitbucket.core.controller.ControllerBase import gitbucket.core.service._ import gitbucket.core.util.Implicits._ @@ -121,10 +121,10 @@ */ post("/api/v3/repos/:owner/:repository/issues/:id/labels")(writableUsersOnly { repository => JsonFormat(for { - data <- extractFromJsonBody[Seq[String]] + data <- extractFromJsonBody[AddLabelsToAnIssue] issueId <- params("id").toIntOpt } yield { - data.map { labelName => + data.labels.map { labelName => val label = getLabel(repository.owner, repository.name, labelName).getOrElse( getLabel( repository.owner, @@ -160,11 +160,11 @@ */ put("/api/v3/repos/:owner/:repository/issues/:id/labels")(writableUsersOnly { repository => JsonFormat(for { - data <- extractFromJsonBody[Seq[String]] + data <- extractFromJsonBody[AddLabelsToAnIssue] issueId <- params("id").toIntOpt } yield { deleteAllIssueLabels(repository.owner, repository.name, issueId, true) - data.map { labelName => + data.labels.map { labelName => val label = getLabel(repository.owner, repository.name, labelName).getOrElse( getLabel( repository.owner, diff --git a/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala b/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala index 2b34dbf..97933a4 100644 --- a/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala +++ b/src/test/scala/gitbucket/core/api/ApiIntegrationTest.scala @@ -204,4 +204,75 @@ } } + test("issue labels") { + Using.resource(new TestingGitBucketServer(19999)) { server => + val github = server.client("root", "root") + + val repo = github.createRepository("issue_label_test").autoInit(true).create() + val issue = repo.createIssue("test").create() + + // Initial label state + { + val labels = repo.getIssue(issue.getNumber).getLabels + assert(labels.size() == 0) + } + + // Add labels + { + issue.addLabels("bug", "duplicate") + + val labels = repo.getIssue(issue.getNumber).getLabels + assert(labels.size() == 2) + + val i = labels.iterator() + val label1 = i.next() + assert(label1.getName == "bug") + assert(label1.getColor == "fc2929") + assert(label1.getUrl == "http://localhost:19999/api/v3/repos/root/issue_label_test/labels/bug") + + val label2 = i.next() + assert(label2.getName == "duplicate") + assert(label2.getColor == "cccccc") + assert(label2.getUrl == "http://localhost:19999/api/v3/repos/root/issue_label_test/labels/duplicate") + } + + // Remove a label + { + issue.removeLabel("duplicate") + + val labels = repo.getIssue(issue.getNumber).getLabels + assert(labels.size() == 1) + + val i = labels.iterator() + val label1 = i.next() + assert(label1.getName == "bug") + assert(label1.getColor == "fc2929") + assert(label1.getUrl == "http://localhost:19999/api/v3/repos/root/issue_label_test/labels/bug") + } + + // Replace labels (Cannot test because GHLabel.setLabels() doesn't use the replace endpoint) +// { +// issue.setLabels("enhancement", "invalid", "question") +// +// val labels = repo.getIssue(issue.getNumber).getLabels +// assert(labels.size() == 3) +// +// val i = labels.iterator() +// val label1 = i.next() +// assert(label1.getName == "enhancement") +// assert(label1.getColor == "84b6eb") +// assert(label1.getUrl == "http://localhost:19999/api/v3/repos/root/issue_label_test/labels/enhancement") +// +// val label2 = i.next() +// assert(label2.getName == "invalid") +// assert(label2.getColor == "e6e6e6") +// assert(label2.getUrl == "http://localhost:19999/api/v3/repos/root/issue_label_test/labels/invalid") +// +// val label3 = i.next() +// assert(label3.getName == "question") +// assert(label3.getColor == "cc317c") +// assert(label3.getUrl == "http://localhost:19999/api/v3/repos/root/issue_label_test/labels/question") +// } + } + } }