@Test
  public void should_unassign() {
    HttpRequestFactory requestFactory = new HttpRequestFactory(httpServer.url());
    httpServer.stubResponseBody("{\"issue\": {\"key\": \"ABCDE\"}}");

    IssueClient client = new DefaultIssueClient(requestFactory);
    Issue result = client.assign("ABCDE", null);

    assertThat(httpServer.requestedPath()).isEqualTo("/api/issues/assign");
    assertThat(httpServer.requestParams()).includes(entry("issue", "ABCDE"));
    assertThat(result).isNotNull();
  }
  @Test
  public void should_find_issues() {
    HttpRequestFactory requestFactory = new HttpRequestFactory(httpServer.url());
    httpServer.stubResponseBody("{\"issues\": [{\"key\": \"ABCDE\"}]}");

    IssueClient client = new DefaultIssueClient(requestFactory);
    IssueQuery query = IssueQuery.create().issues("ABCDE");
    Issues issues = client.find(query);

    assertThat(httpServer.requestedPath()).isEqualTo("/api/issues/search?issues=ABCDE");
    assertThat(issues.list()).hasSize(1);
    assertThat(issues.list().get(0).key()).isEqualTo("ABCDE");
  }
  @Test
  public void should_create_issue() {
    HttpRequestFactory requestFactory = new HttpRequestFactory(httpServer.url());
    httpServer.stubResponseBody("{\"issue\": {\"key\": \"ABCDE\"}}");

    IssueClient client = new DefaultIssueClient(requestFactory);
    Issue result =
        client.create(NewIssue.create().component("Action.java").rule("squid:AvoidCycle"));

    assertThat(httpServer.requestedPath()).isEqualTo("/api/issues/create");
    assertThat(httpServer.requestParams())
        .includes(entry("component", "Action.java"), entry("rule", "squid:AvoidCycle"));
    assertThat(result).isNotNull();
  }
  @Test
  public void should_fail_to_find_issues() {
    HttpRequestFactory requestFactory = new HttpRequestFactory(httpServer.url());
    httpServer.stubStatusCode(500);

    IssueClient client = new DefaultIssueClient(requestFactory);
    try {
      client.find(IssueQuery.create());
      fail();
    } catch (HttpException e) {
      assertThat(e.status()).isEqualTo(500);
      assertThat(e.url()).startsWith("http://localhost");
      assertThat(e.url()).endsWith("/api/issues/search");
    }
  }
  @Test
  public void should_get_actions() {
    HttpRequestFactory requestFactory = new HttpRequestFactory(httpServer.url());
    httpServer.stubResponseBody(
        "{\n"
            + "  \"actions\": [\n"
            + "    \"link-to-jira\",\n"
            + "    \"tweet\"\n"
            + "  ]\n"
            + "}");

    IssueClient client = new DefaultIssueClient(requestFactory);
    List<String> actions = client.actions("ABCDE");

    assertThat(httpServer.requestedPath()).isEqualTo("/api/issues/actions?issue=ABCDE");
    assertThat(actions).hasSize(2);
    assertThat(actions).containsOnly("link-to-jira", "tweet");
  }
  @Test
  public void should_get_transitions() {
    HttpRequestFactory requestFactory = new HttpRequestFactory(httpServer.url());
    httpServer.stubResponseBody(
        "{\n"
            + "  \"transitions\": [\n"
            + "    \"resolve\",\n"
            + "    \"falsepositive\"\n"
            + "  ]\n"
            + "}");

    IssueClient client = new DefaultIssueClient(requestFactory);
    List<String> transitions = client.transitions("ABCDE");

    assertThat(httpServer.requestedPath()).isEqualTo("/api/issues/transitions?issue=ABCDE");
    assertThat(transitions).hasSize(2);
    assertThat(transitions).containsOnly("resolve", "falsepositive");
  }
  @Test
  public void should_add_comment() throws Exception {
    HttpRequestFactory requestFactory = new HttpRequestFactory(httpServer.url());
    httpServer.stubResponseBody(
        IOUtils.toString(
            getClass()
                .getResourceAsStream(
                    "/org/sonar/wsclient/issue/internal/DefaultIssueClientTest/add_comment_result.json")));

    IssueClient client = new DefaultIssueClient(requestFactory);
    IssueComment comment = client.addComment("ISSUE-1", "this is my comment");

    assertThat(httpServer.requestedPath()).isEqualTo("/api/issues/add_comment");
    assertThat(httpServer.requestParams())
        .includes(entry("issue", "ISSUE-1"), entry("text", "this is my comment"));
    assertThat(comment).isNotNull();
    assertThat(comment.key()).isEqualTo("COMMENT-123");
    assertThat(comment.htmlText()).isEqualTo("this is my comment");
    assertThat(comment.login()).isEqualTo("admin");
    assertThat(comment.createdAt().getDate()).isEqualTo(18);
  }
  @Test
  public void should_do_bulk_change() {
    HttpRequestFactory requestFactory = new HttpRequestFactory(httpServer.url());
    httpServer.stubResponseBody(
        "{\"issuesChanged\": {\"total\": 2}, \"issuesNotChanged\": {\"total\": 1, \"issues\": [\"06ed4db6-fd96-450a-bcb0-e0184db50105\"]} }");

    BulkChangeQuery query =
        BulkChangeQuery.create()
            .issues("ABCD", "EFGH")
            .actions("assign")
            .actionParameter("assign", "assignee", "geoffrey");

    IssueClient client = new DefaultIssueClient(requestFactory);
    BulkChange result = client.bulkChange(query);

    assertThat(httpServer.requestedPath()).isEqualTo("/api/issues/bulk_change");
    assertThat(httpServer.requestParams())
        .includes(
            entry("assign.assignee", "geoffrey"),
            entry("issues", "ABCD,EFGH"),
            entry("actions", "assign"));
    assertThat(result).isNotNull();
  }