Why does ChangePasswordTest expect outcome==null?
robjellinghaus Jan 21, 2006 2:32 AMI have a copy of the noejb example that I am modifying. I've modified it only to change package names. But my ChangePasswordTest is failing.
ChangePasswordTest has this code. The failure is on the "assert outcome==null;" line.
new Script() { ChangePasswordAction changePassword; @Override protected void applyRequestValues() throws Exception { Contexts.getSessionContext().set("loggedIn", true); Contexts.getSessionContext().set("user", new User("Gavin King", "foobar", "gavin")); } @Override protected void updateModelValues() throws Exception { User user = (User) Component.getInstance("user", true); user.setPassword("xxx"); changePassword = (ChangePasswordAction) Component.getInstance("changePassword", true); changePassword.setVerify("xxx"); } @Override protected void invokeApplication() { String outcome = changePassword.changePassword(); log.info("Outcome is " + outcome); assert outcome==null; // fails } @Override protected void renderResponse() { User user = (User) Component.getInstance("user", false); assert user.getName().equals("Gavin King"); assert user.getUsername().equals("gavin"); assert user.getPassword().equals("xxx"); assert !Manager.instance().isLongRunningConversation(); assert Contexts.getSessionContext().get("loggedIn").equals(true); } }.run();
My question is, why is outcome expected to be null there? It looks to me like the test goes to pains to set up a User object whose password *does* match the value of "verify". And ChangePasswordAction is:
@Name("changePassword") @LoggedIn public class ChangePasswordAction { private static final Logger log = Logger.getLogger(ChangePasswordAction.class); @In @Out @Valid private User user; @In(create=true) private Session bookingDatabase; @In private FacesContext facesContext; private String verify; @IfInvalid(outcome=REDISPLAY) public String changePassword() { log.info("user is " + user + " with password " + user.getPassword()); if ( user.getPassword().equals(verify) ) { log.info("updating password to: " + verify); user = (User) bookingDatabase.merge(user); return "main"; } else { log.info("password not verified"); facesContext.addMessage(null, new FacesMessage("Re-enter new password")); bookingDatabase.refresh(user); verify=null; return null; } } public String cancel() { bookingDatabase.refresh(user); return "main"; } public String getVerify() { return verify; } public void setVerify(String verify) { this.verify = verify; } }
Looks to me like if user.getPassword().equals(verify), which it *does* in this test, then outcome is -- and SHOULD be -- "main", not null.
And that's what I see in my log:
INFO 20-01 23:17:48,562 (ChangePasswordAction.java:changePassword:38) -user is User(gavin) with password xxx INFO 20-01 23:17:52,281 (ChangePasswordAction.java:changePassword:41) -updating password to: xxx INFO 20-01 23:20:54,187 (ChangePasswordTest.java:invokeApplication:51) -Outcome is main java.lang.AssertionError at com.robjsoftware.replog.test.ChangePasswordTest$1.invokeApplication(ChangePasswordTest.java:52)
The action looks right to me. It's the *test* that looks wrong!
What simple detail am I missing?
Thanks,
Rob