@Test
  public void testUnregisterCustomers() {
    try {
      CustomerManagementService customerManagement = getCustomerManagementService();

      EntityList<JsonEntity> customerList = customerManagement.getCustomers();
      for (JsonEntity customer : customerList) {
        String customerId = "" + customer.getAsLong("Id");
        String customerType = customer.getAsString("CustomerType");
        if (!"RESELLER".equals(customerType)) {
          try {

            System.out.println("Unregistering: " + customerId);
            customerManagement.unregisterCustomer(customerId);

            JsonEntity jsonEntity = customerManagement.getCustomerById(customerId);
            Assert.assertNull("Able to retrieve unregistered customer: " + customerId, jsonEntity);
            System.out.println("Unregistered: " + customerId);
          } catch (BssException be) {
            JsonJavaObject jsonObject = be.getResponseJson();
            System.out.println(jsonObject);
            Assert.fail("Error unregistering customer caused by: " + jsonObject);
          }
        }
      }

    } catch (Exception e) {
      e.printStackTrace();
      Assert.fail("Error unregistering customers caused by: " + e.getMessage());
    }
  }
  @Test
  public void testRegisterCustomer() {
    try {
      CustomerJsonBuilder customer = new CustomerJsonBuilder();
      customer
          .setOrgName("Abe Industrial")
          .setPhone("999-999-9999")
          .setOrganizationAddressLine1("5 Technology Park Drive")
          .setOrganizationAddressLine2("")
          .setOrganizationAddressType(CustomerManagementService.AddressType.MAILING)
          .setOrganizationCity("Westford")
          .setOrganizationCountry("United States")
          .setOrganizationPostalCode("01866")
          .setOrganizationState("Massachusetts")
          .setContactFamilyName("Ninty")
          .setContactGivenName("Joe")
          .setContactEmailAddress(getUniqueEmail())
          .setContactNamePrefix("Mr")
          .setContactEmployeeNumber("6A77777")
          .setContactLanguagePreference("EN_US")
          .setContactWorkPhone("800-555-1234")
          .setContactMobilePhone("800-555-2345")
          .setContactHomePhone("800-555-3456")
          .setContactFax("800-555-4567")
          .setContactJobTitle("Director")
          .setContactWebSiteAddress("joeninty.example.com")
          .setContactTimeZone("America/Central")
          .setContactPhoto("")
          .setCustomerAccountNumber("0000123457")
          .setCustomerAccountLocationName("Westford Lab")
          .setCustomerAccountPaymentMethodType(CustomerManagementService.PaymentMethodType.INVOICE)
          .setCustomerAccountCurrencyType("USD")
          .setCustomerIdentifierType(CustomerManagementService.CustomerIdType.IBM_CUSTOMER_NUMBER)
          .setCustomerIdentifierValue("9999999999");

      JsonJavaObject response = getCustomerManagementService().registerCustomer(customer);
      long customerId = response.getAsLong("Long");
      Assert.assertNotNull("Invalid customer id", customerId);
      System.out.println(customerId);
    } catch (BssException be) {
      JsonJavaObject jsonObject = be.getResponseJson();
      System.err.println(jsonObject);
      // be.printStackTrace();
      Assert.fail("Error registering customer because: " + jsonObject);
    } catch (Exception e) {
      e.printStackTrace();
      Assert.fail("Error registering customer caused by: " + e.getMessage());
    }
  }
  @Test
  public void testUpdateSubscriberProfile() {
    try {
      registerCustomer();
      String subscriberId = addSubscriber();

      SubscriberManagementService subscriberManagement = getSubscriberManagementService();

      JsonEntity jsonEntity = subscriberManagement.getSubscriberById(subscriberId);
      Assert.assertNotNull("Unable to retrieve subscriber: " + subscriberId, jsonEntity);
      Assert.assertEquals(
          subscriberId, subscriberManagement.getSubscriberId(jsonEntity.getJsonObject()));

      JsonJavaObject rootObject = jsonEntity.getJsonObject();
      Assert.assertNotNull("Unable to retrieve subscriber: " + subscriberId, rootObject);

      System.out.println(rootObject);
      JsonJavaObject subscriberObject = rootObject.getAsObject("Subscriber");
      JsonJavaObject personObject = subscriberObject.getAsObject("Person");
      personObject.putString("GivenName", "Fred");
      personObject.putString("WorkPhone", "800-666-1234");

      subscriberManagement.updateSubscribeProfile(rootObject);

      jsonEntity = subscriberManagement.getSubscriberById(subscriberId);
      Assert.assertNotNull("Unable to retrieve subscriber: " + subscriberId, jsonEntity);
      Assert.assertEquals(
          subscriberId, subscriberManagement.getSubscriberId(jsonEntity.getJsonObject()));

      rootObject = jsonEntity.getJsonObject();
      Assert.assertNotNull("Unable to retrieve subscriber: " + subscriberId, subscriberObject);

      System.out.println(rootObject);
      subscriberObject = rootObject.getAsObject("Subscriber");
      personObject = subscriberObject.getAsObject("Person");
      Assert.assertEquals("Fred", personObject.getAsString("GivenName"));
      Assert.assertEquals("800-666-1234", personObject.getAsString("WorkPhone"));

    } catch (BssException be) {
      JsonJavaObject jsonObject = be.getResponseJson();
      System.out.println(jsonObject);
      Assert.fail("Error updating subscriber profile caused by: " + jsonObject);
    } catch (Exception e) {
      e.printStackTrace();
      Assert.fail("Error updating subscriber profile caused by: " + e.getMessage());
    }
  }
  @Test
  public void testRegisterCustomerBadRequest() {
    try {
      CustomerJsonBuilder customer = new CustomerJsonBuilder();
      customer.setOrgName("Test Enterprise").setPhone("999-999-9999");

      getCustomerManagementService().registerCustomer(customer);

      Assert.fail("Expected bad request response");

    } catch (BssException be) {
      // expecting this exception
      JsonJavaObject jsonObject = be.getResponseJson();
      System.err.println(jsonObject);
      Assert.assertNotNull("Expected JSON response", jsonObject);
      Assert.assertEquals("400", be.getResponseCode());
      Assert.assertEquals(
          "The [LocationName] field requires a string value.", be.getResponseMessage());
      Assert.assertEquals("Error", be.getSeverity());
      Assert.assertEquals(
          "Provide a valid string value for the [LocationName] field.", be.getUserAction());
      Assert.assertEquals("BZSAP1033E", be.getMessageId());
    } catch (Exception e) {
      e.printStackTrace();
      Assert.fail("Error registering customer caused by: " + e.getMessage());
    }
  }
  @Test
  public void testSetOneTimePasswordBadRequest() {
    try {
      String subscriberId = addSubscriber();
      JsonEntity subscriber = getSubscriberById(subscriberId);
      String loginName = subscriber.getAsString("Subscriber/Person/EmailAddress");
      System.out.println(loginName);

      UserCredentialJsonBuilder userCredential = new UserCredentialJsonBuilder();
      userCredential.setStrict(false);
      userCredential.setLoginName("").setNewPassword("new_password");
      System.out.println(userCredential.toJson());

      AuthenticationService authenticationService = getAuthenticationService();
      authenticationService.setOneTimePassword(userCredential);

      Assert.fail("Expected bad request response");

    } catch (BssException be) {
      // expecting this exception
      JsonJavaObject jsonObject = be.getResponseJson();
      System.err.println(jsonObject);
      Assert.assertNotNull("Expected JSON response", jsonObject);
      Assert.assertEquals("400", be.getResponseCode());
      Assert.assertNotNull(be.getResponseMessage());
      Assert.assertEquals("Error", be.getSeverity());
      Assert.assertNotNull(be.getUserAction());
      Assert.assertNotNull(be.getMessageId());
    } catch (Exception e) {
      e.printStackTrace();
      Assert.fail("Error changing password caused by: " + e.getMessage());
    }
  }
  @Test
  public void testSuspendCustomer() {
    try {
      String customerId = registerCustomer();

      CustomerManagementService customerManagement = getCustomerManagementService();

      JsonEntity jsonEntity = customerManagement.getCustomerById(customerId);
      Assert.assertNotNull("Unable to retrieve customer: " + customerId, jsonEntity);
      Assert.assertEquals(customerId, customerManagement.getCustomerId(jsonEntity.getJsonObject()));

      customerManagement.suspendCustomer(customerId);

      jsonEntity = customerManagement.getCustomerById(customerId);
      Assert.assertNotNull("Unable to retrieve customer: " + customerId, jsonEntity);
      JsonJavaObject rootObject = jsonEntity.getJsonObject();

      JsonJavaObject customerObject = rootObject.getAsObject("Customer");
      System.out.println(customerObject);
      Assert.assertNotNull("No SuspensionDate", customerObject.get("SuspensionDate"));

      customerManagement.unsuspendCustomer(customerId);

      jsonEntity = customerManagement.getCustomerById(customerId);
      Assert.assertNotNull("Unable to retrieve customer: " + customerId, jsonEntity);
      rootObject = jsonEntity.getJsonObject();

      customerObject = rootObject.getAsObject("Customer");
      System.out.println(customerObject);
      Assert.assertNull("SuspensionDate", customerObject.get("SuspensionDate"));
      Assert.assertEquals("ACTIVE", customerObject.get("CustomerState"));

    } catch (BssException be) {
      JsonJavaObject jsonObject = be.getResponseJson();
      System.out.println(jsonObject);
      Assert.fail("Error suspending customer caused by: " + jsonObject);
    } catch (Exception e) {
      e.printStackTrace();
      Assert.fail("Error suspending customer caused by: " + e.getMessage());
    }
  }
  @Test
  public void testSetOneTimePassword() {
    try {
      String subscriberId = addSubscriber();
      JsonEntity subscriber = getSubscriberById(subscriberId);
      String loginName = subscriber.getAsString("Subscriber/Person/EmailAddress");
      System.out.println(loginName);

      UserCredentialJsonBuilder userCredential = new UserCredentialJsonBuilder();
      userCredential.setLoginName(loginName).setNewPassword("one_time_passw0rd");
      System.out.println(userCredential.toJson());

      AuthenticationService authenticationService = getAuthenticationService();
      authenticationService.setOneTimePassword(userCredential);

    } catch (BssException be) {
      JsonJavaObject jsonObject = be.getResponseJson();
      System.err.println(jsonObject);
      Assert.fail("Error setting one time password because: " + jsonObject);
    } catch (Exception e) {
      e.printStackTrace();
      Assert.fail("Error setting one time password caused by: " + e.getMessage());
    }
  }