package org.dicadeveloper.weplantaforest.code;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.List;
import javax.transaction.Transactional;
import org.dicadeveloper.weplantaforest.common.testSupport.CleanDbRule;
import org.dicadeveloper.weplantaforest.event.Event;
import org.dicadeveloper.weplantaforest.event.EventRepository;
import org.dicadeveloper.weplantaforest.gift.Gift;
import org.dicadeveloper.weplantaforest.gift.GiftRepository;
import org.dicadeveloper.weplantaforest.testsupport.DbInjecter;
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;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest({ "spring.profiles.active=test" })
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class CodeGeneratorTest {
@Rule
@Autowired
public CleanDbRule _cleanDbRule;
@Autowired
public DbInjecter _dbInjecter;
@Autowired
private GiftRepository _giftRepository;
@Autowired
private EventRepository _eventRepository;
@Autowired
private CodeGenerator _codegenerator;
@Test
public void generateCodeForGift() {
Gift gift = new Gift();
gift = _giftRepository.save(gift);
Code code = _codegenerator.generate(gift);
gift.setCode(code);
_giftRepository.save(gift);
Gift savedGiftWithCode = _giftRepository.findOne(1L);
assertThat(_giftRepository.count()).isEqualTo(1);
assertThat(savedGiftWithCode.getCode()).isNotNull();
assertThat(savedGiftWithCode.getCode()
.getCode()).isNotNull();
assertThat(_codegenerator.isValid(savedGiftWithCode.getCode()
.getCode())).isTrue();
}
@Test
public void generateCodeForGiftWithNumber() {
Gift gift = new Gift();
gift = _giftRepository.save(gift);
Code code = _codegenerator.generate(gift, 2016, 1, 4);
gift.setCode(code);
_giftRepository.save(gift);
Gift savedGiftWithCode = _giftRepository.findOne(1L);
assertThat(_giftRepository.count()).isEqualTo(1);
assertThat(savedGiftWithCode.getCode()).isNotNull();
assertThat(savedGiftWithCode.getCode()
.getCode()).isNotNull();
assertThat(_codegenerator.isValid(savedGiftWithCode.getCode()
.getCode())).isTrue();
}
@Test
@Transactional
public void generateCodeForEvent() {
Event event = new Event();
Code code = _codegenerator.generate(event, 2016, 1, 1);
List<Code> codes = new ArrayList<>();
codes.add(code);
event.setCodes(codes);
_eventRepository.save(event);
Event savedEventWithCode = _eventRepository.findOne(1L);
assertThat(_eventRepository.count()).isEqualTo(1);
assertThat(savedEventWithCode.getCodes()
.size()).isEqualTo(1);
assertThat(savedEventWithCode.getCodes()
.get(0)).isNotNull();
assertThat(savedEventWithCode.getCodes()
.get(0)
.getCode()).isNotNull();
assertThat(_codegenerator.isValid(savedEventWithCode.getCodes()
.get(0)
.getCode())).isTrue();
}
@Test
@Transactional
public void generateCodesForEventWithTreeCount() {
int codeCount = 100;
Event event = new Event();
event = _eventRepository.save(event);
List<Code> codes = _codegenerator.generate(event, codeCount, 2);
event.setCodes(codes);
_eventRepository.save(event);
Event savedEventWithCode = _eventRepository.findOne(1L);
assertThat(_eventRepository.count()).isEqualTo(1);
assertThat(savedEventWithCode.getCodes()
.size()).isEqualTo(codeCount);
for (int i = 0; i < codeCount; i++) {
assertThat(savedEventWithCode.getCodes()
.get(i)).isNotNull();
assertThat(savedEventWithCode.getCodes()
.get(i)
.getCode()).isNotNull();
assertThat(_codegenerator.isValid(savedEventWithCode.getCodes()
.get(i)
.getCode())).isTrue();
}
}
@Test
@Transactional
public void generateCodesForEventHasAlreadyCreatedCodesWithTreeCount() {
int codeCount = 100;
int codeCount2 = 10;
Event event = new Event();
event = _eventRepository.save(event);
List<Code> codes = _codegenerator.generate(event, codeCount, 2);
event.setCodes(codes);
_eventRepository.save(event);
codes = _codegenerator.generate(event, codeCount2, 2);
event.getCodes()
.addAll(codes);
_eventRepository.save(event);
Event savedEventWithCode = _eventRepository.findOne(1L);
assertThat(_eventRepository.count()).isEqualTo(1);
assertThat(savedEventWithCode.getCodes()
.size()).isEqualTo(codeCount + codeCount2);
for (int i = 0; i < codeCount + codeCount2; i++) {
assertThat(savedEventWithCode.getCodes()
.get(i)).isNotNull();
assertThat(savedEventWithCode.getCodes()
.get(i)
.getCode()).isNotNull();
assertThat(_codegenerator.isValid(savedEventWithCode.getCodes()
.get(i)
.getCode())).isTrue();
}
}
@Test
@Transactional
public void generateCodesForEventWithAmount() {
int codeCount = 100;
Event event = new Event();
event = _eventRepository.save(event);
List<Code> codes = _codegenerator.generate(event, codeCount, 2.0f);
event.setCodes(codes);
_eventRepository.save(event);
Event savedEventWithCode = _eventRepository.findOne(1L);
assertThat(_eventRepository.count()).isEqualTo(1);
assertThat(savedEventWithCode.getCodes()
.size()).isEqualTo(codeCount);
for (int i = 0; i < codeCount; i++) {
assertThat(savedEventWithCode.getCodes()
.get(i)).isNotNull();
assertThat(savedEventWithCode.getCodes()
.get(i)
.getCode()).isNotNull();
assertThat(_codegenerator.isValid(savedEventWithCode.getCodes()
.get(i)
.getCode())).isTrue();
}
}
@Test
@Transactional
public void generateCodesForEventHasAlreadyCreatedCodesWithAmount() {
int codeCount = 100;
int codeCount2 = 10;
Event event = new Event();
event = _eventRepository.save(event);
List<Code> codes = _codegenerator.generate(event, codeCount, 2.0f);
event.setCodes(codes);
_eventRepository.save(event);
codes = _codegenerator.generate(event, codeCount2, 2.0f);
event.getCodes()
.addAll(codes);
_eventRepository.save(event);
Event savedEventWithCode = _eventRepository.findOne(1L);
assertThat(_eventRepository.count()).isEqualTo(1);
assertThat(savedEventWithCode.getCodes()
.size()).isEqualTo(codeCount + codeCount2);
for (int i = 0; i < codeCount + codeCount2; i++) {
assertThat(savedEventWithCode.getCodes()
.get(i)).isNotNull();
assertThat(savedEventWithCode.getCodes()
.get(i)
.getCode()).isNotNull();
assertThat(_codegenerator.isValid(savedEventWithCode.getCodes()
.get(i)
.getCode())).isTrue();
}
}
@Test
public void testInValidCodeNoPatterMatch() {
String codeString = "a-b-c";
assertThat(_codegenerator.isValid(codeString)).isFalse();
}
@Test
public void testInValidCodeCausOfCheckSum() {
String codeString = "ABCD-47BD-A46B-A3BB";
assertThat(_codegenerator.isValid(codeString)).isFalse();
}
@Test
public void testInValidCodeNotInDb() {
String codeString = "GGCY-47BD-A46B-A3BB";
assertThat(_codegenerator.isValid(codeString)).isFalse();
}
}