package org.dicadeveloper.weplantaforest.gift;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import javax.transaction.Transactional;
import org.dicadeveloper.weplantaforest.cart.CartRepository;
import org.dicadeveloper.weplantaforest.code.Code;
import org.dicadeveloper.weplantaforest.code.CodeRepository;
import org.dicadeveloper.weplantaforest.common.errorHandling.IpatException;
import org.dicadeveloper.weplantaforest.common.testSupport.CleanDbRule;
import org.dicadeveloper.weplantaforest.gift.Gift.Status;
import org.dicadeveloper.weplantaforest.planting.plantbag.PlantBag;
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.User;
import org.junit.FixMethodOrder;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
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.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest({ "spring.profiles.active=test" })
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class GiftServiceTest {
@Rule
@Autowired
public CleanDbRule _cleanDbRule;
@Autowired
private DbInjecter _dbInjecter;
@Autowired
private GiftService _giftService;
@Autowired
private GiftRepository _giftRepository;
@Autowired
private CodeRepository _codeRepository;
@Autowired
private CartRepository _cartRepository;
@Autowired
private TreeRepository _treeRepository;
PlantBagBuilder plantBagBuilder = new PlantBagBuilder();
@Test
public void testACreateGift() {
User consignor = _dbInjecter.injectUser("Adam");
_dbInjecter.injectTreeType("wood", "this is a wood", 0.5);
_dbInjecter.injectProject("Project A", "Adam", "this is a project", true, 0, 0);
_dbInjecter.injectProjectArticle("wood", "Project A", 10, 1.0, 0.5);
PlantBag plantBag = plantBagBuilder.initializeProjectDataAndAddToPlantBag("Project A")
.createPlantItemAndAddToPlantBag(5, 5, "wood", "Project A")
.build();
try {
_giftService.generateGift(consignor, plantBag);
} catch (IpatException e) {
fail("No Exception expected, when generating a gift");
}
assertEquals(1, _giftRepository.count());
assertEquals(1, _codeRepository.count());
assertEquals(1, _cartRepository.count());
}
@Test
@Transactional
public void testBRedeemGiftCode() {
User recipient = _dbInjecter.injectUser("Recipient");
Code code = _codeRepository.findOne(1L);
Tree tree = _treeRepository.findOne(1L);
assertEquals(5, tree.getAmount());
assertEquals("Adam", tree.getOwner()
.getName());
Gift gift = _giftRepository.findOne(1L);
gift.setStatus(Status.UNREDEEMED);
_giftRepository.save(gift);
try {
_giftService.redeemGiftCode(recipient, code.getCode());
} catch (IpatException e) {
fail(String.format("No Exception expected, when redeeming a gift code.\nerrorCode: %s", e.getErrorInfos()
.get(0)
.getErrorCode()));
}
gift = _giftRepository.findOne(1L);
assertEquals(Status.REDEEMED, gift.getStatus());
tree = _treeRepository.findOne(1L);
assertEquals(5, tree.getAmount());
assertEquals("Recipient", tree.getOwner()
.getName());
}
}