package com.upplication.thepunisher;
import com.upplication.config.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {JpaTestConfig.class, PunishmentRepository.class})
public class PunishmentRepositoryIT {
@Autowired
private PunishmentRepository punishmentRepository;
@PersistenceContext
private EntityManager entityManager;
@Test
public void create_punishment_with_title_hello_and_description_bye_then_return_object_punishment_with_title_hello_and_description_bye() {
final String title = "hello";
final String description = "bye";
Punishment punishment = punishmentRepository.create(title, description);
assertEquals(title, punishment.getTitle());
assertEquals(description, punishment.getDescription());
}
@Test
public void create_punishment_with_title_pepe_and_description_wold_then_return_object_punishment_with_title_pepe_and_description_world() {
final String title = "pepe";
final String description = "world";
Punishment punishment = punishmentRepository.create(title, description);
assertEquals(title, punishment.getTitle());
assertEquals(description, punishment.getDescription());
}
@Test
public void create_punishment_then_persist_in_bd() {
final String title = "ham";
final String description = "asdasd";
Punishment punishment = punishmentRepository.create(title, description);
Punishment punishmentBD = entityManager.find(Punishment.class, punishment.getId());
assertNotNull(punishmentBD);
assertEquals(punishmentBD.getId(), punishment.getId());
assertEquals(punishmentBD.getTitle(), punishment.getTitle());
assertEquals(punishmentBD.getDescription(), punishment.getDescription());
}
@Test
public void retrieve_list_of_punishments_ordered_by_title() {
final String letters = "ABCDE";
final String description = "A description";
for (int i = 0; i < letters.length(); i++) {
final String title = Character.toString(letters.charAt(i));
punishmentRepository.create(title, description);
}
List<Punishment> punishments = punishmentRepository.getAll();
for (int i = 0; i < punishments.size(); i++) {
final Punishment p = punishments.get(i);
assertEquals(Character.toString(letters.charAt(i)), p.getTitle());
}
}
@Test
public void retrieve_list_of_punishments_ordered_by_title_when_inserted_unordered() {
final String expected = "ABCDE";
final String letters = "CBEDA";
final String description = "A description";
for (int i = 0; i < letters.length(); i++) {
final String title = Character.toString(letters.charAt(i));
punishmentRepository.create(title, description);
}
List<Punishment> punishments = punishmentRepository.getAll();
for (int i = 0; i < punishments.size(); i++) {
final Punishment p = punishments.get(i);
assertEquals(Character.toString(expected.charAt(i)), p.getTitle());
}
}
@Test
public void i_can_not_add_a_punishment_with_empty_title() {
final String title = "";
final String description = "world";
Punishment punishment = punishmentRepository.create(title, description);
assertEquals(null, punishment);
}
@Test
public void i_can_not_add_a_punishment_with_empty_description() {
final String title = "hello";
final String description = "";
Punishment punishment = punishmentRepository.create(title, description);
assertEquals(null, punishment);
}
@Test
public void i_can_not_add_a_punishment_with_repeated_title() {
final String title = "hello";
final String description = "world";
Punishment punishment = punishmentRepository.create(title, description);
assertEquals(title, punishment.getTitle());
assertEquals(description, punishment.getDescription());
Punishment repeatedPunishment = punishmentRepository.create(title, description);
assertEquals(null, repeatedPunishment);
}
@Test
public void i_can_not_add_a_punishment_with_a_title_longer_than_100_characters() {
final StringBuilder title = new StringBuilder("");
final String description = "hello";
for (int i = 0; i <= 101; i++) {
title.append('a');
}
Punishment punishment = punishmentRepository.create(title.toString(), description);
assertEquals(null, punishment);
}
@Test
public void i_can_not_add_a_punishment_with_a_description_longer_than_100_characters() {
final StringBuilder description = new StringBuilder("");
final String title = "hello";
for (int i = 0; i <= 101; i++) {
description.append('a');
}
Punishment punishment = punishmentRepository.create(title, description.toString());
assertEquals(null, punishment);
}
@Test
public void edit_punishment_with_inexistent_id() {
final String title = "ham";
final String description = "asdasd";
Punishment punishment = punishmentRepository.create(title, description);
Punishment punishmentEdited = punishmentRepository.edit(0, title, description);
assertEquals(null, punishmentEdited);
}
@Test
public void edit_punishment_with_taken_title() {
final String title = "ham";
final String description = "asdasd";
final String title2 = "ham0";
final String description2 = "asdasdo";
Punishment punishment = punishmentRepository.create(title, description);
punishmentRepository.create(title2, description2);
Punishment punishmentEdited = punishmentRepository.edit(punishment.getId(), title2, description);
assertEquals(null, punishmentEdited);
}
@Test
public void edit_punishment() {
final String title = "ham";
final String description = "asdasd";
final String title2 = "ham0";
final String description2 = "asdasdo";
punishmentRepository.create(title, description);
Punishment secondPunishment = punishmentRepository.create(title2, description2);
Punishment punishmentEdited = punishmentRepository.edit(secondPunishment.getId(), title2, description);
assertEquals(secondPunishment.getId(), punishmentEdited.getId());
assertEquals(title2, punishmentEdited.getTitle());
assertEquals(description, punishmentEdited.getDescription());
}
@Test
public void remove_punishment_with_inexistent_id() {
final String title = "ham";
final String description = "asdasd";
punishmentRepository.create(title, description);
boolean removed = punishmentRepository.remove(0);
assertFalse(removed);
}
@Test
public void remove_punishment() {
final String title = "ham";
final String description = "asdasd";
Punishment punishment = punishmentRepository.create(title, description);
boolean removed = punishmentRepository.remove(punishment.getId());
assertTrue(removed);
}
}