/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.index.queryexpression;
import org.junit.Before;
import org.junit.Test;
import junit.framework.Assert;
import com.enonic.cms.core.content.contenttype.ContentTypeEntity;
import com.enonic.cms.core.content.index.ContentIndexConstants;
import com.enonic.cms.store.dao.ContentTypeDao;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.*;
public class ContentTypeEvaluatorTest
{
private static final String CONTENT_TYPE = ContentIndexConstants.F_CONTENT_TYPE_NAME;
private ContentTypeDao contentTypeDaoMock;
@Before
public void setUp()
{
contentTypeDaoMock = createMock( ContentTypeDao.class );
}
@Test
public void evaluate_does_not_change_value_when_left_is_not_an_contenttype()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
CompareExpr compareExpr =
(CompareExpr) evaluator.evaluate( new CompareExpr( CompareExpr.EQ, new FieldExpr( "fullText" ), new ValueExpr( "article" ) ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( "fullText", ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( ( (ValueExpr) compareExpr.getRight() ).isString() );
assertEquals( "article", ( (ValueExpr) compareExpr.getRight() ).getValue() );
assertEquals( CompareExpr.EQ, compareExpr.getOperator() );
}
@Test
public void evaluate_does_not_change_value_when_operation_is_not_EQUAL_NOT_EQUAL_IN_NOT_IN()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
CompareExpr compareExpr = (CompareExpr) evaluator.evaluate(
new CompareExpr( CompareExpr.LIKE, new FieldExpr( CONTENT_TYPE ), new ValueExpr( "article" ) ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( CONTENT_TYPE, ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( ( (ValueExpr) compareExpr.getRight() ).isString() );
assertEquals( "article", ( (ValueExpr) compareExpr.getRight() ).getValue() );
assertEquals( CompareExpr.LIKE, compareExpr.getOperator() );
}
@Test
public void evaluate_does_not_change_value_when_operation_is_EQUAL_but_right_is_not_value_expression()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
OrderFieldExpr[] orderBy = new OrderFieldExpr[0];
CompareExpr compareExpr = (CompareExpr) evaluator.evaluate(
new CompareExpr( CompareExpr.EQ, new FieldExpr( CONTENT_TYPE ), new OrderByExpr( orderBy ) ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( CONTENT_TYPE, ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( compareExpr.getRight() instanceof OrderByExpr );
assertArrayEquals( orderBy, ( (OrderByExpr) compareExpr.getRight() ).getFields() );
assertEquals( CompareExpr.EQ, compareExpr.getOperator() );
}
@Test
public void evaluate_does_not_change_value_when_operation_is_EQUAL_but_value_is_not_string()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
CompareExpr compareExpr =
(CompareExpr) evaluator.evaluate( new CompareExpr( CompareExpr.EQ, new FieldExpr( CONTENT_TYPE ), new ValueExpr( 100.0d ) ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( CONTENT_TYPE, ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( ( (ValueExpr) compareExpr.getRight() ).isNumber() );
assertEquals( 100.0d, ( (ValueExpr) compareExpr.getRight() ).getValue() );
assertEquals( CompareExpr.EQ, compareExpr.getOperator() );
}
@Test
public void evaluate_does_not_change_value_when_operation_is_EQUAL_but_value_is_not_preset_in_db()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
expect( contentTypeDaoMock.findByName( "article" ) ).andReturn( null ).times( 1 );
replay( contentTypeDaoMock );
CompareExpr compareExpr = (CompareExpr) evaluator.evaluate(
new CompareExpr( CompareExpr.EQ, new FieldExpr( CONTENT_TYPE ), new ValueExpr( "article" ) ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( CONTENT_TYPE, ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( ( (ValueExpr) compareExpr.getRight() ).isString() );
assertEquals( "article", ( (ValueExpr) compareExpr.getRight() ).getValue() );
assertEquals( CompareExpr.EQ, compareExpr.getOperator() );
verify( contentTypeDaoMock );
}
@Test
public void evaluate_changes_value_when_operation_is_EQUAL_and_value_is_preset_in_db()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
ContentTypeEntity type = new ContentTypeEntity();
type.setKey( 99 );
expect( contentTypeDaoMock.findByName( "article" ) ).andReturn( type ).times( 1 );
replay( contentTypeDaoMock );
CompareExpr compareExpr = (CompareExpr) evaluator.evaluate(
new CompareExpr( CompareExpr.EQ, new FieldExpr( CONTENT_TYPE ), new ValueExpr( "article" ) ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( "contenttypekey", ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( ( (ValueExpr) compareExpr.getRight() ).isNumber() );
assertEquals( 99, ( (ValueExpr) compareExpr.getRight() ).getValue() );
assertEquals( CompareExpr.EQ, compareExpr.getOperator() );
verify( contentTypeDaoMock );
}
@Test
public void evaluate_changes_value_when_operation_is_NOT_EQUAL_and_value_is_preset_in_db()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
ContentTypeEntity type = new ContentTypeEntity();
type.setKey( 99 );
expect( contentTypeDaoMock.findByName( "article" ) ).andReturn( type ).times( 1 );
replay( contentTypeDaoMock );
CompareExpr compareExpr = (CompareExpr) evaluator.evaluate(
new CompareExpr( CompareExpr.NEQ, new FieldExpr( CONTENT_TYPE ), new ValueExpr( "article" ) ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( "contenttypekey", ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( ( (ValueExpr) compareExpr.getRight() ).isNumber() );
assertEquals( 99, ( (ValueExpr) compareExpr.getRight() ).getValue() );
assertEquals( CompareExpr.NEQ, compareExpr.getOperator() );
verify( contentTypeDaoMock );
}
@Test
public void evaluate_does_not_change_value_when_operation_is_IN_but_right_is_not_array_expression()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
OrderFieldExpr[] orderBy = new OrderFieldExpr[0];
CompareExpr compareExpr = (CompareExpr) evaluator.evaluate(
new CompareExpr( CompareExpr.IN, new FieldExpr( CONTENT_TYPE ), new OrderByExpr( orderBy ) ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( CONTENT_TYPE, ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( compareExpr.getRight() instanceof OrderByExpr );
assertArrayEquals( orderBy, ( (OrderByExpr) compareExpr.getRight() ).getFields() );
assertEquals( CompareExpr.IN, compareExpr.getOperator() );
}
@Test
public void evaluate_generates_empty_keyset_when_operation_is_IN_but_value_is_not_string()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
ValueExpr[] values = new ValueExpr[]{new ValueExpr( 1.0d ), new ValueExpr( 2.0d )};
ArrayExpr arrayExpr = new ArrayExpr( values );
CompareExpr compareExpr =
(CompareExpr) evaluator.evaluate( new CompareExpr( CompareExpr.IN, new FieldExpr( CONTENT_TYPE ), arrayExpr ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( "contenttypekey", ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( compareExpr.getRight() instanceof ArrayExpr );
assertArrayEquals( new ValueExpr[0], ( (ArrayExpr) compareExpr.getRight() ).getValues() );
assertEquals( CompareExpr.IN, compareExpr.getOperator() );
}
@Test
public void evaluate_does_not_change_value_when_operation_is_IN_but_value_is_not_preset_in_db()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
expect( contentTypeDaoMock.findByName( "article" ) ).andReturn( null ).times( 1 );
replay( contentTypeDaoMock );
ValueExpr[] values = new ValueExpr[]{new ValueExpr( "article" ), new ValueExpr( "document" )};
ArrayExpr arrayExpr = new ArrayExpr( values );
CompareExpr compareExpr =
(CompareExpr) evaluator.evaluate( new CompareExpr( CompareExpr.IN, new FieldExpr( CONTENT_TYPE ), arrayExpr ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( CONTENT_TYPE, ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( compareExpr.getRight() instanceof ArrayExpr );
assertArrayEquals( values, ( (ArrayExpr) compareExpr.getRight() ).getValues() );
assertEquals( CompareExpr.IN, compareExpr.getOperator() );
verify( contentTypeDaoMock );
}
@Test
public void evaluate_changes_value_when_operation_is_IN_and_value_is_preset_in_db()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
ContentTypeEntity article = new ContentTypeEntity();
article.setKey( 88 );
ContentTypeEntity document = new ContentTypeEntity();
document.setKey( 99 );
expect( contentTypeDaoMock.findByName( "article" ) ).andReturn( article ).times( 1 );
expect( contentTypeDaoMock.findByName( "document" ) ).andReturn( document ).times( 1 );
replay( contentTypeDaoMock );
ValueExpr[] values = new ValueExpr[]{new ValueExpr( "article" ), new ValueExpr( "document" )};
ArrayExpr arrayExpr = new ArrayExpr( values );
CompareExpr compareExpr =
(CompareExpr) evaluator.evaluate( new CompareExpr( CompareExpr.IN, new FieldExpr( CONTENT_TYPE ), arrayExpr ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( "contenttypekey", ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( compareExpr.getRight() instanceof ArrayExpr );
assertArrayEquals( new ValueExpr[]{new ValueExpr( 88.0f ), new ValueExpr( 99.0f )},
( (ArrayExpr) compareExpr.getRight() ).getValues() );
assertEquals( CompareExpr.IN, compareExpr.getOperator() );
verify( contentTypeDaoMock );
}
@Test
public void evaluate_does_not_change_value_when_operation_is_IN_and_at_least_one_value_is_not_preset_in_db()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
ContentTypeEntity article = new ContentTypeEntity();
article.setKey( 88 );
ContentTypeEntity document = new ContentTypeEntity();
document.setKey( 99 );
expect( contentTypeDaoMock.findByName( "article" ) ).andReturn( article ).times( 1 );
expect( contentTypeDaoMock.findByName( "document" ) ).andReturn( document ).times( 1 );
expect( contentTypeDaoMock.findByName( "wrong" ) ).andReturn( null ).times( 1 );
replay( contentTypeDaoMock );
ValueExpr[] values = new ValueExpr[]{new ValueExpr( "article" ), new ValueExpr( "document" ), new ValueExpr( "wrong" )};
ArrayExpr arrayExpr = new ArrayExpr( values );
CompareExpr compareExpr =
(CompareExpr) evaluator.evaluate( new CompareExpr( CompareExpr.IN, new FieldExpr( CONTENT_TYPE ), arrayExpr ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( CONTENT_TYPE, ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( compareExpr.getRight() instanceof ArrayExpr );
assertArrayEquals( values, ( (ArrayExpr) compareExpr.getRight() ).getValues() );
assertEquals( CompareExpr.IN, compareExpr.getOperator() );
verify( contentTypeDaoMock );
}
@Test
public void evaluate_changes_value_when_operation_is_NOT_IN_and_value_is_preset_in_db()
{
ContentTypeEvaluator evaluator = new ContentTypeEvaluator( contentTypeDaoMock );
ContentTypeEntity article = new ContentTypeEntity();
article.setKey( 88 );
ContentTypeEntity document = new ContentTypeEntity();
document.setKey( 99 );
expect( contentTypeDaoMock.findByName( "article" ) ).andReturn( article ).times( 1 );
expect( contentTypeDaoMock.findByName( "document" ) ).andReturn( document ).times( 1 );
replay( contentTypeDaoMock );
ValueExpr[] values = new ValueExpr[]{new ValueExpr( "article" ), new ValueExpr( "document" )};
ArrayExpr arrayExpr = new ArrayExpr( values );
CompareExpr compareExpr =
(CompareExpr) evaluator.evaluate( new CompareExpr( CompareExpr.NOT_IN, new FieldExpr( CONTENT_TYPE ), arrayExpr ) );
assertTrue( compareExpr.getLeft() instanceof FieldExpr );
assertEquals( "contenttypekey", ( (FieldExpr) compareExpr.getLeft() ).getPath() );
assertTrue( compareExpr.getRight() instanceof ArrayExpr );
assertArrayEquals( new ValueExpr[]{new ValueExpr( 88.0f ), new ValueExpr( 99.0f )},
( (ArrayExpr) compareExpr.getRight() ).getValues() );
assertEquals( CompareExpr.NOT_IN, compareExpr.getOperator() );
verify( contentTypeDaoMock );
}
private static void assertArrayEquals( Object[] a1, Object[] a2 )
{
Assert.assertEquals( arrayToString( a1 ), arrayToString( a2 ) );
}
private static String arrayToString( Object[] a )
{
StringBuilder result = new StringBuilder( "[" );
for ( int i = 0; i < a.length; i++ )
{
result.append( i ).append( ": " ).append( a[i] );
if ( i < a.length - 1 )
{
result.append( ", " );
}
}
result.append( "]" );
return result.toString();
}
}