import junit.framework.TestCase;
import org.apache.struts.apps.mailreader.dao.Subscription;
import org.apache.struts.apps.mailreader.dao.User;
import org.apache.struts.apps.mailreader.dao.UserDatabase;
import org.apache.struts.apps.mailreader.dao.impl.memory.MemoryUserDatabase;

public class RetainTest extends TestCase {

    protected UserDatabase database;
    protected String testName = "test-database.xml";

    public void setUp() throws Exception {
        super.setUp();
        MemoryUserDatabase memoryUserDatabase = new MemoryUserDatabase();
        memoryUserDatabase.setPathname(testName);
        database = memoryUserDatabase;
    }

    public void testDatabaseClean() throws Exception {
        User user = database.findUser("user");
        assertNull("Expected user to be missing", user);
    }

    //  Add your test methods here.
    //  The setUp method will run between each test.

    public void testCreateUser() throws Exception {
        User user = database.createUser("user");
        assertNotNull(user);
    }

    public void testFindUser() throws Exception {
        User user1 = database.createUser("user");
        User user2 = database.findUser("user");
        assertSame("Expected users to match", user1, user2);
    }

    public void testCreateSubscription() throws Exception {
        Subscription sub = database.createUser("user").createSubscription("mail.yahoo.com");
        assertNotNull("Expected subscription to be created", sub);
    }

    public void testFindSubscription() throws Exception {
        Subscription sub1 = database.createUser("user").createSubscription("mail.yahoo.com");
        Subscription sub2 = database.findUser("user").findSubscription("mail.yahoo.com");
        assertSame("Expected Subscriptions to match", sub1, sub2);
    }

    public void testDatabsaeSave() throws Exception {

        User user = database.createUser("user");
        user.setPassword("pass");
        user.setFullName("John Q. User");
        user.setFromAddress("John.User@somewhere.com");

        Subscription sub1 = user.createSubscription("mail.hotmail.com");
        sub1.setUsername("user1234");
        sub1.setAutoConnect(false);
        sub1.setType("pop3");
        sub1.setPassword("bar");

        Subscription sub2 = user.createSubscription("mail.yahoo.com");
        sub2.setUsername("jquser");
        sub2.setAutoConnect(false);
        sub2.setType("imap");
        sub2.setPassword("foo");

        database.save();

    }

    // Extra credit

    public void testFinderUserBogus() throws Exception {
        User user1 = database.findUser("bogus");
        assertNull("Expected bogus user to be not found", user1);
        User user2 = database.createUser("user");
        assertNotNull("Expected user to be created", user2);
        user1 = database.findUser("bogus");
        assertNull("Expected bogus user to be not found", user1);
        user1 = database.findUser("user");
        assertNotNull("Expected user to be found", user1);
    }

    public void testFindSubBogus() throws Exception {
        User user = database.createUser("user");
        Subscription sub = user.findSubscription("mail.bogus.com");
        assertNull(sub);
        sub = database.findUser("user").createSubscription("mail.hotmail.com");
        assertNotNull(sub);
        Subscription sub2 = user.findSubscription("mail.bogus.com");
        assertNull(sub2);
        Subscription sub3 = user.findSubscription("mail.hotmail.com");
        assertSame(sub, sub3);
    }

}