package com.mozu.api;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.mozu.api.cache.impl.CacheManagerImpl;
import com.mozu.api.contracts.appdev.AppAuthInfo;
import com.mozu.api.contracts.core.Measurement;
import com.mozu.api.contracts.customer.CustomerAccount;
import com.mozu.api.contracts.customer.CustomerAccountCollection;
import com.mozu.api.contracts.productadmin.Product;
import com.mozu.api.contracts.productadmin.ProductLocalizedContent;
import com.mozu.api.contracts.productadmin.ProductPrice;
import com.mozu.api.contracts.tenant.Tenant;
import com.mozu.api.resources.commerce.catalog.admin.ProductResource;
import com.mozu.api.resources.commerce.customer.CustomerAccountResource;
import com.mozu.api.resources.platform.TenantResource;
import com.mozu.api.security.AppAuthenticator;
import com.mozu.api.urls.commerce.customer.CustomerAccountUrl;
import com.mozu.api.urls.platform.TenantUrl;
import com.mozu.client.MozuClientImpl;
public class AsyncClientTest {
private static final Integer TENANT_ID = 3293;
private static final String APP_ID = "a0842dd.lightspeed.1.0.0.johng";
private static final String SHARED_SECRET = "b2dc973d5dec4bd6aa325fa906a64aee";
private static final String MOZU_BASE_URL = "https://home.mozu-qa.com";
protected Tenant tenant;
protected CustomerAccountCollection accounts;
protected Product addedProduct;
CacheManagerImpl<?> cacheManager;
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void clientTest() throws Exception {
ApiContext apiContext = new MozuApiContext(TENANT_ID);
MozuConfig.setBaseUrl(MOZU_BASE_URL);
AppAuthenticator.initialize(createAppAuthInfo(APP_ID, SHARED_SECRET));
//Initalize cache
cacheManager = new CacheManagerImpl();
cacheManager.startCache();
com.mozu.api.cache.CacheManagerFactory.setCacheManager(cacheManager);
MozuUrl url = TenantUrl.getTenantUrl(null, TENANT_ID);
String verb = "GET";
Class<?> clz = Tenant.class;
MozuClientImpl<Tenant> mozuTenantClient = (MozuClientImpl<Tenant>) MozuClientFactory.getInstance(clz);
mozuTenantClient.setVerb(verb);
mozuTenantClient.setResourceUrl(url);
mozuTenantClient.setContext(apiContext);
TenantCallbackClass cc = new TenantCallbackClass();
CountDownLatch latch1 = mozuTenantClient.executeRequest(cc);
MozuUrl acctUrl = CustomerAccountUrl.getAccountsUrl(null, null, null, null, null, null, null, null, null);
Class<?> acctClz = CustomerAccountCollection.class;
MozuClientImpl<CustomerAccountCollection> mozuAcctClient = (MozuClientImpl<CustomerAccountCollection>) MozuClientFactory.getInstance(acctClz);
mozuAcctClient.setVerb(verb);
mozuAcctClient.setResourceUrl(acctUrl);
mozuAcctClient.setContext(apiContext);
AccountCallbackClass ac = new AccountCallbackClass();
CountDownLatch latch2 = mozuAcctClient.executeRequest(ac);
TenantResource resource = new TenantResource(apiContext);
tenant = null;
tenant = resource.getTenant(TENANT_ID);
assertEquals(TENANT_ID, tenant.getId());
System.out.println("Sync Operation finished");
if (!latch1.await(30, TimeUnit.SECONDS)) {
fail("Timeout");
} else {
assertEquals(TENANT_ID, tenant.getId());
}
System.out.println("Tenant Async Operation finished");
if (!latch2.await(30, TimeUnit.SECONDS)) {
fail("Timeout");
} else {
assertNotNull(accounts);
}
System.out.println("Account Async Operation finished");
}
@Test
public void fullAsyncTest() throws Exception {
ApiContext apiContext = new MozuApiContext(TENANT_ID);
MozuConfig.setBaseUrl(MOZU_BASE_URL);
AppAuthenticator.initialize(createAppAuthInfo(APP_ID, SHARED_SECRET));
//Initalize cache
cacheManager = new CacheManagerImpl();
cacheManager.startCache();
com.mozu.api.cache.CacheManagerFactory.setCacheManager(cacheManager);
TenantCallbackClass tenantCallback = new TenantCallbackClass();
TenantResource tenantResource = new TenantResource(apiContext);
CountDownLatch latch1 = tenantResource.getTenantAsync(TENANT_ID, tenantCallback);
AccountCallbackClass accountCallback = new AccountCallbackClass();
CustomerAccountResource car = new CustomerAccountResource(apiContext);
CountDownLatch latch2 = car.getAccountsAsync(0, 100, null, null, null, null, null, null, null, accountCallback);
if (!latch1.await(30, TimeUnit.SECONDS)) {
fail("Timeout");
} else {
assertEquals(TENANT_ID, tenant.getId());
}
if (!latch2.await(30, TimeUnit.SECONDS)) {
fail("Timeout");
} else {
assertNotNull(accounts);
}
List<CountDownLatch> latches = new ArrayList<CountDownLatch>();
AccountReadCallbackClass arc = new AccountReadCallbackClass();
for (CustomerAccount acct: accounts.getItems()) {
CountDownLatch latch = car.getAccountAsync(acct.getId(), arc);
latches.add(latch);
}
for (CountDownLatch l: latches) {
l.await(30, TimeUnit.SECONDS);
}
}
@Test
public void addDeleteProductTest() throws Exception {
ApiContext apiContext = new MozuApiContext(TENANT_ID);
apiContext.setCatalogId(1);
apiContext.setMasterCatalogId(1);
MozuConfig.setBaseUrl(MOZU_BASE_URL);
AppAuthenticator.initialize(createAppAuthInfo(APP_ID, SHARED_SECRET));
//Initalize cache
cacheManager = new CacheManagerImpl();
cacheManager.startCache();
com.mozu.api.cache.CacheManagerFactory.setCacheManager(cacheManager);
Product product = createProduct();
ProductCallback prodCallback = new ProductCallback();
ProductResource prodResource = new ProductResource(apiContext);
CountDownLatch addLatch = prodResource.addProductAsync(product, prodCallback);
if (!addLatch.await(30, TimeUnit.SECONDS)) {
fail("Timeout");
} else {
assertNotNull(addedProduct);
}
prodResource.deleteProduct("TestProductCode");
Product p = prodResource.getProduct("TestProductCode");
assertNull(p);
}
private Product createProduct() {
Product prod = new Product();
prod.setBaseProductCode("BaseProdCode");
prod.setMasterCatalogId(1);
prod.setProductCode("TestProductCode");
prod.setProductUsage("Standard");
prod.setProductTypeId(4);
ProductPrice price = new ProductPrice();
price.setIsoCurrencyCode("USD");
price.setPrice(1.0);
prod.setPrice(price);
ProductLocalizedContent content = new ProductLocalizedContent();
content.setLocaleCode("en-US");
content.setProductName("Test Product");
prod.setContent(content);
Measurement linearMeas = new Measurement();
linearMeas.setUnit("ft");
linearMeas.setValue(2.0);
prod.setPackageHeight(linearMeas);
prod.setPackageLength(linearMeas);
prod.setPackageWidth(linearMeas);
Measurement weightMeas = new Measurement();
weightMeas.setUnit("lbs");
weightMeas.setValue(4.0);
prod.setPackageWeight(weightMeas);
return prod;
}
protected AppAuthInfo createAppAuthInfo(String appId, String sharedSecret) {
AppAuthInfo appAuthInfo = new AppAuthInfo();
appAuthInfo.setApplicationId(appId);
appAuthInfo.setSharedSecret(sharedSecret);
return appAuthInfo;
}
public class TenantCallbackClass implements AsyncCallback<Tenant> {
@Override
public void success(Tenant result) {
tenant = result;
System.out.println("Resultant tenant id: " + result.getId());
}
@Override
public void failure(Exception exception) {
fail("Tenant Failure callback called");
}
@Override
public void cancelled() {
System.out.println("Tenant Cancelled callback called");
}
}
public class AccountCallbackClass implements AsyncCallback<CustomerAccountCollection> {
@Override
public void success(CustomerAccountCollection result) {
accounts = result;
if (result==null) {
fail("No account collection object");
} else if (result.getItems()==null) {
fail("Null items in account collection");
}
System.out.println("Number of CustomerAccounts " + result.getItems().size());
}
@Override
public void failure(Exception exception) {
exception.printStackTrace();
fail("Account Failure callback called");
}
@Override
public void cancelled() {
System.out.println("Account Cancelled callback called");
}
}
public class AccountReadCallbackClass implements AsyncCallback<CustomerAccount> {
@Override
public void success(CustomerAccount result) {
System.out.println("Account " + result.getFirstName() + " " + result.getLastName() + " (id: " + result.getId() + ")");
}
@Override
public void failure(Exception exception) {
exception.printStackTrace();
fail("Account Read Failure callback called");
}
@Override
public void cancelled() {
System.out.println("Account Read Cancelled callback called");
}
}
public class ProductCallback implements AsyncCallback<Product> {
@Override
public void success(Product result) {
addedProduct = result;
System.out.println("Product received " + addedProduct.getProductCode());
}
@Override
public void failure(Exception exception) {
exception.printStackTrace();
fail("Account Read Failure callback called");
}
@Override
public void cancelled() {
System.out.println("Account Read Cancelled callback called");
}
}
}