public static void withUpdateableProductType(final BlockingSphereClient client, final Supplier<ProductTypeDraft> creator, final UnaryOperator<ProductType> user) { final SphereInternalLogger logger = SphereInternalLogger.getLogger("product-types.fixtures"); final ProductTypeDraft productTypeDraft = creator.get(); final String name = productTypeDraft.getName(); final PagedQueryResult<ProductType> queryResult = client.executeBlocking(ProductTypeQuery.of().byName(name)); queryResult.getResults().forEach(productType -> { final PagedQueryResult<Product> pagedQueryResult = client.executeBlocking(ProductQuery.of().byProductType(productType)); delete(client, pagedQueryResult.getResults()); client.executeBlocking(ProductTypeDeleteCommand.of(productType)); }); final ProductType productType = client.executeBlocking(ProductTypeCreateCommand.of(productTypeDraft)); logger.debug(() -> "created product type " + productType.getName() + " " + productType.getId()); final ProductType updated = user.apply(productType); logger.debug(() -> "attempt to delete product type " + productType.getName() + " " + productType.getId()); try { client.executeBlocking(ProductTypeDeleteCommand.of(updated)); } catch (final Exception e) { final PagedQueryResult<Product> pagedQueryResult = client.executeBlocking(ProductQuery.of().byProductType(productType)); delete(client, pagedQueryResult.getResults()); client.executeBlocking(ProductTypeDeleteCommand.of(productType)); } }