package org.aegee.runanddine.archive;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.List;

import org.aegee.runanddine.AbstractDbEnabledTest;
import org.aegee.runanddine.util.data.ModelNotExistingException;
import org.junit.Test;

public class ArchiveEntryManagerTest extends AbstractDbEnabledTest
{

	public ArchiveEntryManagerTest()
	{
	}

	/**
	 * Test of getInstance()
	 * 
	 * @throws Exception
	 */
	@Test
	public void testGetInstance() throws Exception
	{
		ArchiveEntryManager aem1 = ArchiveEntryManager.getInstance();
		ArchiveEntryManager aem2 = ArchiveEntryManager.getInstance();
		assertNotNull(aem1);
		assertTrue(aem1 == aem2);
	}

	/**
	 * Test of getById() with id for existing entry
	 */
	@Test
	public void testGetByIdExisting() throws Exception
	{
		ArchiveEntryManager aem = ArchiveEntryManager.getInstance();
		ArchiveEntry ae = new ArchiveEntry();
		aem.save(ae);
		aem.getById(ae.getId());
		aem.delete(ae);
	}

	/**
	 * Test getById() with id for existing entry
	 */
	@Test(expected = ModelNotExistingException.class)
	public void testGetByIdNotExisting() throws ModelNotExistingException
	{
		int id = 1;
		ArchiveEntryManager aem = ArchiveEntryManager.getInstance();
		ArchiveEntry ae = aem.getById(id);
	}

	/**
	 * Test getAll with existing models
	 */
	@Test
	public void testGetAllExisting()
	{
		ArchiveEntryManager aem = ArchiveEntryManager.getInstance();
		ArchiveEntry ae = new ArchiveEntry();
		aem.save(ae);
		List<ArchiveEntry> ael = aem.getAll();
		assertNotNull(ael);
		assertTrue(!ael.isEmpty());
		aem.delete(ae);
	}

	/**
	 * Test getAll with no existing models
	 */
	@Test
	public void testGetAllNoneExisting()
	{
		ArchiveEntryManager aem = ArchiveEntryManager.getInstance();
		List<ArchiveEntry> ael = aem.getAll();
		assertNotNull(ael);
		assertTrue(ael.isEmpty());
	}

	/**
	 * Test save() creating entry
	 */
	@Test
	public void testSaveCreate()
	{
		ArchiveEntryManager aem = ArchiveEntryManager.getInstance();
		ArchiveEntry ae = new ArchiveEntry();
		aem.save(ae);
		assertTrue(ae.getId() != 0);
		aem.delete(ae);
	}

	/**
	 * Test save() updating entry
	 */
	@Test
	public void testSaveUpdate() throws ModelNotExistingException
	{
		ArchiveEntryManager aem = ArchiveEntryManager.getInstance();
		ArchiveEntry ae = new ArchiveEntry();
		ae.setFirstname("foo");
		aem.save(ae);
		ae.setFirstname("bar");
		aem.save(ae);
		assertEquals(aem.getById(ae.getId()).getFirstname(), "bar");
		aem.delete(ae);
	}

	/**
	 * Test delete()
	 */
	@Test(expected = ModelNotExistingException.class)
	public void testDelete() throws ModelNotExistingException
	{
		ArchiveEntryManager aem = ArchiveEntryManager.getInstance();
		ArchiveEntry ae = new ArchiveEntry();
		aem.save(ae);
		int id = ae.getId();
		aem.delete(ae);
		aem.getById(id);
	}

	/**
	 * Test newObject()
	 */
	@Test
	public void testNewObject()
	{
		ArchiveEntryManager aem = ArchiveEntryManager.getInstance();
		assertNotNull(aem.newObject());
	}
}
