package hirondelle.fish.main.member;
import java.io.FileNotFoundException;
import javax.servlet.ServletException;
import junit.framework.*;
import hirondelle.web4j.security.SafeText;
import hirondelle.web4j.database.DAOException;
import hirondelle.web4j.database.DuplicateException;
import hirondelle.web4j.model.Id;
import hirondelle.web4j.model.ModelCtorException;
import hirondelle.fish.test.TESTAll;
import hirondelle.fish.test.doubles.FakeDAOBehavior;
import static hirondelle.fish.test.doubles.FakeDAOBehavior.DbOperation;
import static hirondelle.fish.test.doubles.FakeDAOBehavior.DbOperationResult;
public class TESTMemberDAO extends TestCase {
public static void main(String args[]) throws ServletException, FileNotFoundException {
TESTAll.setRootDirectory();
TESTAll.initControllerIfNeeded();
String[] testCaseName = { TESTMemberDAO.class.getName() };
junit.textui.TestRunner.main(testCaseName);
}
public TESTMemberDAO(String aName) {
super(aName);
}
public void testRealDAO() throws DAOException, ModelCtorException {
MemberDAO realDAO = new MemberDAO();
testForSuccess(realDAO);
}
public void testFakeDAO() throws DAOException, ModelCtorException {
MemberDAO fakeDAO = new MemberDAOFake();
testForSuccess(fakeDAO);
}
public void testFakeDAOFailure() throws DAOException, ModelCtorException {
FakeDAOBehavior.setBehavior(DbOperation.FetchForChange, DbOperationResult.ThrowDAOException);
FakeDAOBehavior.setBehavior(DbOperation.Add, DbOperationResult.ThrowDuplicateException);
FakeDAOBehavior.setBehavior(DbOperation.Change, DbOperationResult.ThrowDuplicateException);
FakeDAOBehavior.setBehavior(DbOperation.Delete, DbOperationResult.ThrowDAOException);
FakeDAOBehavior.setBehavior(DbOperation.List, DbOperationResult.ThrowDAOException);
MemberDAO fakeDAO = new MemberDAOFake();
testFakeForFailures(fakeDAO);
}
private void testForSuccess(MemberDAO aMemberDAO) throws DAOException, ModelCtorException {
Member memberOne = new Member(null, new SafeText("Bob Smithers"), Boolean.TRUE, Id.from("4") );
Id idOne = aMemberDAO.add(memberOne);
Member memberOneFetched = aMemberDAO.fetch(idOne);
assertNotNull(memberOneFetched);
assertTrue(memberOneFetched.equals(memberOne));
Member memberTwo = new Member(idOne, new SafeText("Bob Smitherspoon"), Boolean.TRUE, Id.from("4") );
aMemberDAO.change(memberTwo);
Member memberTwoFetched = aMemberDAO.fetch(idOne);
assertNotNull(memberTwoFetched);
assertTrue(! memberTwoFetched.equals(memberOne));
assertTrue(memberTwoFetched.equals(memberTwo));
aMemberDAO.delete(idOne);
memberTwoFetched = aMemberDAO.fetch(idOne);
assertNull(memberTwoFetched);
}
private void testFakeForFailures(MemberDAO aMemberDAO) throws ModelCtorException, DAOException {
Member memberOne = new Member(null, new SafeText("Bob Smithers"), Boolean.TRUE, Id.from("4") );
try {
Id id = aMemberDAO.add(memberOne);
fail("Should have failed.");
}
catch(DuplicateException ex){
}
Member memberTwo = new Member(Id.from("13"), new SafeText("Bob Smitherspoon"), Boolean.TRUE, Id.from("4") );
try {
aMemberDAO.change(memberTwo);
fail("Should have failed.");
}
catch(DuplicateException ex){
}
try {
aMemberDAO.delete(Id.from("13"));
fail("Should have failed");
}
catch(DAOException ex){
}
try {
aMemberDAO.list();
fail("Should have failed");
}
catch (DAOException ex){
}
try {
aMemberDAO.fetch(Id.from("13"));
fail("Should have failed");
}
catch (DAOException ex){
}
}
}