When we create Entity and Respority, we also need to do validations to protect our data.
In Java, validations are built-in, using decorators. For Typescript, found a useful libaray to do the similar validation as well. Checkout class-validator
Entity:
@Entity
public class Book {
// ======================================
// = Attributes =
// ======================================
@Id
@GeneratedValue
private Long id;
@Column(length = 200)
@NotNull
@Size(min = 1, max = 200)
private String title;
@Column(length = 10000)
@Size(min = 1, max = 10000)
private String description;
@Column(name = "unit_cost")
@Min(1)
private Float unitCost;
@Column(length = 50)
@NotNull
@Size(min = 1, max = 50)
private String isbn;
@Column(name = "publication_date")
@Temporal(TemporalType.DATE)
@Past
private Date publicationDate;
....
}
Testing:
We want to test, if we give title as null, it should throw exception.
@RunWith(Arquillian.class)
public class BookRepositoryTest {
@Inject
private BookRepository bookRepository;
// We want the test throw exception
@Test(expected = Exception.class)
public void createInvalidBook() {
Book book = new Book("isbn", null, 12F, 123, Language.ENGLISH, new Date(), "imageURL", "description");
bookRepository.create(book);
}
@Deployment
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class)
.addClass(BookRepository.class)
.addClass(Book.class)
.addClass(Language.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml")
.addAsManifestResource("META-INF/test-persistence.xml", "persistence.xml");
}
@org.junit.Test
public void create() {
}
}
@Transactional(SUPPORTS)
public class BookRepository {
// ======================================
// = Injection Points =
// ======================================
@PersistenceContext(unitName = "bookStorePU")
private EntityManager em;
// ======================================
// = Business methods =
// ======================================
public Book find(@NotNull Long id) {
return em.find(Book.class, id);
}
// For creating and deleting methods, we want to use REQUIRED
@Transactional(REQUIRED)
public Book create(@NotNull Book book) {
em.persist(book);
return book;
}
}
@Test(expected = Exception.class)
public void findWithInvalidId() {
bookRepository.find(null);
}