/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.security.userstore.config;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.junit.Test;
import com.enonic.cms.framework.util.JDOMUtil;
import com.enonic.cms.api.plugin.ext.userstore.UserStoreConfig;
import com.enonic.cms.api.plugin.ext.userstore.UserStoreConfigField;
import com.enonic.cms.api.plugin.ext.userstore.UserFieldType;
import static org.junit.Assert.*;
public class UserStoreConfigParserTest
{
@Test
public void testParseNull()
throws IOException, JDOMException
{
final Element configEl = null;
final UserStoreConfig config = UserStoreConfigParser.parse( configEl );
assertNotNull( config );
assertNotNull( config.getUserFieldConfigs() );
}
@Test
public void testParseIllegalRoot()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<fisk>" );
configXml.append( "</fisk>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( final Exception ex )
{
assertEquals( InvalidUserStoreConfigException.class.getName(), ex.getClass().getName() );
}
}
@Test
public void testParseMissingUserElement()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertEquals( InvalidUserStoreConfigException.class.getName(), ex.getClass().getName() );
}
}
@Test
public void testParseMissingUserFieldsElement()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user>" );
configXml.append( " </user>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertEquals( InvalidUserStoreConfigException.class.getName(), ex.getClass().getName() );
}
}
@Test
public void testParseIllegalCustomFieldName()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <fisk/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertEquals( InvalidUserStoreConfigException.class.getName(), ex.getClass().getName() );
}
}
@Test
public void testParseIllegalUserFieldAttributeValue_Required()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <prefix required=\"fisk\"/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertEquals( InvalidUserStoreConfigException.class.getName(), ex.getClass().getName() );
}
}
@Test
public void testParseIllegalUserFieldAttributeValue_ReadOnly()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <prefix readonly=\"fisk\"/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertEquals( InvalidUserStoreConfigException.class.getName(), ex.getClass().getName() );
}
}
@Test
public void testParseIllegalUserFieldAttributeValue_Remote()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <prefix remote=\"fisk\"/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertTrue( ex.getMessage().startsWith( "Illegal attribute value. 'remote' must be 'true' or 'false': fisk." ) );
}
}
@Test
public void testParseIllegalUserFieldAttributeValue_Iso()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <address iso=\"fisk\"/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertTrue( ex.getMessage().startsWith( "Illegal attribute value. 'iso' must be 'true' or 'false': fisk." ) );
}
}
@Test
public void testParseIllegalUserFieldAttribute_IsoForOtherThanAddress()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <prefix iso=\"true\"/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertTrue( ex.getMessage().startsWith( "Illegal attribute value. 'iso' only valid for type: ADDRESS." ) );
}
}
@Test
public void testParseIllegalUserFieldAttributeCombination_RequiredAndReadOnly()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <prefix required=\"true\" readonly=\"true\"/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertEquals( InvalidUserStoreConfigException.class.getName(), ex.getClass().getName() );
}
}
@Test
public void testParseIllegalUserFieldAttributePresent_Name()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <prefix name=\"fisk\"/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertTrue( ex instanceof InvalidUserStoreConfigException );
}
}
@Test
public void testParseIllegalUserFieldAttributePresent_RequiredForTypeBoolean()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <html-email required=\"true\"/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertEquals( InvalidUserStoreConfigException.class.getName(), ex.getClass().getName() );
}
}
@Test
public void testParseUnknownUserFieldAttribute()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <prefix fisk=\"ost\"/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertEquals( InvalidUserStoreConfigException.class.getName(), ex.getClass().getName() );
}
}
@Test
public void testParseUnknownUserFieldElement()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <prefix>" );
configXml.append( " <fisk/>" );
configXml.append( " </prefix>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertEquals( InvalidUserStoreConfigException.class.getName(), ex.getClass().getName() );
}
}
@Test
public void testParseIllegalDuplicatedUserFieldElement()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <prefix/>" );
configXml.append( " <prefix/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertEquals( InvalidUserStoreConfigException.class.getName(), ex.getClass().getName() );
}
}
@Test
public void testAllParseUserFieldTypes()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
for ( final UserFieldType type : UserFieldType.values() )
{
configXml.append( " <" + type.getName() + "/>" );
}
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
final UserStoreConfig config = UserStoreConfigParser.parse( configEl );
assertNotNull( config );
assertNotNull( config.getUserFieldConfigs() );
assertEquals( UserFieldType.values().length, config.getUserFieldConfigs().size() );
/* Verify unique types */
final Set<UserFieldType> userFields = new HashSet<UserFieldType>();
for ( final UserStoreConfigField userFieldConfig : config.getUserFieldConfigs() )
{
userFields.add( userFieldConfig.getType() );
}
assertEquals( UserFieldType.values().length, userFields.size() );
}
@Test
public void testParseRemoteFlag()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <first-name remote='true' />" );
configXml.append( " <initials remote='false' />" );
configXml.append( " <birthday/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
final UserStoreConfig config = UserStoreConfigParser.parse( configEl );
final Collection<UserStoreConfigField> allUserFieldConfigs = config.getUserFieldConfigs();
final Collection<UserStoreConfigField> retmoteUserFieldConfigs = config.getRemoteOnlyUserFieldConfigs();
assertEquals( 1, retmoteUserFieldConfigs.size() );
for ( final UserStoreConfigField userFieldConfig : allUserFieldConfigs )
{
if ( userFieldConfig.getType().getName().equals( "first-name" ) )
{
assertEquals( true, userFieldConfig.isRemote() );
}
else if ( userFieldConfig.getType().getName().equals( "initials" ) )
{
assertEquals( false, userFieldConfig.isRemote() );
}
else if ( userFieldConfig.getType().getName().equals( "birthday" ) )
{
assertEquals( false, userFieldConfig.isRemote() );
}
}
}
@Test
public void testParseReadOnlyFlag()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <first-name readonly='true' />" );
configXml.append( " <initials readonly='false' />" );
configXml.append( " <birthday/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
final UserStoreConfig config = UserStoreConfigParser.parse( configEl );
final Collection<UserStoreConfigField> allUserFieldConfigs = config.getUserFieldConfigs();
for ( final UserStoreConfigField userFieldConfig : allUserFieldConfigs )
{
if ( userFieldConfig.getType().getName().equals( "first-name" ) )
{
assertEquals( true, userFieldConfig.isReadOnly() );
}
else if ( userFieldConfig.getType().getName().equals( "initials" ) )
{
assertEquals( false, userFieldConfig.isReadOnly() );
}
else if ( userFieldConfig.getType().getName().equals( "birthday" ) )
{
assertEquals( false, userFieldConfig.isReadOnly() );
}
}
}
@Test
public void testParseRequiredFlag()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <first-name required='true' />" );
configXml.append( " <initials required='false' />" );
configXml.append( " <birthday/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
final UserStoreConfig config = UserStoreConfigParser.parse( configEl );
final Collection<UserStoreConfigField> allUserFieldConfigs = config.getUserFieldConfigs();
for ( final UserStoreConfigField userFieldConfig : allUserFieldConfigs )
{
if ( userFieldConfig.getType().getName().equals( "first-name" ) )
{
assertEquals( true, userFieldConfig.isRequired() );
}
else if ( userFieldConfig.getType().getName().equals( "initials" ) )
{
assertEquals( false, userFieldConfig.isRequired() );
}
else if ( userFieldConfig.getType().getName().equals( "birthday" ) )
{
assertEquals( false, userFieldConfig.isRequired() );
}
}
}
@Test
public void testParseIsoFlag()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <address iso='true' />" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
final UserStoreConfig config = UserStoreConfigParser.parse( configEl );
final Collection<UserStoreConfigField> allUserFieldConfigs = config.getUserFieldConfigs();
for ( final UserStoreConfigField userFieldConfig : allUserFieldConfigs )
{
if ( userFieldConfig.getType().getName().equals( "address" ) )
{
assertEquals( true, userFieldConfig.useIso() );
}
}
}
@Test
public void testParseFieldConfigRemoteValid()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <prefix readonly=\"true\"/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
UserStoreConfig userStoreConfig = UserStoreConfigParser.parse( configEl, false );
assertTrue( userStoreConfig.getUserFieldConfigs().iterator().next().isReadOnly() );
}
@Test
public void testParseFieldConfigRemoteInvalid()
throws IOException, JDOMException
{
final StringBuffer configXml = new StringBuffer();
configXml.append( "<config>" );
configXml.append( " <user-fields>" );
configXml.append( " <prefix remote=\"true\"/>" );
configXml.append( " </user-fields>" );
configXml.append( "</config>" );
final Element configEl = JDOMUtil.parseDocument( configXml.toString() ).getRootElement();
try
{
UserStoreConfigParser.parse( configEl, false );
fail( "An exception should have been thrown." );
}
catch ( Exception ex )
{
assertTrue( ex.getMessage().startsWith( "Illegal attribute. 'remote' attribute cannot be used without a remote connector." ) );
}
}
}