@Test
  public void groups_does_POST_on_WS_groups() {
    GroupsWsRequest request = new GroupsWsRequest();
    underTest.groups(
        request
            .setPermission(PERMISSION_VALUE)
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE)
            .setPage(PAGE_VALUE)
            .setPageSize(PAGE_SIZE_VALUE)
            .setSelected(SELECTED_VALUE)
            .setQuery(QUERY_VALUE));

    assertThat(serviceTester.getGetParser()).isSameAs(WsPermissions.WsGroupsResponse.parser());
    GetRequest getRequest = serviceTester.getGetRequest();
    serviceTester
        .assertThat(getRequest)
        .hasPath("groups")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .hasParam(PARAM_P, PAGE_VALUE)
        .hasParam(PARAM_PS, PAGE_SIZE_VALUE)
        .hasParam(PARAM_SELECTED, SELECTED_VALUE)
        .hasParam(PARAM_Q, QUERY_VALUE)
        .andNoOtherParam();
  }
  @Test
  public void users_does_GET_on_Ws_users() {
    underTest.users(
        new UsersWsRequest()
            .setPermission(PERMISSION_VALUE)
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE)
            .setSelected(SELECTED_VALUE)
            .setPage(PAGE_VALUE)
            .setPageSize(PAGE_SIZE_VALUE)
            .setQuery(QUERY_VALUE));

    assertThat(serviceTester.getGetParser()).isSameAs(WsPermissions.UsersWsResponse.parser());
    GetRequest getRequest = serviceTester.getGetRequest();
    serviceTester
        .assertThat(getRequest)
        .hasPath("users")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .hasParam(PARAM_SELECTED, SELECTED_VALUE)
        .hasParam(PARAM_P, PAGE_VALUE)
        .hasParam(PARAM_PS, PAGE_SIZE_VALUE)
        .hasParam(PARAM_Q, QUERY_VALUE)
        .andNoOtherParam();
  }
  @Test
  public void searchProjectPermissions_does_GET_on_Ws_search_project_permissions() {
    underTest.searchProjectPermissions(
        new SearchProjectPermissionsWsRequest()
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE)
            .setQualifier(QUALIFIER_VALUE)
            .setPage(PAGE_VALUE)
            .setPageSize(PAGE_SIZE_VALUE)
            .setQuery(QUERY_VALUE));

    assertThat(serviceTester.getGetParser())
        .isSameAs(WsPermissions.SearchProjectPermissionsWsResponse.parser());
    GetRequest getRequest = serviceTester.getGetRequest();
    serviceTester
        .assertThat(getRequest)
        .hasPath("search_project_permissions")
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .hasParam(PARAM_QUALIFIER, QUALIFIER_VALUE)
        .hasParam(PARAM_P, PAGE_VALUE)
        .hasParam(PARAM_PS, PAGE_SIZE_VALUE)
        .hasParam(PARAM_Q, QUERY_VALUE)
        .andNoOtherParam();
  }
  @Test
  public void searchGlobalPermissions_does_GET_on_Ws_search_global_permissions() {
    underTest.searchGlobalPermissions();

    assertThat(serviceTester.getGetParser())
        .isSameAs(WsPermissions.WsSearchGlobalPermissionsResponse.parser());
    GetRequest getRequest = serviceTester.getGetRequest();
    serviceTester.assertThat(getRequest).hasPath("search_global_permissions").andNoOtherParam();
  }
  @Test
  public void searchTemplates_does_GET_on_Ws_search_templates() {
    underTest.searchTemplates(new SearchTemplatesWsRequest().setQuery(QUERY_VALUE));

    assertThat(serviceTester.getGetParser())
        .isSameAs(WsPermissions.SearchTemplatesWsResponse.parser());
    GetRequest getRequest = serviceTester.getGetRequest();
    serviceTester
        .assertThat(getRequest)
        .hasPath("search_templates")
        .hasParam(PARAM_Q, QUERY_VALUE)
        .andNoOtherParam();
  }
  @Test
  public void deleteTemplate_does_POST_on_Ws_delete_template() {
    underTest.deleteTemplate(
        new DeleteTemplateWsRequest()
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("delete_template")
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }
  @Test
  public void setDefaultTemplate_does_POST_on_Ws_set_default_template() {
    underTest.setDefaultTemplate(
        new SetDefaultTemplateWsRequest()
            .setQualifier(QUALIFIER_VALUE)
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("set_default_template")
        .hasParam(PARAM_QUALIFIER, QUALIFIER_VALUE)
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }
  @Test
  public void createTemplate_does_POST_on_Ws_create_template() {
    underTest.createTemplate(
        new CreateTemplateWsRequest()
            .setName(NAME_VALUE)
            .setDescription(DESCRIPTION_VALUE)
            .setProjectKeyPattern(PROJECT_KEY_PATTERN_VALUE));

    assertThat(serviceTester.getPostParser())
        .isSameAs(WsPermissions.CreateTemplateWsResponse.parser());
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("create_template")
        .hasParam(PARAM_NAME, NAME_VALUE)
        .hasParam(PARAM_DESCRIPTION, DESCRIPTION_VALUE)
        .hasParam(PARAM_PROJECT_KEY_PATTERN, PROJECT_KEY_PATTERN_VALUE)
        .andNoOtherParam();
  }
  @Test
  public void removeUserFromTemplate_does_POST_on_Ws_remove_user_from_template() {
    underTest.removeUserFromTemplate(
        new RemoveUserFromTemplateWsRequest()
            .setPermission(PERMISSION_VALUE)
            .setLogin(LOGIN_VALUE)
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("remove_user_from_template")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_USER_LOGIN, LOGIN_VALUE)
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }
  @Test
  public void removeUser_does_POST_on_Ws_remove_user() {
    underTest.removeUser(
        new RemoveUserWsRequest()
            .setPermission(PERMISSION_VALUE)
            .setLogin(LOGIN_VALUE)
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("remove_user")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_USER_LOGIN, LOGIN_VALUE)
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .andNoOtherParam();
  }
  @Test
  public void applyTemplate_does_POST_on_Ws_apply_template() {
    underTest.applyTemplate(
        new ApplyTemplateWsRequest()
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE)
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("apply_template")
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }
  @Test
  public void removeGroup_does_POST_on_Ws_remove_group() {
    underTest.removeGroup(
        new RemoveGroupWsRequest()
            .setPermission(PERMISSION_VALUE)
            .setGroupId(GROUP_ID_VALUE)
            .setGroupName(GROUP_NAME_VALUE)
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("remove_group")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_GROUP_ID, GROUP_ID_VALUE)
        .hasParam(PARAM_GROUP_NAME, GROUP_NAME_VALUE)
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .andNoOtherParam();
  }
  @Test
  public void addGroupToTemplate_does_POST_on_Ws_add_group_to_template() {
    underTest.addGroupToTemplate(
        new AddGroupToTemplateWsRequest()
            .setGroupId(GROUP_ID_VALUE)
            .setGroupName(GROUP_NAME_VALUE)
            .setPermission(PERMISSION_VALUE)
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("add_group_to_template")
        .hasParam(PARAM_GROUP_ID, GROUP_ID_VALUE)
        .hasParam(PARAM_GROUP_NAME, GROUP_NAME_VALUE)
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }
public class PermissionsServiceTest {
  private static final String PERMISSION_VALUE = "permission value";
  private static final String PROJECT_ID_VALUE = "project id value";
  private static final String PROJECT_KEY_VALUE = "project key value";
  private static final String QUERY_VALUE = "query value";
  private static final String SELECTED_VALUE = "selected value";
  private static final int PAGE_VALUE = 66;
  private static final int PAGE_SIZE_VALUE = 99;
  private static final String GROUP_ID_VALUE = "group id value";
  private static final String GROUP_NAME_VALUE = "group name value";
  private static final String TEMPLATE_ID_VALUE = "template id value";
  private static final String TEMPLATE_NAME_VALUE = "template name value";
  private static final String LOGIN_VALUE = "login value";
  private static final String NAME_VALUE = "name value";
  private static final String DESCRIPTION_VALUE = "description value";
  private static final String PROJECT_KEY_PATTERN_VALUE = "project key pattern value";
  private static final String QUALIFIER_VALUE = "qualifier value";
  private static final String PARAM_Q = "q";
  private static final String PARAM_PS = "ps";
  private static final String PARAM_P = "p";
  private static final String PARAM_SELECTED = "selected";

  @Rule
  public ServiceTester<PermissionsService> serviceTester =
      new ServiceTester<>(new PermissionsService(mock(WsConnector.class)));

  private PermissionsService underTest = serviceTester.getInstanceUnderTest();

  @Test(expected = NullPointerException.class)
  public void groups_throws_NPE_if_GroupWsRequest_argument_is_null() {
    underTest.groups(null);
  }

  @Test
  public void groups_does_POST_on_WS_groups() {
    GroupsWsRequest request = new GroupsWsRequest();
    underTest.groups(
        request
            .setPermission(PERMISSION_VALUE)
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE)
            .setPage(PAGE_VALUE)
            .setPageSize(PAGE_SIZE_VALUE)
            .setSelected(SELECTED_VALUE)
            .setQuery(QUERY_VALUE));

    assertThat(serviceTester.getGetParser()).isSameAs(WsPermissions.WsGroupsResponse.parser());
    GetRequest getRequest = serviceTester.getGetRequest();
    serviceTester
        .assertThat(getRequest)
        .hasPath("groups")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .hasParam(PARAM_P, PAGE_VALUE)
        .hasParam(PARAM_PS, PAGE_SIZE_VALUE)
        .hasParam(PARAM_SELECTED, SELECTED_VALUE)
        .hasParam(PARAM_Q, QUERY_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void addGroup_does_POST_on_Ws_add_group() {
    underTest.addGroup(
        new AddGroupWsRequest()
            .setPermission(PERMISSION_VALUE)
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE)
            .setGroupId(GROUP_ID_VALUE)
            .setGroupName(GROUP_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("add_group")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .hasParam(PARAM_GROUP_ID, GROUP_ID_VALUE)
        .hasParam(PARAM_GROUP_NAME, GROUP_NAME_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void addGroupToTemplate_does_POST_on_Ws_add_group_to_template() {
    underTest.addGroupToTemplate(
        new AddGroupToTemplateWsRequest()
            .setGroupId(GROUP_ID_VALUE)
            .setGroupName(GROUP_NAME_VALUE)
            .setPermission(PERMISSION_VALUE)
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("add_group_to_template")
        .hasParam(PARAM_GROUP_ID, GROUP_ID_VALUE)
        .hasParam(PARAM_GROUP_NAME, GROUP_NAME_VALUE)
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void addUser_does_POST_on_Ws_add_user() {
    underTest.addUser(
        new AddUserWsRequest()
            .setLogin(LOGIN_VALUE)
            .setPermission(PERMISSION_VALUE)
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("add_user")
        .hasParam(PARAM_USER_LOGIN, LOGIN_VALUE)
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void addUserToTemplate_does_POST_on_Ws_add_user_to_template() {
    underTest.addUserToTemplate(
        new AddUserToTemplateWsRequest()
            .setPermission(PERMISSION_VALUE)
            .setLogin(LOGIN_VALUE)
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("add_user_to_template")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_USER_LOGIN, LOGIN_VALUE)
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void applyTemplate_does_POST_on_Ws_apply_template() {
    underTest.applyTemplate(
        new ApplyTemplateWsRequest()
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE)
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("apply_template")
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void createTemplate_does_POST_on_Ws_create_template() {
    underTest.createTemplate(
        new CreateTemplateWsRequest()
            .setName(NAME_VALUE)
            .setDescription(DESCRIPTION_VALUE)
            .setProjectKeyPattern(PROJECT_KEY_PATTERN_VALUE));

    assertThat(serviceTester.getPostParser())
        .isSameAs(WsPermissions.CreateTemplateWsResponse.parser());
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("create_template")
        .hasParam(PARAM_NAME, NAME_VALUE)
        .hasParam(PARAM_DESCRIPTION, DESCRIPTION_VALUE)
        .hasParam(PARAM_PROJECT_KEY_PATTERN, PROJECT_KEY_PATTERN_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void deleteTemplate_does_POST_on_Ws_delete_template() {
    underTest.deleteTemplate(
        new DeleteTemplateWsRequest()
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("delete_template")
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void removeGroup_does_POST_on_Ws_remove_group() {
    underTest.removeGroup(
        new RemoveGroupWsRequest()
            .setPermission(PERMISSION_VALUE)
            .setGroupId(GROUP_ID_VALUE)
            .setGroupName(GROUP_NAME_VALUE)
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("remove_group")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_GROUP_ID, GROUP_ID_VALUE)
        .hasParam(PARAM_GROUP_NAME, GROUP_NAME_VALUE)
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void removeGroupFromTemplate_does_POST_on_Ws_remove_group_from_template() {
    underTest.removeGroupFromTemplate(
        new RemoveGroupFromTemplateWsRequest()
            .setPermission(PERMISSION_VALUE)
            .setGroupId(GROUP_ID_VALUE)
            .setGroupName(GROUP_NAME_VALUE)
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("remove_group_from_template")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_GROUP_ID, GROUP_ID_VALUE)
        .hasParam(PARAM_GROUP_NAME, GROUP_NAME_VALUE)
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void removeUser_does_POST_on_Ws_remove_user() {
    underTest.removeUser(
        new RemoveUserWsRequest()
            .setPermission(PERMISSION_VALUE)
            .setLogin(LOGIN_VALUE)
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("remove_user")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_USER_LOGIN, LOGIN_VALUE)
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void removeUserFromTemplate_does_POST_on_Ws_remove_user_from_template() {
    underTest.removeUserFromTemplate(
        new RemoveUserFromTemplateWsRequest()
            .setPermission(PERMISSION_VALUE)
            .setLogin(LOGIN_VALUE)
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("remove_user_from_template")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_USER_LOGIN, LOGIN_VALUE)
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void searchGlobalPermissions_does_GET_on_Ws_search_global_permissions() {
    underTest.searchGlobalPermissions();

    assertThat(serviceTester.getGetParser())
        .isSameAs(WsPermissions.WsSearchGlobalPermissionsResponse.parser());
    GetRequest getRequest = serviceTester.getGetRequest();
    serviceTester.assertThat(getRequest).hasPath("search_global_permissions").andNoOtherParam();
  }

  @Test
  public void searchProjectPermissions_does_GET_on_Ws_search_project_permissions() {
    underTest.searchProjectPermissions(
        new SearchProjectPermissionsWsRequest()
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE)
            .setQualifier(QUALIFIER_VALUE)
            .setPage(PAGE_VALUE)
            .setPageSize(PAGE_SIZE_VALUE)
            .setQuery(QUERY_VALUE));

    assertThat(serviceTester.getGetParser())
        .isSameAs(WsPermissions.SearchProjectPermissionsWsResponse.parser());
    GetRequest getRequest = serviceTester.getGetRequest();
    serviceTester
        .assertThat(getRequest)
        .hasPath("search_project_permissions")
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .hasParam(PARAM_QUALIFIER, QUALIFIER_VALUE)
        .hasParam(PARAM_P, PAGE_VALUE)
        .hasParam(PARAM_PS, PAGE_SIZE_VALUE)
        .hasParam(PARAM_Q, QUERY_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void searchTemplates_does_GET_on_Ws_search_templates() {
    underTest.searchTemplates(new SearchTemplatesWsRequest().setQuery(QUERY_VALUE));

    assertThat(serviceTester.getGetParser())
        .isSameAs(WsPermissions.SearchTemplatesWsResponse.parser());
    GetRequest getRequest = serviceTester.getGetRequest();
    serviceTester
        .assertThat(getRequest)
        .hasPath("search_templates")
        .hasParam(PARAM_Q, QUERY_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void setDefaultTemplate_does_POST_on_Ws_set_default_template() {
    underTest.setDefaultTemplate(
        new SetDefaultTemplateWsRequest()
            .setQualifier(QUALIFIER_VALUE)
            .setTemplateId(TEMPLATE_ID_VALUE)
            .setTemplateName(TEMPLATE_NAME_VALUE));

    assertThat(serviceTester.getPostParser()).isNull();
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("set_default_template")
        .hasParam(PARAM_QUALIFIER, QUALIFIER_VALUE)
        .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void updateTemplate_does_POST_on_Ws_update_template() {
    underTest.updateTemplate(
        new UpdateTemplateWsRequest()
            .setDescription(DESCRIPTION_VALUE)
            .setId(TEMPLATE_ID_VALUE)
            .setName(TEMPLATE_NAME_VALUE)
            .setProjectKeyPattern(PROJECT_KEY_PATTERN_VALUE));

    assertThat(serviceTester.getPostParser())
        .isSameAs(WsPermissions.UpdateTemplateWsResponse.parser());
    PostRequest postRequest = serviceTester.getPostRequest();
    serviceTester
        .assertThat(postRequest)
        .hasPath("update_template")
        .hasParam(PARAM_DESCRIPTION, DESCRIPTION_VALUE)
        .hasParam(PARAM_ID, TEMPLATE_ID_VALUE)
        .hasParam(PARAM_NAME, TEMPLATE_NAME_VALUE)
        .hasParam(PARAM_PROJECT_KEY_PATTERN, PROJECT_KEY_PATTERN_VALUE)
        .andNoOtherParam();
  }

  @Test
  public void users_does_GET_on_Ws_users() {
    underTest.users(
        new UsersWsRequest()
            .setPermission(PERMISSION_VALUE)
            .setProjectId(PROJECT_ID_VALUE)
            .setProjectKey(PROJECT_KEY_VALUE)
            .setSelected(SELECTED_VALUE)
            .setPage(PAGE_VALUE)
            .setPageSize(PAGE_SIZE_VALUE)
            .setQuery(QUERY_VALUE));

    assertThat(serviceTester.getGetParser()).isSameAs(WsPermissions.UsersWsResponse.parser());
    GetRequest getRequest = serviceTester.getGetRequest();
    serviceTester
        .assertThat(getRequest)
        .hasPath("users")
        .hasParam(PARAM_PERMISSION, PERMISSION_VALUE)
        .hasParam(PARAM_PROJECT_ID, PROJECT_ID_VALUE)
        .hasParam(PARAM_PROJECT_KEY, PROJECT_KEY_VALUE)
        .hasParam(PARAM_SELECTED, SELECTED_VALUE)
        .hasParam(PARAM_P, PAGE_VALUE)
        .hasParam(PARAM_PS, PAGE_SIZE_VALUE)
        .hasParam(PARAM_Q, QUERY_VALUE)
        .andNoOtherParam();
  }
}