package org.dicadeveloper.weplantaforest.planting;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
import java.util.List;
import org.dicadeveloper.weplantaforest.cart.Cart;
import org.dicadeveloper.weplantaforest.cart.CartRepository;
import org.dicadeveloper.weplantaforest.common.testSupport.CleanDbRule;
import org.dicadeveloper.weplantaforest.common.testSupport.TestUtil;
import org.dicadeveloper.weplantaforest.planting.plantbag.PlantBag;
import org.dicadeveloper.weplantaforest.projects.ProjectArticle;
import org.dicadeveloper.weplantaforest.projects.ProjectArticleRepository;
import org.dicadeveloper.weplantaforest.security.TokenAuthenticationService;
import org.dicadeveloper.weplantaforest.support.Uris;
import org.dicadeveloper.weplantaforest.testsupport.DbInjecter;
import org.dicadeveloper.weplantaforest.testsupport.PlantBagBuilder;
import org.dicadeveloper.weplantaforest.trees.Tree;
import org.dicadeveloper.weplantaforest.trees.TreeRepository;
import org.dicadeveloper.weplantaforest.user.UserRepository;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringBootTest({ "spring.profiles.active=test" })
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
@Transactional
public class PlantPageControllerPostMethodTest {
private static MockMvc mockMvc;
@Rule
@Autowired
public CleanDbRule _cleanDbRule;
@Autowired
private DbInjecter dbInjecter;
@Autowired
private WebApplicationContext webApplicationContext;
@Autowired
private CartRepository _cartRepository;
@Autowired
private TreeRepository _treeRepository;
@Autowired
private ProjectArticleRepository _projectArticleRepository;
@Autowired
private TokenAuthenticationService _tokenAuthenticationService;
@Autowired
private UserRepository _userRepository;
static boolean entitiesInjected = false;
PlantBagBuilder plantBagBuilder = new PlantBagBuilder();
@Before
public void setup() {
if (!entitiesInjected) {
mockMvc = webAppContextSetup(this.webApplicationContext).build();
dbInjecter.injectTreeType("wood", "desc", 0.5);
dbInjecter.injectTreeType("doow", "desc", 0.5);
dbInjecter.injectTreeType("wodo", "desc", 0.5);
dbInjecter.injectUser("Adam");
dbInjecter.injectUser("Bert");
dbInjecter.injectProject("Project A", "Adam", "adam's project", true, 0, 0);
dbInjecter.injectProjectArticle("wood", "Project A", 10, 3.0, 1.0);
dbInjecter.injectProjectArticle("doow", "Project A", 10, 3.0, 1.0);
dbInjecter.injectProjectArticle("wodo", "Project A", 10, 3.0, 1.0);
entitiesInjected = true;
}
}
@After
public void clear() {
_cartRepository.deleteAll();
_treeRepository.deleteAll();
}
@Test
@Rollback(false)
public void testDonateTreesSatusOk() throws Exception {
String userToken = _tokenAuthenticationService.getTokenFromUser(_userRepository.findOne(1L));
PlantBag plantPageData = plantBagBuilder.initializeProjectDataAndAddToPlantBag("Project A")
.createPlantItemAndAddToPlantBag(3, 300, "wood", "Project A")
.build();
mockMvc.perform(post(Uris.COMPLEX_DONATION).contentType(TestUtil.APPLICATION_JSON_UTF8)
.header("X-AUTH-TOKEN", userToken)
.content(TestUtil.convertObjectToJsonBytes(plantPageData)))
.andExpect(status().isOk());
assertThat(_cartRepository.count()).isEqualTo(1L);
List<Cart> carts = _cartRepository.findCartsByUserId(1L);
assertThat(carts.get(0)
.getTotalPrice()
.doubleValue()).isEqualTo(9.0);
assertThat(carts.get(0)
.getCartItems()
.get(0)
.getProjectArticleId()).isEqualTo(1);
assertThat(carts.get(0)
.getCartItems()
.get(0)
.getTree()
.getTreeType()
.getName()).isEqualTo("wood");
assertThat(carts.get(0)
.getBuyer()
.getName()).isEqualTo("Adam");
assertThat(_treeRepository.count()).isEqualTo(1L);
ProjectArticle projectArticle = _projectArticleRepository.findOne(1L);
long amountOfTreesPlantedByProjectArticle = _treeRepository.countAlreadyPlantedTreesByProjectArticle(projectArticle);
assertThat(amountOfTreesPlantedByProjectArticle).isEqualTo(3);
long createdTreeId = carts.get(0)
.getTrees()
.get(0)
.getId();
Tree createdTree = _treeRepository.findOne(createdTreeId);
assertThat(createdTree.getAmount()).isEqualTo(3);
assertThat(createdTree.getOwner()
.getName()).isEqualTo("Adam");
assertThat(createdTree.getProjectArticle()
.getArticleId()).isEqualTo(1L);
}
@Test
@Rollback(false)
public void testDonateTreesWithMultipleEntriesSatusOk() throws Exception {
String userToken = _tokenAuthenticationService.getTokenFromUser(_userRepository.findOne(2L));
PlantBag plantPageData = plantBagBuilder.initializeProjectDataAndAddToPlantBag("Project A")
.createPlantItemAndAddToPlantBag(3, 300, "wood", "Project A")
.createPlantItemAndAddToPlantBag(3, 300, "wodo", "Project A")
.createPlantItemAndAddToPlantBag(3, 300, "doow", "Project A")
.build();
mockMvc.perform(post(Uris.COMPLEX_DONATION).contentType(TestUtil.APPLICATION_JSON_UTF8)
.header("X-AUTH-TOKEN", userToken)
.content(TestUtil.convertObjectToJsonBytes(plantPageData)))
.andExpect(status().isOk());
assertThat(_cartRepository.count()).isEqualTo(1L);
List<Cart> carts = _cartRepository.findCartsByUserId(2L);
assertThat(carts.get(0)
.getTotalPrice()
.doubleValue()).isEqualTo(27.0);
assertThat(carts.get(0)
.getPlantArticleIds()).contains(1L, 2L, 3L);
assertThat(carts.get(0)
.getBuyer()
.getName()).isEqualTo("Bert");
assertThat(_treeRepository.count()).isEqualTo(3L);
for (int i = 1; i <= 3; i++) {
ProjectArticle projectArticle = _projectArticleRepository.findOne((long) i);
long amountOfTreesPlantedByProjectArticle = _treeRepository.countAlreadyPlantedTreesByProjectArticle(projectArticle);
assertThat(amountOfTreesPlantedByProjectArticle).isEqualTo(3);
long createdTreeId = carts.get(0)
.getTrees()
.get(i - 1)
.getId();
Tree tree = _treeRepository.findOne(createdTreeId);
assertThat(tree.getOwner()
.getName()).isEqualTo("Bert");
}
}
@Test
public void testDonateTreesSatusBadRequest() throws Exception {
PlantBag plantPageData = plantBagBuilder.initializeProjectDataAndAddToPlantBag("Project A")
.createPlantItemAndAddToPlantBag(11, 300, "wood", "Project A")
.build();
mockMvc.perform(post(Uris.COMPLEX_DONATION).contentType(TestUtil.APPLICATION_JSON_UTF8)
.content(TestUtil.convertObjectToJsonBytes(plantPageData)))
.andExpect(status().isBadRequest());
assertThat(_cartRepository.count()).isEqualTo(0);
}
}