package com.salesmanager.test.shop.controller.product.rest;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.salesmanager.core.model.catalog.product.attribute.ProductOptionType;
import com.salesmanager.shop.model.catalog.category.Category;
import com.salesmanager.shop.model.catalog.manufacturer.Manufacturer;
import com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription;
import com.salesmanager.shop.model.catalog.manufacturer.PersistableManufacturer;
import com.salesmanager.shop.model.catalog.product.*;
import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductOption;
import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductOptionValue;
import com.salesmanager.shop.model.catalog.product.attribute.ProductOptionDescription;
import com.salesmanager.shop.model.catalog.product.attribute.ProductOptionValueDescription;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.http.*;
import org.springframework.security.crypto.codec.Base64;
import org.springframework.web.client.RestTemplate;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
@Ignore
public class ProductManagementAPITest {
private RestTemplate restTemplate;
private Long testCategoryID;
private Long testProductID;
public HttpHeaders getHeader(){
HttpHeaders headers = new HttpHeaders();
MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
//MediaType.APPLICATION_JSON //for application/json
headers.setContentType(mediaType);
//Basic Authentication
String authorisation = "admin" + ":" + "password";
byte[] encodedAuthorisation = Base64.encode(authorisation.getBytes());
headers.add("Authorization", "Basic " + new String(encodedAuthorisation));
return headers;
}
/**
* Creates a Manufacturer reference object that can be used when creating
* a product
* @throws Exception
*/
@Test
@Ignore
public void createManufacturer() throws Exception {
ManufacturerDescription description = new ManufacturerDescription();
description.setLanguage("en");
description.setName("Tag Heuer");
description.setFriendlyUrl("tag-watches");
description.setTitle("Tag Heuer");
List<ManufacturerDescription> descriptions = new ArrayList<ManufacturerDescription>();
descriptions.add(description);
PersistableManufacturer manufacturer = new PersistableManufacturer();
manufacturer.setOrder(1);
manufacturer.setDescriptions(descriptions);
ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = writer.writeValueAsString(manufacturer);
System.out.println(json);
/* {
"descriptions" : [ {
"name" : "Tag Heuer",
"description" : null,
"friendlyUrl" : "tag-watches",
"keyWords" : null,
"highlights" : null,
"metaDescription" : null,
"title" : "Tag Heuer",
"language" : "en",
"id" : 0
} ],
"order" : 1,
"id" : 0
}*/
restTemplate = new RestTemplate();
HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/manufacturer", entity, PersistableManufacturer.class);
PersistableManufacturer manuf = (PersistableManufacturer) response.getBody();
System.out.println("New Manufacturer ID : " + manuf.getId());
}
/**
* Creates a ProductReview
* requires an existing Customer and an existing Product
* @throws Exception
*/
@Test
@Ignore
public void createProductReview() throws Exception {
//requires an existing product
//requires an existing customer
PersistableProductReview review = new PersistableProductReview();
review.setCustomerId(1L);
review.setProductId(1L);
review.setLanguage("en");
review.setRating(2D);//rating is on 5
review.setDescription("Not as good as expected. From what i understood that was supposed to be premium quality but unfortunately i had to return the item after one week... Verry disapointed !");
review.setDate("2013-06-06");
ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = writer.writeValueAsString(review);
System.out.println(json);
/**
* {
"description" : "Excellent product !",
"productId" : 1,
"rating" : 4.5,
"customerId" : 1,
"date" : "2013-06-06",
"language" : "en"
}
*/
restTemplate = new RestTemplate();
HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/product/review", entity, PersistableProductReview.class);
PersistableProductReview rev = (PersistableProductReview) response.getBody();
System.out.println("New ProductReview ID : " + rev.getId());
}
/**
* Creates a product option value that can be used to create a product attribute
* when creating a new product
* @throws Exception
*/
@Test
@Ignore
public void createOptionValue() throws Exception {
ProductOptionValueDescription description = new ProductOptionValueDescription();
description.setLanguage("en");
description.setName("Red");
List<ProductOptionValueDescription> descriptions = new ArrayList<ProductOptionValueDescription>();
descriptions.add(description);
PersistableProductOptionValue optionValue = new PersistableProductOptionValue();
optionValue.setOrder(1);
optionValue.setCode("colorred");
optionValue.setDescriptions(descriptions);
ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = writer.writeValueAsString(optionValue);
System.out.println(json);
/**
* {
"descriptions" : [ {
"name" : "Red",
"description" : null,
"friendlyUrl" : null,
"keyWords" : null,
"highlights" : null,
"metaDescription" : null,
"title" : null,
"language" : "en",
"id" : 0
} ],
"order" : 1,
"code" : "color-red",
"id" : 0
}
*/
restTemplate = new RestTemplate();
HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/product/optionValue", entity, PersistableProductOptionValue.class);
PersistableProductOptionValue opt = (PersistableProductOptionValue) response.getBody();
System.out.println("New optionValue ID : " + opt.getId());
}
/**
* Creates a new ProductOption
* @throws Exception
*/
@Test
@Ignore
public void createOption() throws Exception {
ProductOptionDescription description = new ProductOptionDescription();
description.setLanguage("en");
description.setName("Color");
List<ProductOptionDescription> descriptions = new ArrayList<ProductOptionDescription>();
descriptions.add(description);
PersistableProductOption option = new PersistableProductOption();
option.setOrder(1);
option.setCode("color");
option.setType(ProductOptionType.Select.name());
option.setDescriptions(descriptions);
ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = writer.writeValueAsString(option);
System.out.println(json);
/**
* {
"descriptions" : [ {
"name" : "Color",
"description" : null,
"friendlyUrl" : null,
"keyWords" : null,
"highlights" : null,
"metaDescription" : null,
"title" : null,
"language" : "en",
"id" : 0
} ],
"type" : SELECT,
"order" : 1,
"code" : "color",
"id" : 0
}
*/
restTemplate = new RestTemplate();
HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/product/option", entity, PersistableProductOption.class);
PersistableProductOption opt = (PersistableProductOption) response.getBody();
System.out.println("New option ID : " + opt.getId());
}
@Test
@Ignore
public void getProducts() throws Exception {
restTemplate = new RestTemplate();
HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
ResponseEntity<ReadableProduct[]> response = restTemplate.exchange("http://localhost:8080/sm-shop/services/rest/products/DEFAULT/en/"+testCategoryID, HttpMethod.GET, httpEntity, ReadableProduct[].class);
if(response.getStatusCode() != HttpStatus.OK){
throw new Exception();
}else{
System.out.println(response.getBody().length + " Product records found.");
}
}
@Test
@Ignore
public void putProduct() throws Exception {
restTemplate = new RestTemplate();
//TODO: Put Product
}
@Test
@Ignore
public void postProduct() throws Exception {
restTemplate = new RestTemplate();
String code = "abcdef";
String categoryCode = "statue";
Category category = new Category();
category.setCode(categoryCode);
List<Category> categories = new ArrayList<Category>();
categories.add(category);
String manufacturer = "temple";
Manufacturer collection = new Manufacturer();
collection.setCode(manufacturer);
//core properties
PersistableProduct product = new PersistableProduct();
product.setSku(code);
product.setManufacturer(collection);
product.setCategories(categories);
product.setSortOrder(0);//set iterator as sort order
product.setAvailable(true);//force availability
product.setProductVirtual(false);//force tangible good
product.setQuantityOrderMinimum(1);//force to 1 minimum when ordering
product.setProductShipeable(true);//all items are shipeable
/** images **/
String image = "/Users/carlsamson/Documents/csti/mobilia-exotika/pictures-600-resize/buddha1.jpg";
File imgPath = new File(image);
PersistableImage persistableImage = new PersistableImage();
persistableImage.setBytes(this.extractBytes(imgPath));
persistableImage.setImageName(imgPath.getName());
List<PersistableImage> images = new ArrayList<PersistableImage>();
images.add(persistableImage);
product.setImages(images);
product.setProductHeight(new BigDecimal(20));
product.setProductLength(new BigDecimal(20));
product.setProductWeight(new BigDecimal(20));
product.setProductWidth(new BigDecimal(20));
product.setQuantity(5);
product.setQuantityOrderMaximum(2);
PersistableProductPrice productPrice = new PersistableProductPrice();
productPrice.setDefaultPrice(true);
productPrice.setOriginalPrice(new BigDecimal(250));
productPrice.setDiscountedPrice(new BigDecimal(125));
List<PersistableProductPrice> productPriceList = new ArrayList<PersistableProductPrice>();
productPriceList.add(productPrice);
product.setProductPrices(productPriceList);
//product.setSortOrder(Integer.parseInt(record.get("position")));
List<ProductDescription> descriptions = new ArrayList<ProductDescription>();
//add english description
ProductDescription description = new ProductDescription();
description.setLanguage("en");
description.setTitle("Buddha Head");
description.setName("Buddha Head");
description.setDescription("Buddha Head");
description.setFriendlyUrl("buddha-head");
//description.setHighlights(record.get("highlights_en"));
descriptions.add(description);
//add french description
description = new ProductDescription();
description.setLanguage("fr");
description.setTitle("TĂȘte de Buddha");
description.setName("TĂȘte de Buddha");
description.setDescription(description.getName());
description.setFriendlyUrl("tete-de-buddha");
//
descriptions.add(description);
product.setDescriptions(descriptions);
ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = writer.writeValueAsString(product);
System.out.println(json);
HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
//post to create category web service
ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/product", entity, PersistableProduct.class);
PersistableProduct prod = (PersistableProduct) response.getBody();
System.out.println("---------------------");
}
@Test
@Ignore
public void deleteProduct() throws Exception {
restTemplate = new RestTemplate();
HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
restTemplate.exchange("http://localhost:8080/sm-shop/services/rest/products/DEFAULT/en/"+testCategoryID+"/"+testProductID, HttpMethod.DELETE, httpEntity, ReadableProduct.class);
System.out.println("Product "+testProductID+" Deleted.");
}
/** private helper methods **/
public byte[] extractBytes (File imgPath) throws Exception {
FileInputStream fis = new FileInputStream(imgPath);
BufferedInputStream inputStream = new BufferedInputStream(fis);
byte[] fileBytes = new byte[(int) imgPath.length()];
inputStream.read(fileBytes);
inputStream.close();
return fileBytes;
}
}