package org.aegee.runanddine.feedback;

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 FeedbackManagerTest extends AbstractDbEnabledTest
{
	/**
	 * Test of getInstance()
	 * 
	 * @throws Exception
	 */
	@Test
	public void testGetInstance() throws Exception
	{
		FeedbackManager fbm1 = FeedbackManager.getInstance();
		FeedbackManager fbm2 = FeedbackManager.getInstance();
		assertNotNull(fbm1);
		assertTrue(fbm1 == fbm2);
	}

	/**
	 * Test of getById() with id for existing entry
	 */
	@Test
	public void testGetByIdExisting() throws Exception
	{
		FeedbackManager fbm = FeedbackManager.getInstance();
		Feedback fb = new Feedback();
		fbm.save(fb);
		fbm.getById(fb.getId());
		fbm.delete(fb);
	}

	/**
	 * Test getById() with id for existing entry
	 */
	@Test(expected = ModelNotExistingException.class)
	public void testGetByIdNotExisting() throws ModelNotExistingException
	{
		int id = 1;
		FeedbackManager fbm = FeedbackManager.getInstance();
		Feedback fb = fbm.getById(id);
	}

	/**
	 * Test getAll with existing models
	 */
	@Test
	public void testGetAllExisting()
	{
		FeedbackManager fbm = FeedbackManager.getInstance();
		Feedback fb = new Feedback();
		fbm.save(fb);
		List<Feedback> fbl = fbm.getAll();
		assertNotNull(fbl);
		assertTrue(!fbl.isEmpty());
		fbm.delete(fb);
	}

	/**
	 * Test getAll with no existing models
	 */
	@Test
	public void testGetAllNoneExisting()
	{
		FeedbackManager fbm = FeedbackManager.getInstance();
		List<Feedback> fbl = fbm.getAll();
		assertNotNull(fbl);
		assertTrue(fbl.isEmpty());
	}

	/**
	 * Test getAllByRunAndDineId() with existing models
	 */
	@Test
	public void testGetAllByRunAndDineIdExisting()
	{
		int runAndDineId = 1;
		FeedbackManager fbm = FeedbackManager.getInstance();
		Feedback fb = new Feedback();
		fb.setRunAndDineId(runAndDineId);
		fbm.save(fb);
		List<Feedback> srl = fbm.getAllByRunAndDineId(runAndDineId);
		assertNotNull(srl);
		assertTrue(!srl.isEmpty());
		fbm.delete(fb);
	}

	/**
	 * Test getAllByRunAndDineId() with no existing models
	 */
	@Test
	public void testGetAllByRunAndDineIdNoneExisting()
	{
		int runAndDineId = 1;
		FeedbackManager fbm = FeedbackManager.getInstance();
		List<Feedback> fbl = fbm.getAllByRunAndDineId(runAndDineId);
		assertNotNull(fbl);
		assertTrue(fbl.isEmpty());
	}

	/**
	 * Test save() creating entry
	 */
	@Test
	public void testSaveCreate()
	{
		FeedbackManager fbm = FeedbackManager.getInstance();
		Feedback fb = new Feedback();
		fbm.save(fb);
		assertTrue(fb.getId() != 0);
		fbm.delete(fb);
	}

	/**
	 * Test save() updating entry
	 */
	@Test
	public void testSaveUpdate() throws ModelNotExistingException
	{
		FeedbackManager fbm = FeedbackManager.getInstance();
		Feedback fb = new Feedback();
		fb.setRunAndDineId(1);
		fbm.save(fb);
		fb.setRunAndDineId(2);
		fbm.save(fb);
		assertEquals(fbm.getById(fb.getId()).getRunAndDineId(), 2);
		fbm.delete(fb);
	}

	/**
	 * Test delete()
	 */
	@Test(expected = ModelNotExistingException.class)
	public void testDelete() throws ModelNotExistingException
	{
		FeedbackManager fbm = FeedbackManager.getInstance();
		Feedback fb = new Feedback();
		fbm.save(fb);
		int id = fb.getId();
		fbm.delete(fb);
		fbm.getById(id);
	}

	/**
	 * Test newObject()
	 */
	@Test
	public void testNewObject()
	{
		FeedbackManager fbm = FeedbackManager.getInstance();
		assertNotNull(fbm.newObject());
	}
}
