package org.aegee.runanddine.advertisement;

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 MailingListManagerTest extends AbstractDbEnabledTest
{
	public MailingListManagerTest()
	{
	}

	/**
	 * Test of getInstance()
	 * 
	 * @throws Exception
	 */
	@Test
	public void testGetInstance() throws Exception
	{
		MailingListManager mlm1 = MailingListManager.getInstance();
		MailingListManager mlm2 = MailingListManager.getInstance();
		assertNotNull(mlm1);
		assertTrue(mlm1 == mlm2);
	}

	/**
	 * Test of getById() with id for existing entry
	 */
	@Test
	public void testGetByIdExisting() throws Exception
	{
		MailingListManager mlm = MailingListManager.getInstance();
		MailingList ml = new MailingList();
		ml.setName("AEGEE"); // has to be set
		mlm.save(ml);
		mlm.getById(ml.getId());
		mlm.delete(ml);
	}

	/**
	 * Test getById() with id for existing entry
	 */
	@Test(expected = ModelNotExistingException.class)
	public void testGetByIdNotExisting() throws ModelNotExistingException
	{
		int id = 1;
		MailingListManager mlm = MailingListManager.getInstance();
		MailingList ml = mlm.getById(id);
	}

	/**
	 * Test getByValidationName with name for existing entry
	 */
	@Test
	public void testGetByNameExisting() throws ModelNotExistingException
	{
		MailingListManager mlm = MailingListManager.getInstance();
		MailingList ml = new MailingList();
		ml.setName("AEGEE"); // has to be set
		mlm.save(ml);
		mlm.getByName("AEGEE");
		mlm.delete(ml);
	}

	/**
	 * Test getByName with name for not existing entry
	 */
	@Test(expected = ModelNotExistingException.class)
	public void testGetByNameNotExisting() throws ModelNotExistingException
	{
		String name = "foo";
		MailingListManager mlm = MailingListManager.getInstance();
		mlm.getByName(name);
	}

	/**
	 * Test getAll with existing models
	 */
	@Test
	public void testGetAllExisting()
	{
		MailingListManager mlm = MailingListManager.getInstance();
		MailingList ml = new MailingList();
		ml.setName("AEGEE"); // has to be set
		mlm.save(ml);
		List<MailingList> mll = mlm.getAll();
		assertNotNull(mll);
		assertTrue(!mll.isEmpty());
		mlm.delete(ml);
	}

	/**
	 * Test getAll with no existing models
	 */
	@Test
	public void testGetAllNoneExisting()
	{
		MailingListManager mlm = MailingListManager.getInstance();
		List<MailingList> mll = mlm.getAll();
		assertNotNull(mll);
		assertTrue(mll.isEmpty());
	}

	/**
	 * Test save() creating entry
	 */
	@Test
	public void testSaveCreate()
	{
		MailingListManager mlm = MailingListManager.getInstance();
		MailingList ml = new MailingList();
		ml.setName("AEGEE"); // has to be set
		mlm.save(ml);
		assertTrue(ml.getId() != 0);
		mlm.delete(ml);
	}

	/**
	 * Test save() updating entry
	 */
	@Test
	public void testSaveUpdate() throws ModelNotExistingException
	{
		MailingListManager mlm = MailingListManager.getInstance();
		MailingList ml = new MailingList();
		ml.setName("AEGEE"); // has to be set
		ml.setAddress("mail@aegee.de");
		mlm.save(ml);
		ml.setAddress("spam@aegee.de");
		mlm.save(ml);
		assertEquals(mlm.getById(ml.getId()).getAddress(), "spam@aegee.de");
		mlm.delete(ml);
	}

	/**
	 * Test delete()
	 */
	@Test(expected = ModelNotExistingException.class)
	public void testDelete() throws ModelNotExistingException
	{
		MailingListManager mlm = MailingListManager.getInstance();
		MailingList ml = new MailingList();
		mlm.save(ml);
		int id = ml.getId();
		mlm.delete(ml);
		mlm.getById(id);
	}

	/**
	 * Test newObject()
	 */
	@Test
	public void testNewObject()
	{
		MailingListManager mlm = MailingListManager.getInstance();
		assertNotNull(mlm.newObject());
	}
}
