package com.xebialabs.store.web.rest; import com.xebialabs.store.StoreApp; import com.xebialabs.store.domain.Product; import com.xebialabs.store.repository.ProductRepository; import com.xebialabs.store.service.ProductService; import com.xebialabs.store.web.rest.errors.ExceptionTranslator; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.web.PageableHandlerMethodArgumentResolver; import org.springframework.http.MediaType; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Base64Utils; import javax.persistence.EntityManager; import java.math.BigDecimal; import java.util.List; import static com.xebialabs.store.web.rest.TestUtil.createFormattingConversionService; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import com.xebialabs.store.domain.enumeration.Size; /** * Test class for the ProductResource REST controller. * * @see ProductResource */ @RunWith(SpringRunner.class) @SpringBootTest(classes = StoreApp.class) public class ProductResourceIntTest { private static final String DEFAULT_NAME = "AAAAAAAAAA"; private static final String UPDATED_NAME = "BBBBBBBBBB"; private static final String DEFAULT_DESCRIPTION = "AAAAAAAAAA"; private static final String UPDATED_DESCRIPTION = "BBBBBBBBBB"; private static final BigDecimal DEFAULT_PRICE = new BigDecimal(0); private static final BigDecimal UPDATED_PRICE = new BigDecimal(1); private static final Size DEFAULT_SIZE = Size.S; private static final Size UPDATED_SIZE = Size.M; private static final byte[] DEFAULT_IMAGE = TestUtil.createByteArray(1, "0"); private static final byte[] UPDATED_IMAGE = TestUtil.createByteArray(1, "1"); private static final String DEFAULT_IMAGE_CONTENT_TYPE = "image/jpg"; private static final String UPDATED_IMAGE_CONTENT_TYPE = "image/png"; @Autowired private ProductRepository productRepository; @Autowired private ProductService productService; @Autowired private MappingJackson2HttpMessageConverter jacksonMessageConverter; @Autowired private PageableHandlerMethodArgumentResolver pageableArgumentResolver; @Autowired private ExceptionTranslator exceptionTranslator; @Autowired private EntityManager em; private MockMvc restProductMockMvc; private Product product; @Before public void setup() { MockitoAnnotations.initMocks(this); final ProductResource productResource = new ProductResource(productService); this.restProductMockMvc = MockMvcBuilders.standaloneSetup(productResource) .setCustomArgumentResolvers(pageableArgumentResolver) .setControllerAdvice(exceptionTranslator) .setConversionService(createFormattingConversionService()) .setMessageConverters(jacksonMessageConverter).build(); } /** * Create an entity for this test. * * This is a static method, as tests for other entities might also need it, * if they test an entity which requires the current entity. */ public static Product createEntity(EntityManager em) { Product product = new Product() .name(DEFAULT_NAME) .description(DEFAULT_DESCRIPTION) .price(DEFAULT_PRICE) .size(DEFAULT_SIZE) .image(DEFAULT_IMAGE) .imageContentType(DEFAULT_IMAGE_CONTENT_TYPE); return product; } @Before public void initTest() { product = createEntity(em); } @Test @Transactional public void createProduct() throws Exception { int databaseSizeBeforeCreate = productRepository.findAll().size(); // Create the Product restProductMockMvc.perform(post("/api/products") .contentType(TestUtil.APPLICATION_JSON_UTF8) .content(TestUtil.convertObjectToJsonBytes(product))) .andExpect(status().isCreated()); // Validate the Product in the database List<Product> productList = productRepository.findAll(); assertThat(productList).hasSize(databaseSizeBeforeCreate + 1); Product testProduct = productList.get(productList.size() - 1); assertThat(testProduct.getName()).isEqualTo(DEFAULT_NAME); assertThat(testProduct.getDescription()).isEqualTo(DEFAULT_DESCRIPTION); assertThat(testProduct.getPrice()).isEqualTo(DEFAULT_PRICE); assertThat(testProduct.getSize()).isEqualTo(DEFAULT_SIZE); assertThat(testProduct.getImage()).isEqualTo(DEFAULT_IMAGE); assertThat(testProduct.getImageContentType()).isEqualTo(DEFAULT_IMAGE_CONTENT_TYPE); } @Test @Transactional public void createProductWithExistingId() throws Exception { int databaseSizeBeforeCreate = productRepository.findAll().size(); // Create the Product with an existing ID product.setId(1L); // An entity with an existing ID cannot be created, so this API call must fail restProductMockMvc.perform(post("/api/products") .contentType(TestUtil.APPLICATION_JSON_UTF8) .content(TestUtil.convertObjectToJsonBytes(product))) .andExpect(status().isBadRequest()); // Validate the Product in the database List<Product> productList = productRepository.findAll(); assertThat(productList).hasSize(databaseSizeBeforeCreate); } @Test @Transactional public void checkNameIsRequired() throws Exception { int databaseSizeBeforeTest = productRepository.findAll().size(); // set the field null product.setName(null); // Create the Product, which fails. restProductMockMvc.perform(post("/api/products") .contentType(TestUtil.APPLICATION_JSON_UTF8) .content(TestUtil.convertObjectToJsonBytes(product))) .andExpect(status().isBadRequest()); List<Product> productList = productRepository.findAll(); assertThat(productList).hasSize(databaseSizeBeforeTest); } @Test @Transactional public void checkPriceIsRequired() throws Exception { int databaseSizeBeforeTest = productRepository.findAll().size(); // set the field null product.setPrice(null); // Create the Product, which fails. restProductMockMvc.perform(post("/api/products") .contentType(TestUtil.APPLICATION_JSON_UTF8) .content(TestUtil.convertObjectToJsonBytes(product))) .andExpect(status().isBadRequest()); List<Product> productList = productRepository.findAll(); assertThat(productList).hasSize(databaseSizeBeforeTest); } @Test @Transactional public void checkSizeIsRequired() throws Exception { int databaseSizeBeforeTest = productRepository.findAll().size(); // set the field null product.setSize(null); // Create the Product, which fails. restProductMockMvc.perform(post("/api/products") .contentType(TestUtil.APPLICATION_JSON_UTF8) .content(TestUtil.convertObjectToJsonBytes(product))) .andExpect(status().isBadRequest()); List<Product> productList = productRepository.findAll(); assertThat(productList).hasSize(databaseSizeBeforeTest); } @Test @Transactional public void getAllProducts() throws Exception { // Initialize the database productRepository.saveAndFlush(product); // Get all the productList restProductMockMvc.perform(get("/api/products?sort=id,desc")) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) .andExpect(jsonPath("$.[*].id").value(hasItem(product.getId().intValue()))) .andExpect(jsonPath("$.[*].name").value(hasItem(DEFAULT_NAME.toString()))) .andExpect(jsonPath("$.[*].description").value(hasItem(DEFAULT_DESCRIPTION.toString()))) .andExpect(jsonPath("$.[*].price").value(hasItem(DEFAULT_PRICE.intValue()))) .andExpect(jsonPath("$.[*].size").value(hasItem(DEFAULT_SIZE.toString()))) .andExpect(jsonPath("$.[*].imageContentType").value(hasItem(DEFAULT_IMAGE_CONTENT_TYPE))) .andExpect(jsonPath("$.[*].image").value(hasItem(Base64Utils.encodeToString(DEFAULT_IMAGE)))); } @Test @Transactional public void getProduct() throws Exception { // Initialize the database productRepository.saveAndFlush(product); // Get the product restProductMockMvc.perform(get("/api/products/{id}", product.getId())) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)) .andExpect(jsonPath("$.id").value(product.getId().intValue())) .andExpect(jsonPath("$.name").value(DEFAULT_NAME.toString())) .andExpect(jsonPath("$.description").value(DEFAULT_DESCRIPTION.toString())) .andExpect(jsonPath("$.price").value(DEFAULT_PRICE.intValue())) .andExpect(jsonPath("$.size").value(DEFAULT_SIZE.toString())) .andExpect(jsonPath("$.imageContentType").value(DEFAULT_IMAGE_CONTENT_TYPE)) .andExpect(jsonPath("$.image").value(Base64Utils.encodeToString(DEFAULT_IMAGE))); } @Test @Transactional public void getNonExistingProduct() throws Exception { // Get the product restProductMockMvc.perform(get("/api/products/{id}", Long.MAX_VALUE)) .andExpect(status().isNotFound()); } @Test @Transactional public void updateProduct() throws Exception { // Initialize the database productService.save(product); int databaseSizeBeforeUpdate = productRepository.findAll().size(); // Update the product Product updatedProduct = productRepository.findById(product.getId()).get(); // Disconnect from session so that the updates on updatedProduct are not directly saved in db em.detach(updatedProduct); updatedProduct .name(UPDATED_NAME) .description(UPDATED_DESCRIPTION) .price(UPDATED_PRICE) .size(UPDATED_SIZE) .image(UPDATED_IMAGE) .imageContentType(UPDATED_IMAGE_CONTENT_TYPE); restProductMockMvc.perform(put("/api/products") .contentType(TestUtil.APPLICATION_JSON_UTF8) .content(TestUtil.convertObjectToJsonBytes(updatedProduct))) .andExpect(status().isOk()); // Validate the Product in the database List<Product> productList = productRepository.findAll(); assertThat(productList).hasSize(databaseSizeBeforeUpdate); Product testProduct = productList.get(productList.size() - 1); assertThat(testProduct.getName()).isEqualTo(UPDATED_NAME); assertThat(testProduct.getDescription()).isEqualTo(UPDATED_DESCRIPTION); assertThat(testProduct.getPrice()).isEqualTo(UPDATED_PRICE); assertThat(testProduct.getSize()).isEqualTo(UPDATED_SIZE); assertThat(testProduct.getImage()).isEqualTo(UPDATED_IMAGE); assertThat(testProduct.getImageContentType()).isEqualTo(UPDATED_IMAGE_CONTENT_TYPE); } @Test @Transactional public void updateNonExistingProduct() throws Exception { int databaseSizeBeforeUpdate = productRepository.findAll().size(); // Create the Product // If the entity doesn't have an ID, it will throw BadRequestAlertException restProductMockMvc.perform(put("/api/products") .contentType(TestUtil.APPLICATION_JSON_UTF8) .content(TestUtil.convertObjectToJsonBytes(product))) .andExpect(status().isBadRequest()); // Validate the Product in the database List<Product> productList = productRepository.findAll(); assertThat(productList).hasSize(databaseSizeBeforeUpdate); } @Test @Transactional public void deleteProduct() throws Exception { // Initialize the database productService.save(product); int databaseSizeBeforeDelete = productRepository.findAll().size(); // Get the product restProductMockMvc.perform(delete("/api/products/{id}", product.getId()) .accept(TestUtil.APPLICATION_JSON_UTF8)) .andExpect(status().isOk()); // Validate the database is empty List<Product> productList = productRepository.findAll(); assertThat(productList).hasSize(databaseSizeBeforeDelete - 1); } @Test @Transactional public void equalsVerifier() throws Exception { TestUtil.equalsVerifier(Product.class); Product product1 = new Product(); product1.setId(1L); Product product2 = new Product(); product2.setId(product1.getId()); assertThat(product1).isEqualTo(product2); product2.setId(2L); assertThat(product1).isNotEqualTo(product2); product1.setId(null); assertThat(product1).isNotEqualTo(product2); } }