package eu.dnetlib.enabling.database.objects;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.util.Arrays;
import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnit44Runner;
import org.springframework.orm.hibernate3.HibernateTemplate;

import eu.dnetlib.enabling.database.rmi.DatabaseException;


@RunWith(MockitoJUnit44Runner.class)
public class AbstractDAOTest {

	private static final String TABLE_NAME = "TEST";
	
	private static final List<Integer> RESULTS = Arrays.asList(1,2,3);

	private static final String PKEY = "primary_key";
	private static final Integer PVALUE = 1234;
	
	
	// Class under test
	private AbstractDAO<Integer> dao;
	
	@Mock
	private HibernateTemplate mockHibernateTemplate;
	
	@Before
	public void setUp() throws Exception {
		dao = new AbstractDAO<Integer>(TABLE_NAME, Integer.class) {};
		
		dao.setHibernateTemplate(mockHibernateTemplate);
		
		when(mockHibernateTemplate.find("from " + TABLE_NAME)).thenReturn(RESULTS);
		when(mockHibernateTemplate.get(Integer.class, PKEY)).thenReturn(PVALUE);
	}

	@Test
	public void testCount() {
		assertEquals(RESULTS.size(), dao.count());
	}

	@Test
	public void testGetAll() {
		List<Integer> list = dao.getAll();
		verify(mockHibernateTemplate).find("from " + TABLE_NAME);
		assertEquals(RESULTS.size(), list.size());
		assertEquals(RESULTS.get(0), list.get(0));
		assertEquals(RESULTS.get(1), list.get(1));
		assertEquals(RESULTS.get(2), list.get(2));
	}

	@Test
	public void testDeleteSerializable() throws DatabaseException {
		dao.delete(PKEY);
		verify(mockHibernateTemplate).delete(PVALUE);
	}

	@Test
	public void testDeleteT() throws DatabaseException {
		dao.delete(PVALUE);
		verify(mockHibernateTemplate).delete(PVALUE);
	}

	@Test
	public void testGetElement() {
		assertEquals(PVALUE, dao.getElement(PKEY));
	}

	@Test
	public void testInsert() throws DatabaseException {
		dao.insert(PVALUE);
		verify(mockHibernateTemplate).saveOrUpdate(PVALUE);
	}

}
