/*
* Copyright (C) 2012 Miguel Angel Garcia<miguelangel.garcia@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.magmax.master.project.persistence.dao;
import java.util.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.junit.*;
import static org.junit.Assert.*;
import org.magmax.master.project.persistence.pojo.Invoice;
import org.magmax.master.project.persistence.pojo.Product;
import org.magmax.master.project.persistence.pojo.SoldProduct;
import org.magmax.master.project.persistence.pojo.User;
/**
*
* @author Miguel Angel Garcia<miguelangel.garcia@gmail.com>
*/
public class InvoiceDAOTest {
private InvoiceDAO sut;
private Invoice invoice;
private DAOFactory factory;
@Before
public void setUp() throws Exception {
factory = new DAOFactory("development");
invoice = new Invoice();
sut = factory.getInvoiceDAO();
}
private User createUser(String name) {
User user = new User();
user.setName(name);
UserDAO userdao = factory.getUserDAO();
userdao.storeAndRefresh(user);
return user;
}
@Test
public void testCreation() {
sut.store(invoice);
sut.refresh(invoice);
assertNotNull(invoice.getId());
}
@Test
public void testDateIsFilled() {
sut.storeAndRefresh(invoice);
assertNotNull(invoice.getDate());
}
@Test
public void testCanHaveASoldProduct() {
Product product = new Product();
product.setName("T-shirt");
SoldProduct soldproduct = new SoldProduct();
soldproduct.setProduct(product);
invoice.addProduct(soldproduct);
sut.storeAndRefresh(invoice);
Invoice current = sut.findById(invoice.getId());
assertEquals("Invoice must have a product", 1, current.getProducts().size());
assertEquals(product.getName(), current.getProducts().get(0).getProduct().getName());
}
@Test
public void testCanHaveAnUser() {
User user = createUser("Max Cavalera");
invoice.setUser(user);
sut.storeAndRefresh(invoice);
Invoice current = sut.findById(invoice.getId());
assertEquals(user.getName(), current.getUser().getName());
}
@Test
public void testGivenAnUserAndAListOfProductsBuildsTheInvoice() {
User user = createUser("Max Cavalera");
invoice.setUser(user);
Product product = new Product();
product.setName("product 1");
product.setPrize(200F);
factory.getProductDAO().storeAndRefresh(product);
ArrayList<Product> products = new ArrayList<Product>();
products.add(product);
Invoice invoice = sut.createInvoice(user, products);
assertNotNull(invoice);
assertNotNull(invoice.getId());
assertNotNull(invoice.getProducts());
assertEquals(1, invoice.getProducts().size());
assertEquals(1, sut.findAll().size());
}
@Test
public void testGivenAnUserAndAListOfProductsBuildsTheInvoice2() {
User user = createUser("Max Cavalera");
invoice.setUser(user);
Product product = new Product();
product.setName("product 1");
product.setPrize(200F);
factory.getProductDAO().storeAndRefresh(product);
Product product2 = new Product();
product2.setName("product 2");
product2.setPrize(200F);
factory.getProductDAO().storeAndRefresh(product2);
ArrayList<Product> products = new ArrayList<Product>();
products.add(product);
products.add(product2);
Invoice invoice = sut.createInvoice(user, products);
assertNotNull(invoice);
assertNotNull(invoice.getId());
assertNotNull(invoice.getProducts());
assertEquals(2, invoice.getProducts().size());
assertEquals(1, sut.findAll().size());
}
@Test
public void testGivenAnUserAndAListOfProductsBuildsTheInvoice3() {
User user = createUser("Max Cavalera");
invoice.setUser(user);
Product product = new Product();
product.setName("product 1");
product.setPrize(200F);
factory.getProductDAO().storeAndRefresh(product);
ArrayList<Product> products = new ArrayList<Product>();
products.add(product);
products.add(product);
invoice = sut.createInvoice(user, products);
assertNotNull(invoice);
assertNotNull(invoice.getId());
assertNotNull(invoice.getProducts());
assertEquals(1, invoice.getProducts().size());
assertEquals(2, invoice.getProducts().get(0).getUnits().intValue());
assertEquals(1, sut.findAll().size());
}
@Test
public void testFindByDates() {
sut.storeAndRefresh(invoice);
List<Invoice> current = sut.findByDates(getDate(1999, 1, 1), getDate(2150, 1, 1));
assertEquals(1, current.size());
assertEquals(invoice.getId(), current.get(0).getId());
}
@Test
public void testFindByDatesLowPeriod() {
sut.storeAndRefresh(invoice);
List<Invoice> current = sut.findByDates(getDate(1999, 1, 1), getDate(2000, 1, 1));
assertEquals(0, current.size());
}
@Test
public void testFindByDatesHighPeriod() {
sut.storeAndRefresh(invoice);
List<Invoice> current = sut.findByDates(getDate(2150, 1, 1), getDate(2151, 1, 1));
assertEquals(0, current.size());
}
private Date getDate(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DATE, day);
return cal.getTime();
}
}