/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/providers/trunk/jldap/src/test/edu/amc/sakai/user/EmailAddressDerivingLdapAttributeMapperTest.java $
* $Id: EmailAddressDerivingLdapAttributeMapperTest.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package edu.amc.sakai.user;
import org.jmock.Mock;
import org.jmock.cglib.MockObjectTestCase;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPEntry;
public class EmailAddressDerivingLdapAttributeMapperTest extends MockObjectTestCase {
private EmailAddressDerivingLdapAttributeMapper attribMapper;
protected void setUp() throws Exception {
attribMapper = new EmailAddressDerivingLdapAttributeMapper();
super.setUp();
}
public void testValidatesEmailAddressesAgainstInjectedPattern() {
attribMapper.setAddressPattern("(.*?@domain1.com$)|(.*?@domain2.com$)");
assertTrue(attribMapper.validateAddress("acctId@domain1.com"));
assertTrue(attribMapper.validateAddress("acctId@domain2.com"));
assertFalse(attribMapper.validateAddress("acctId@domain3.com"));
assertFalse(attribMapper.validateAddress("acctId@domain1"));
assertTrue(attribMapper.validateAddress("@domain1.com"));
}
public void testValidatesAnyEmailAddressIfNoPatternInjected() {
attribMapper.setAddressPattern(null);
assertTrue(attribMapper.validateAddress("acctId@domain1.com"));
assertTrue(attribMapper.validateAddress("acctId@domain2.com"));
assertTrue(attribMapper.validateAddress("acctId@domain3.com"));
assertTrue(attribMapper.validateAddress("acctId@domain1"));
assertTrue(attribMapper.validateAddress("@domain1.com"));
}
public void testStripsDelimAndDomainToUnpackEid() {
assertEquals("acctId", attribMapper.doUnpackEidFromAddress("acctId@domain1.com"));
assertEquals("acctId", attribMapper.doUnpackEidFromAddress("acctId@domain2.com"));
assertEquals("acctId", attribMapper.doUnpackEidFromAddress("acctId@domain1"));
assertEquals("acctId", attribMapper.doUnpackEidFromAddress("acctId@domain1."));
assertEquals("acctId", attribMapper.doUnpackEidFromAddress("acctId@"));
assertEquals("acctId", attribMapper.doUnpackEidFromAddress("acctId"));
}
public void testUnpackEidFromAddressDispatch() {
final Mock mockValidateAddress = mock(VarargsMethod.class);
final VarargsMethod doValidateAddress = (VarargsMethod)mockValidateAddress.proxy();
final Mock mockDoUnpackEid = mock(VarargsMethod.class);
final VarargsMethod doDoUnpackEid = (VarargsMethod) mockDoUnpackEid.proxy();
attribMapper = new EmailAddressDerivingLdapAttributeMapper() {
@Override
protected boolean validateAddress(String addr) {
return (Boolean)doValidateAddress.call(addr);
}
@Override
protected String doUnpackEidFromAddress(String addr) {
return (String)doDoUnpackEid.call(addr);
}
};
final String eid = "acctId";
final String email = eid + "@domain1.com";
mockValidateAddress.expects(once()).method("call").
with(eq(new Object[] {email})).will(returnValue(true));
mockDoUnpackEid.expects(once()).method("call").
with(eq(new Object[] {email})).after(mockValidateAddress, "call").
will(returnValue(eid));
assertEquals(eid, attribMapper.unpackEidFromAddress(email));
mockValidateAddress.verify();
mockDoUnpackEid.verify();
}
public void testRaisesExceptionIfEmailAddressDoesNotValidate() {
attribMapper = new EmailAddressDerivingLdapAttributeMapper() {
@Override
protected boolean validateAddress(String addr) {
return false;
}
};
try {
attribMapper.unpackEidFromAddress("acctId@domain1.com");
fail("Should have raised an InvalidEmailAddressException");
} catch ( InvalidEmailAddressException e ) {
// success
}
}
public void testRaisesExceptionIfEidExtractionReturnsNull() {
attribMapper = new EmailAddressDerivingLdapAttributeMapper() {
@Override
protected boolean validateAddress(String addr) {
return true;
}
@Override
protected String doUnpackEidFromAddress(String addr) {
return null;
}
};
try {
attribMapper.unpackEidFromAddress("acctId@domain1.com");
fail("Should have raised an InvalidEmailAddressException");
} catch ( InvalidEmailAddressException e ) {
// success
}
}
public void testRaisesExceptionIfEidExtractionReturnsEmptyString() {
attribMapper = new EmailAddressDerivingLdapAttributeMapper() {
@Override
protected boolean validateAddress(String addr) {
return true;
}
@Override
protected String doUnpackEidFromAddress(String addr) {
return "";
}
};
try {
attribMapper.unpackEidFromAddress("acctId@domain1.com");
fail("Should have raised an InvalidEmailAddressException");
} catch ( InvalidEmailAddressException e ) {
// success
}
}
public void testAssignsDerivedEmailAddressToUserData() {
Mock mockEntry = mock(LDAPEntry.class);
LDAPEntry entry = (LDAPEntry) mockEntry.proxy();
attribMapper = new EmailAddressDerivingLdapAttributeMapper() {
@Override
protected void setUserDataDn(LDAPEntry entry, LdapUserData targetUserData) {
// nothing to do
}
@Override
protected String mapLdapEntryToSakaiUserType(LDAPEntry ldapEntry) {
return null;
}
};
attribMapper.setDefaultAddressDomain("domain1.com");
mockEntry.expects(once()).method("getAttributeSet").
will(returnValue(new LDAPAttributeSet())); // simplifies anon overrides above
final String eid = "acctId";
LdapUserData userData = new LdapUserData();
userData.setEid(eid);
userData.setEmail(null); // just to be sure
try {
attribMapper.mapLdapEntryOntoUserData(entry, userData); // the code exercise
} catch ( Throwable t ) {
t.printStackTrace();
}
// deriveEmailFromEid() behavior validated below
assertEquals(userData.getEmail(), attribMapper.deriveAddressFromEid(eid));
mockEntry.verify();
}
public void testSkipsEmailAddressDerivationIfUserDataHasEmail() {
Mock mockEntry = mock(LDAPEntry.class);
LDAPEntry entry = (LDAPEntry) mockEntry.proxy();
attribMapper = new EmailAddressDerivingLdapAttributeMapper() {
@Override
protected void setUserDataDn(LDAPEntry entry, LdapUserData targetUserData) {
// nothing to do
}
@Override
protected String mapLdapEntryToSakaiUserType(LDAPEntry ldapEntry) {
return null;
}
};
attribMapper.setDefaultAddressDomain("domain1.com");
mockEntry.expects(once()).method("getAttributeSet").
will(returnValue(new LDAPAttributeSet())); // simplifies anon overrides above
final String eid = "acctId";
LdapUserData userData = new LdapUserData();
userData.setEid(eid);
// deliberately ensure that the default domain has nothing to do with "skipping"
// email address derivation
final String existingEmail = eid + "@" + attribMapper.getDefaultAddressDomain() + "X";
userData.setEmail(existingEmail);
attribMapper.mapLdapEntryOntoUserData(entry, userData); // the code exercise
// deriveEmailFromEid() behavior validated below
assertEquals(existingEmail, userData.getEmail());
mockEntry.verify();
}
public void testSkipsEmailAddressDerivationIfNoDefaultDomainConfigured() {
Mock mockEntry = mock(LDAPEntry.class);
LDAPEntry entry = (LDAPEntry) mockEntry.proxy();
attribMapper = new EmailAddressDerivingLdapAttributeMapper() {
@Override
protected void setUserDataDn(LDAPEntry entry, LdapUserData targetUserData) {
// nothing to do
}
@Override
protected String mapLdapEntryToSakaiUserType(LDAPEntry ldapEntry) {
return null;
}
};
attribMapper.setDefaultAddressDomain(null);
assertNull(attribMapper.getDefaultAddressDomain()); // paranoia
mockEntry.expects(once()).method("getAttributeSet").
will(returnValue(new LDAPAttributeSet())); // simplifies anon overrides above
final String eid = "acctId";
LdapUserData userData = new LdapUserData();
userData.setEid(eid);
userData.setEmail(null); // just to be sure
attribMapper.mapLdapEntryOntoUserData(entry, userData); // the code exercise
// deriveEmailFromEid() behavior validated below
assertNull(userData.getEmail());
mockEntry.verify();
}
public void testDerivesEmailAddressFromUserDataEid() {
attribMapper.setDefaultAddressDomain("domain1.com");
assertEquals("acctId@domain1.com", attribMapper.deriveAddressFromEid("acctId"));
}
public void testDerivesNullEmailAddressFromNullEid() {
attribMapper.setDefaultAddressDomain("domain1.com");
assertEquals(null, attribMapper.deriveAddressFromEid(null));
}
public void testDerivesEmptyEmailAddressFromWhitespaceEid() {
attribMapper.setDefaultAddressDomain("domain1.com");
assertEquals(null, attribMapper.deriveAddressFromEid(" "));
}
public void testDerivesEmptyEmailAddressFromEmptyEid() {
attribMapper.setDefaultAddressDomain("domain1.com");
assertEquals(null, attribMapper.deriveAddressFromEid(""));
}
}