package org.dicadeveloper.weplantaforest.event;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import javax.transaction.Transactional;
import org.dicadeveloper.weplantaforest.admin.codes.Team;
import org.dicadeveloper.weplantaforest.cart.Cart;
import org.dicadeveloper.weplantaforest.cart.CartRepository;
import org.dicadeveloper.weplantaforest.cart.CartState;
import org.dicadeveloper.weplantaforest.code.Code;
import org.dicadeveloper.weplantaforest.code.CodeRepository;
import org.dicadeveloper.weplantaforest.common.code.CodeHelper;
import org.dicadeveloper.weplantaforest.common.errorHandling.IpatException;
import org.dicadeveloper.weplantaforest.common.testSupport.CleanDbRule;
import org.dicadeveloper.weplantaforest.testsupport.DbInjecter;
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 EventServiceTest {
@Rule
@Autowired
public CleanDbRule _cleanDbRule;
@Autowired
private DbInjecter _dbInjecter;
@Autowired
private EventService _eventService;
@Autowired
private EventRepository _eventRepository;
@Autowired
private CodeRepository _codeRepository;
@Autowired
private CartRepository _cartRepository;
@Autowired
private TreeRepository _treeRepository;
@Test
@Transactional
public void testRedeemEventCode() {
String codeString = prepareDbAndReturnCodeString();
assertEquals(1, _cartRepository.count());
assertEquals(1, _eventRepository.count());
assertEquals(1, _codeRepository.count());
assertEquals(CartState.GENERATED, _cartRepository.findOne(1L).getCartState());
Tree tree = _treeRepository.findOne(1L);
assertEquals(5, tree.getAmount());
assertEquals("eventUser", tree.getOwner().getName());
User redeemer = _dbInjecter.injectUser("redeemer");
try {
_eventService.redeemEventCode(redeemer, codeString);
} catch (IpatException e) {
fail(String.format("No Exception expected, when redeeming a gift code.\nerrorCode: %s", e.getErrorInfos().get(0).getErrorCode()));
}
assertEquals(CartState.VERIFIED, _cartRepository.findOne(1L).getCartState());
tree = _treeRepository.findOne(1L);
assertEquals(5, tree.getAmount());
assertEquals("redeemer", tree.getOwner().getName());
}
private String prepareDbAndReturnCodeString() {
User eventUser = _dbInjecter.injectUser("eventUser");
Team eventTeam = _dbInjecter.injectTeam("eventTeam", "eventUser");
Event event = _dbInjecter.injectEvent("event", eventUser, eventTeam);
_dbInjecter.injectTreeType("wood", "this is a wood", 0.5);
_dbInjecter.injectProject("Project A", "eventUser", "this is a project", true, 0, 0);
_dbInjecter.injectProjectArticle("wood", "Project A", 10, 1.0, 0.5);
Tree tree = _dbInjecter.injectTreeToProject("wood", "eventUser", 5, 10000, "Project A");
Cart cart = _dbInjecter.injectCartWithTrees("eventUser", tree);
Code code = generateCode();
code.setEvent(event);
code = _codeRepository.save(code);
cart.setEvent(event);
cart.setCode(code);
cart.setCartState(CartState.GENERATED);
_cartRepository.save(cart);
code.setCart(cart);
_codeRepository.save(code);
return code.getCode();
}
private Code generateCode() {
Code code = new Code();
// save code or try generate a new one
boolean codeSaved = false;
while (!codeSaved) {
final String codeString = CodeHelper.generateCodeString();
if (null == _codeRepository.findByCode(codeString)) {
code.setCode(codeString);
codeSaved = true;
return _codeRepository.save(code);
}
}
return null;
}
}