package org.aegee.runanddine.status;

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 RunAndDineStatusManagerTest extends AbstractDbEnabledTest
{
	/**
	 * Test of getInstance()
	 * 
	 * @throws Exception
	 */
	@Test
	public void testGetInstance() throws Exception
	{
		RunAndDineStatusManager sm1 = RunAndDineStatusManager.getInstance();
		RunAndDineStatusManager sm2 = RunAndDineStatusManager.getInstance();
		assertNotNull(sm1);
		assertTrue(sm1 == sm2);
	}

	/**
	 * Test of getById() with id for existing entry
	 */
	@Test
	public void testGetByIdExisting() throws ModelNotExistingException
	{
		RunAndDineStatusManager sm = RunAndDineStatusManager.getInstance();
		RunAndDineStatus rds = new RunAndDineStatus();
		sm.save(rds);
		sm.getById(rds.getId());
		sm.delete(rds);
	}

	/**
	 * Test getById() with id for existing entry
	 */
	@Test(expected = ModelNotExistingException.class)
	public void testGetByIdNotExisting() throws ModelNotExistingException
	{
		int id = 1;
		RunAndDineStatusManager sm = RunAndDineStatusManager.getInstance();
		RunAndDineStatus rds = sm.getById(id);
	}

	/**
	 * Test getAll with existing models
	 */
	@Test
	public void testGetAllExisting()
	{
		RunAndDineStatusManager sm = RunAndDineStatusManager.getInstance();
		RunAndDineStatus rds = new RunAndDineStatus();
		sm.save(rds);
		List<RunAndDineStatus> rdl = sm.getAll();
		assertNotNull(rdl);
		assertTrue(!rdl.isEmpty());
		sm.delete(rds);
	}

	/**
	 * Test getAll with no existing models
	 */
	@Test
	public void testGetAllNoneExisting()
	{
		RunAndDineStatusManager sm = RunAndDineStatusManager.getInstance();
		List<RunAndDineStatus> rds = sm.getAll();
		assertNotNull(rds);
		assertTrue(rds.isEmpty());
	}

	/**
	 * Test save() creating entry
	 */
	@Test
	public void testSaveCreate()
	{
		RunAndDineStatusManager sm = RunAndDineStatusManager.getInstance();
		RunAndDineStatus rds = new RunAndDineStatus();
		sm.save(rds);
		assertTrue(rds.getId() != 0);
		sm.delete(rds);
	}

	/**
	 * Test save() updating entry
	 */
	@Test
	public void testSaveUpdate() throws ModelNotExistingException
	{
		RunAndDineStatusManager sm = RunAndDineStatusManager.getInstance();
		RunAndDineStatus rds = new RunAndDineStatus();
		rds.setRunAndDineId(1);
		sm.save(rds);
		rds.setRunAndDineId(2);
		sm.save(rds);
		assertEquals(sm.getById(rds.getId()).getRunAndDineId(), 2);
		sm.delete(rds);
	}

	/**
	 * Test delete()
	 */
	@Test(expected = ModelNotExistingException.class)
	public void testDelete() throws ModelNotExistingException
	{
		RunAndDineStatusManager sm = RunAndDineStatusManager.getInstance();
		RunAndDineStatus rds = new RunAndDineStatus();
		sm.save(rds);
		int id = rds.getId();
		sm.delete(rds);
		sm.getById(id);
	}

	/**
	 * Test newObject()
	 */
	@Test
	public void testNewObject() throws Exception
	{
		RunAndDineStatusManager sm = RunAndDineStatusManager.getInstance();
		assertNotNull(sm.newObject());
	}
}