@Test
  public void testAddTrialSubscriptionShouldReturnOkResponse() throws Exception {
    SaasUserCredentials testUserCredentials =
        new SaasUserCredentials(TEST_ACCESS_TOKEN, TEST_ACCOUNT_ID);
    service.saasUserCredentials = testUserCredentials;

    Response result = service.addTrialSubscription();
    assertEquals(result.getStatus(), Response.Status.CREATED.getStatusCode());
    verify(mockFacade).addTrialSaasSubscription(testUserCredentials);
  }
  @Test
  public void shouldLogEventToSaasAnalyticsWhenUserLoggedIn() throws Exception {
    SaasUserCredentials testUserCredentials =
        new SaasUserCredentials(TEST_ACCESS_TOKEN, TEST_ACCOUNT_ID);
    service.saasUserCredentials = testUserCredentials;

    Event event = new Event(Event.Type.CDEC_FIRST_LOGIN, Collections.emptyMap());

    Response response = service.logSaasAnalyticsEvent(event);

    assertEquals(response.getStatus(), Response.Status.ACCEPTED.getStatusCode());
    verify(mockFacade).logSaasAnalyticsEvent(event, TEST_ACCESS_TOKEN);
  }
  @Test
  public void testRestoreShouldReturnOkResponse() throws Exception {
    doReturn(new BackupInfo()).when(mockFacade).restore(any(BackupConfig.class));

    Response result = service.restore(ARTIFACT_NAME, "");
    assertEquals(result.getStatus(), Response.Status.CREATED.getStatusCode());
  }
  @Test
  public void testRemoveNodeShouldReturnOkResponse() throws Exception {
    doReturn(new NodeInfo()).when(mockFacade).removeNode("dns");

    Response result = service.removeNode("dns");
    assertEquals(result.getStatus(), Response.Status.NO_CONTENT.getStatusCode());
  }
  @Test
  public void testAddNodeShouldReturnOkResponse() throws Exception {
    doReturn(new NodeInfo()).when(mockFacade).addNode("dns");

    Response result = service.addNode("dns");
    assertEquals(result.getStatus(), Response.Status.CREATED.getStatusCode());
  }
  @Test
  public void testGetConfig() throws Exception {
    doReturn(Collections.emptyMap()).when(mockFacade).getInstallationManagerProperties();

    Response response = service.getInstallationManagerServerConfig();
    assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
  }
  @Test
  public void testGetInstalledVersionsShouldReturnErrorStatus() throws Exception {
    doThrow(new IOException("error")).when(mockFacade).getInstalledVersions();

    Response result = service.getInstalledVersions();
    assertEquals(result.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
  }
  @Test
  public void testGetUpdatesShouldReturnErrorStatus() throws Exception {
    doThrow(new IOException("error")).when(mockFacade).getAllUpdates(any(Artifact.class));

    Response result = service.getUpdates();
    assertEquals(result.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
  }
  @Test
  public void testGetUpdatesShouldReturnOkStatus() throws Exception {
    doReturn(Collections.emptyList()).when(mockFacade).getAllUpdates(any(Artifact.class));

    Response result = service.getUpdates();
    assertEquals(result.getStatus(), Response.Status.OK.getStatusCode());
  }
  @Test
  public void testGetCodenvyPropertyShouldReturnErrorResponse() throws Exception {
    doThrow(new IOException("error")).when(configManager).loadInstalledCodenvyConfig();

    Response response = service.getCodenvyProperty("x");
    assertErrorResponse(response);
  }
  @Test
  public void testGetCodenvyPropertiesShouldReturnErrorResponse() throws Exception {
    doThrow(new IOException("error")).when(configManager).loadInstalledCodenvyConfig();

    Response response = service.getCodenvyProperties();
    assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
  }
  @Test
  public void testGetDownloadsShouldReturnOkResponse() throws Exception {
    doReturn("id").when(mockFacade).getDownloadIdInProgress();

    Response response = service.getDownloads();
    assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
  }
  @Test
  public void testGetNodeConfigForMultiNode() throws IOException {
    Config testConfig =
        new Config(
            new LinkedHashMap<>(
                ImmutableMap.of(
                    "builder_host_name", "builder1.dev.com",
                    "additional_runners",
                        "http://runner1.dev.com:8080/runner/internal/runner,http://runner2.dev.com:8080/runner/internal/runner",
                    "analytics_host_name", "analytics.dev.com",
                    "additional_builders", "",
                    "host_url", "local.dev.com")));
    doReturn(testConfig).when(configManager).loadInstalledCodenvyConfig(InstallType.MULTI_SERVER);
    doReturn(InstallType.MULTI_SERVER).when(configManager).detectInstallationType();

    Response result = service.getNodesList();
    assertEquals(result.getStatus(), Response.Status.OK.getStatusCode());
    assertEquals(
        result.getEntity(),
        "{\n"
            + "  \"host_url\" : \"local.dev.com\",\n"
            + "  \"builder_host_name\" : \"builder1.dev.com\",\n"
            + "  \"additional_builders\" : [ ],\n"
            + "  \"analytics_host_name\" : \"analytics.dev.com\",\n"
            + "  \"additional_runners\" : [ \"runner1.dev.com\", \"runner2.dev.com\" ]\n"
            + "}");
  }
  @Test
  public void testGetDownloadsShouldReturnConflictResponse() throws Exception {
    doThrow(new DownloadNotStartedException()).when(mockFacade).getDownloadIdInProgress();

    Response result = service.getDownloads();
    assertEquals(result.getStatus(), Response.Status.CONFLICT.getStatusCode());
  }
  @Test
  public void testStopDownloadShouldReturnConflictWhenDownloadNotStarted() throws Exception {
    doThrow(new DownloadNotStartedException()).when(mockFacade).stopDownload();

    Response result = service.stopDownload("id");
    assertEquals(result.getStatus(), Response.Status.CONFLICT.getStatusCode());
  }
  @Test
  public void testInsertStoragePropertiesShouldReturnErrorResponse() throws Exception {
    doThrow(new IOException("error")).when(mockFacade).storeStorageProperties(anyMap());

    Response response = service.insertStorageProperties(Collections.<String, String>emptyMap());
    assertErrorResponse(response);
  }
  @Test
  public void testGetStoragePropertiesShouldReturnErrorResponse() throws Exception {
    doThrow(new IOException("error")).when(mockFacade).loadStorageProperties();

    Response response = service.getStorageProperties();
    assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
  }
  @Test
  public void testGetStoragePropertiesShouldReturnOkResponse() throws Exception {
    doReturn(Collections.emptyMap()).when(mockFacade).loadStorageProperties();

    Response response = service.getArtifactProperties("codenvy", "3.1.0");
    assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
  }
  @Test
  public void testDeleteStoragePropertyShouldReturnErrorResponse() throws Exception {
    String key = "x";
    doThrow(new IOException("error")).when(mockFacade).deleteStorageProperty(key);

    Response response = service.deleteStorageProperty(key);
    assertErrorResponse(response);
  }
  @Test
  public void testGetNodeConfigError() throws IOException {
    doThrow(new RuntimeException("error")).when(configManager).detectInstallationType();

    Response result = service.getNodesList();
    assertEquals(result.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
    assertEquals(result.getEntity().toString(), "{message=error}");
  }
  @Test
  public void testDeleteStorageProperty() throws Exception {
    String key = "x";

    Response response = service.deleteStorageProperty(key);
    assertEquals(response.getStatus(), Response.Status.NO_CONTENT.getStatusCode());
    verify(mockFacade).deleteStorageProperty(key);
  }
  @Test
  public void testDeleteDownloadedArtifactWhenVersionIsIncorrect() throws Exception {
    doReturn(artifact).when(service).createArtifact(artifact.getName());

    Response response = service.deleteDownloadedArtifact(artifact.getName(), "incorrect");
    assertEquals(response.getStatus(), Response.Status.BAD_REQUEST.getStatusCode());
    assertEquals(response.getEntity().toString(), "{message=Illegal version 'incorrect'}");
  }
 @Test
 public void testStartDownload() throws Exception {
   Response result = service.startDownload(ARTIFACT_NAME, VERSION_NUMBER);
   assertEquals(result.getStatus(), Response.Status.ACCEPTED.getStatusCode());
   assertTrue(result.getEntity() instanceof DownloadToken);
   assertNotNull(((DownloadToken) result.getEntity()).getId());
   verify(mockFacade).startDownload(createArtifact("codenvy"), version);
 }
  @Test
  public void testDeleteDownloadedArtifactShouldReturnErrorResponse() throws Exception {
    doReturn(artifact).when(service).createArtifact(artifact.getName());
    doThrow(new IOException("error")).when(mockFacade).deleteDownloadedArtifact(artifact, version);

    Response response = service.deleteDownloadedArtifact(artifact.getName(), version.toString());
    assertErrorResponse(response);
  }
  @Test
  public void testDeleteDownloadedArtifact() throws Exception {
    doReturn(artifact).when(service).createArtifact(artifact.getName());

    Response response = service.deleteDownloadedArtifact(artifact.getName(), version.toString());
    assertEquals(response.getStatus(), Response.Status.NO_CONTENT.getStatusCode());
    verify(mockFacade).deleteDownloadedArtifact(artifact, version);
  }
  @Test
  public void testUpdateCodenvyProperty() throws Exception {
    Map<String, String> properties = ImmutableMap.of("x", "y");

    Response response = service.updateCodenvyProperties(properties);
    assertEquals(response.getStatus(), Response.Status.CREATED.getStatusCode());
    verify(mockFacade).updateArtifactConfig(any(Artifact.class), anyMap());
  }
  @Test
  public void shouldLogEventToSaasAnalyticsWhenUserDidnotLogIn() throws Exception {
    Event event = new Event(Event.Type.CDEC_FIRST_LOGIN, Collections.emptyMap());

    Response response = service.logSaasAnalyticsEvent(event);

    assertEquals(response.getStatus(), Response.Status.ACCEPTED.getStatusCode());
    verify(mockFacade).logSaasAnalyticsEvent(event, null);
  }
  @Test
  public void testDeleteNonExistedStorageProperty() throws Exception {
    String key = "x";
    doThrow(PropertyNotFoundException.from(key)).when(mockFacade).deleteStorageProperty(key);

    Response response = service.deleteStorageProperty(key);
    assertEquals(response.getStatus(), Response.Status.NOT_FOUND.getStatusCode());
    assertEquals(response.getEntity().toString(), "{message=Property 'x' not found}");
  }
  @Test
  public void testGetCodenvyPropertiesShouldReturnOkResponse() throws Exception {
    Config testConfig = new Config(ImmutableMap.of("a", "b", "password", "c"));
    doReturn(testConfig).when(configManager).loadInstalledCodenvyConfig();

    Response response = service.getCodenvyProperties();
    assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
    assertEquals(response.getEntity().toString(), "{a=b, password=*****}");
  }
  @Test
  public void testGetCodenvyPropertyShouldReturnOkResponse() throws Exception {
    Config config = new Config(ImmutableMap.of("x", "y"));
    doReturn(config).when(configManager).loadInstalledCodenvyConfig();

    Response response = service.getCodenvyProperty("x");
    assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
    assertEquals(response.getEntity().toString(), "{x=y}");
  }