package org.dicadeveloper.weplantaforest.planting;
import static org.hamcrest.Matchers.isOneOf;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
import org.dicadeveloper.weplantaforest.common.testSupport.CleanDbRule;
import org.dicadeveloper.weplantaforest.projects.ProjectArticleRepository;
import org.dicadeveloper.weplantaforest.support.Uris;
import org.dicadeveloper.weplantaforest.testsupport.DbInjecter;
import org.dicadeveloper.weplantaforest.trees.TreeRepository;
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.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.context.WebApplicationContext;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringBootTest({ "spring.profiles.active=test" })
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class PlantPageControllerGetForPriceTest {
private static MockMvc mockMvc;
@Rule
@Autowired
public CleanDbRule _cleanDbRule;
@Autowired
private DbInjecter dbInjecter;
@Autowired
private WebApplicationContext webApplicationContext;
@Autowired
private ProjectArticleRepository _projectArticleRepository;
@Autowired
private TreeRepository _treeRepository;
static long timeOfPlanting;
static boolean entitiesInjected = false;
@Before
public void setup() {
if (!entitiesInjected) {
mockMvc = webAppContextSetup(this.webApplicationContext).build();
timeOfPlanting = System.currentTimeMillis();
dbInjecter.injectTreeType("wood", "desc", 0.5);
dbInjecter.injectTreeType("doow", "desc", 0.5);
dbInjecter.injectTreeType("wodo", "desc", 0.5);
dbInjecter.injectTreeType("dowo", "desc", 0.5);
dbInjecter.injectUser("Adam");
dbInjecter.injectProject("Project A", "Adam", "adam's project", true, 0, 0);
dbInjecter.injectProject("Project B", "Adam", "adam's project", true, 0, 0);
entitiesInjected = true;
}
}
@After
public void clear() {
_treeRepository.deleteAll();
_projectArticleRepository.deleteAll();
}
@Test
public void testGetCartWithOneArticle() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 10, 1.0, 1.0);
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 1000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(10))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(1000))
.andExpect(jsonPath("$.targetPrice").value(1000));
}
@Test
public void testGetCartWithTwoArticles() throws Exception {
dbInjecter.injectProjectArticle("doow", "Project A", 10, 1.0, 0.8);
dbInjecter.injectProjectArticle("wood", "Project A", 10, 1.0, 0.5);
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 1000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].amount").value(7))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(3))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(1000))
.andExpect(jsonPath("$.targetPrice").value(1000));
}
@Test
public void testGetCartWithThreeArticles() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 10, 1.0, 0.8);
dbInjecter.injectProjectArticle("doow", "Project A", 10, 1.0, 0.5);
dbInjecter.injectProjectArticle("wodo", "Project A", 10, 1.0, 0.3);
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 1000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(7))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].amount").value(isOneOf(1, 2)))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wodo'].amount").value(isOneOf(1, 2)))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wodo'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(1000))
.andExpect(jsonPath("$.targetPrice").value(1000));
}
@Test
public void testGetCartWithFourArticles() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 10, 1.0, 0.8);
dbInjecter.injectProjectArticle("doow", "Project A", 10, 1.0, 0.5);
dbInjecter.injectProjectArticle("wodo", "Project A", 10, 1.0, 0.3);
dbInjecter.injectProjectArticle("dowo", "Project A", 10, 1.0, 0.3);
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 1000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(7))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].amount").value(1))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wodo'].amount").value(1))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wodo'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['dowo'].amount").value(1))
.andExpect(jsonPath("$.projects['Project A'].plantItems['dowo'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(1000))
.andExpect(jsonPath("$.targetPrice").value(1000));
}
@Test
public void testGetCartWithOneArticleNotEnoughTreesRemaining() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 10, 1.0, 1.0);
dbInjecter.injectTreeToProject("wood", "Adam", 5, timeOfPlanting, "Project A");
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 1000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(5))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(500))
.andExpect(jsonPath("$.targetPrice").value(1000));
}
@Test
public void testGetCartWithTwoArticlesNotEnoughTreesRemainingForHighestMarge() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 10, 1.0, 1.0);
dbInjecter.injectProjectArticle("doow", "Project A", 10, 1.0, 0.5);
dbInjecter.injectTreeToProject("wood", "Adam", 5, timeOfPlanting, "Project A");
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 1000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(5))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].amount").value(5))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(1000))
.andExpect(jsonPath("$.targetPrice").value(1000));
}
@Test
public void testGetCartWithTwoArticlesNoTreesRemainingForHighestMarge() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 10, 1.0, 1.0);
dbInjecter.injectProjectArticle("doow", "Project A", 10, 1.0, 0.5);
dbInjecter.injectTreeToProject("wood", "Adam", 10, timeOfPlanting, "Project A");
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 1000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].amount").value(10))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(1000))
.andExpect(jsonPath("$.targetPrice").value(1000));
}
@Test
public void testGetCartWithTwoArticlesNoTreesRemainingFromLowerMarge() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 10, 1.0, 1.0);
dbInjecter.injectProjectArticle("doow", "Project A", 10, 1.0, 0.5);
dbInjecter.injectTreeToProject("doow", "Adam", 10, timeOfPlanting, "Project A");
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 1000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(10))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(1000))
.andExpect(jsonPath("$.targetPrice").value(1000));
}
@Test
public void testGetCartWithTwoArticlesWherePriceTenCantBeReached() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 10, 3.0, 1.0);
dbInjecter.injectProjectArticle("doow", "Project A", 10, 1.5, 0.5);
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 1000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(2))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(300))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].amount").value(2))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].treePrice").value(150))
.andExpect(jsonPath("$.actualPrice").value(900))
.andExpect(jsonPath("$.targetPrice").value(1000));
}
@Test
public void testGetCartWithTwoArticlesFromDifferentProjects() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 10, 1.0, 1.0);
dbInjecter.injectProjectArticle("doow", "Project B", 10, 1.0, 0.5);
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 1000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(7))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project B'].plantItems['doow'].amount").value(3))
.andExpect(jsonPath("$.projects['Project B'].plantItems['doow'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(1000))
.andExpect(jsonPath("$.targetPrice").value(1000));
}
@Test
public void testGetCartWithFourArticlesFromDifferentProjects() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 10, 3.0, 2.0);
dbInjecter.injectProjectArticle("doow", "Project A", 10, 2.0, 1.0);
dbInjecter.injectProjectArticle("wood", "Project B", 10, 2.0, 1.0);
dbInjecter.injectProjectArticle("doow", "Project B", 10, 2.0, 0.5);
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 1000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(2))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(300))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].amount").value(isOneOf(0, 1)))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].treePrice").value(200))
.andExpect(jsonPath("$.projects['Project B'].plantItems['wood'].amount").value(isOneOf(0, 1)))
.andExpect(jsonPath("$.projects['Project B'].plantItems['wood'].treePrice").value(200))
.andExpect(jsonPath("$.projects['Project B'].plantItems['doow'].amount").value(isOneOf(0, 1)))
.andExpect(jsonPath("$.projects['Project B'].plantItems['doow'].treePrice").value(200))
.andExpect(jsonPath("$.actualPrice").value(1000))
.andExpect(jsonPath("$.targetPrice").value(1000));
}
@Test
public void testGetCartWithFourArticlesFromDifferentProjectsWithOtherTargetedPrice() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 10, 3.0, 2.0);
dbInjecter.injectProjectArticle("doow", "Project A", 10, 2.0, 1.0);
dbInjecter.injectProjectArticle("wood", "Project B", 10, 2.0, 1.0);
dbInjecter.injectProjectArticle("doow", "Project B", 10, 2.0, 0.5);
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 3000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(7))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(300))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].amount").value(isOneOf(1, 2)))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].treePrice").value(200))
.andExpect(jsonPath("$.projects['Project B'].plantItems['wood'].amount").value(isOneOf(1, 2)))
.andExpect(jsonPath("$.projects['Project B'].plantItems['wood'].treePrice").value(200))
.andExpect(jsonPath("$.projects['Project B'].plantItems['doow'].amount").value(isOneOf(1, 2)))
.andExpect(jsonPath("$.projects['Project B'].plantItems['doow'].treePrice").value(200))
.andExpect(jsonPath("$.actualPrice").value(2900))
.andExpect(jsonPath("$.targetPrice").value(3000));
}
@Test
public void testGetCartWithFourArticlesThreeArticlesAveraged() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 500, 3.5, 2.0);
dbInjecter.injectProjectArticle("doow", "Project A", 500, 1.0, 0.5);
dbInjecter.injectProjectArticle("wodo", "Project A", 500, 1.0, 0.5);
dbInjecter.injectProjectArticle("dowo", "Project A", 500, 1.0, 0.5);
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 100000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(200))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(350))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].amount").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wodo'].amount").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wodo'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['dowo'].amount").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['dowo'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(100000))
.andExpect(jsonPath("$.targetPrice").value(100000));
}
@Test
public void testGetCartWithFourArticlesTwoArticlesAveragedOneNotEnough() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 500, 3.5, 2.0);
dbInjecter.injectProjectArticle("doow", "Project A", 500, 1.0, 0.5);
dbInjecter.injectProjectArticle("wodo", "Project A", 500, 1.0, 0.5);
dbInjecter.injectProjectArticle("dowo", "Project A", 100, 1.0, 0.5);
dbInjecter.injectTreeToProject("dowo", "Adam", 50, System.currentTimeMillis(), "Project A");
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 100000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(200))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(350))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].amount").value(125))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wodo'].amount").value(125))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wodo'].treePrice").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['dowo'].amount").value(50))
.andExpect(jsonPath("$.projects['Project A'].plantItems['dowo'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(100000))
.andExpect(jsonPath("$.targetPrice").value(100000));
}
@Test
public void testGetCartWithTwoArticlesLowerMargeNotEnoughRemaining() throws Exception {
dbInjecter.injectProjectArticle("wood", "Project A", 500, 3.0, 2.0);
dbInjecter.injectProjectArticle("doow", "Project A", 100, 1.0, 0.5);
mockMvc.perform(get(Uris.COMPLEX_PROPOSAL_FOR_PRICE + "{targetedPrice}", 100000).accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].amount").value(300))
.andExpect(jsonPath("$.projects['Project A'].plantItems['wood'].treePrice").value(300))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].amount").value(100))
.andExpect(jsonPath("$.projects['Project A'].plantItems['doow'].treePrice").value(100))
.andExpect(jsonPath("$.actualPrice").value(100000))
.andExpect(jsonPath("$.targetPrice").value(100000));
}
}