/******************************************************************************* * Copyright 2013 SAP AG * * Licensed under the Apache 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.apache.org/licenses/LICENSE-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 com.sap.core.odata.processor.core.jpa.jpql; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.List; import org.easymock.EasyMock; import org.junit.BeforeClass; import org.junit.Test; import com.sap.core.odata.api.edm.EdmEntitySet; import com.sap.core.odata.api.edm.EdmEntityType; import com.sap.core.odata.api.edm.EdmException; import com.sap.core.odata.api.edm.EdmMapping; import com.sap.core.odata.api.edm.EdmProperty; import com.sap.core.odata.api.edm.EdmType; import com.sap.core.odata.api.uri.KeyPredicate; import com.sap.core.odata.api.uri.SelectItem; import com.sap.core.odata.api.uri.expression.ExpressionKind; import com.sap.core.odata.api.uri.expression.FilterExpression; import com.sap.core.odata.api.uri.expression.OrderByExpression; import com.sap.core.odata.api.uri.expression.OrderExpression; import com.sap.core.odata.api.uri.expression.PropertyExpression; import com.sap.core.odata.api.uri.expression.SortOrder; import com.sap.core.odata.api.uri.info.GetEntitySetUriInfo; import com.sap.core.odata.processor.api.jpa.exception.ODataJPAModelException; import com.sap.core.odata.processor.api.jpa.exception.ODataJPARuntimeException; import com.sap.core.odata.processor.api.jpa.jpql.JPQLContext; import com.sap.core.odata.processor.api.jpa.jpql.JPQLContextType; import com.sap.core.odata.processor.core.jpa.common.ODataJPATestConstants; import com.sap.core.odata.processor.core.jpa.jpql.JPQLSelectContext.JPQLSelectContextBuilder; public class JPQLSelectContextImplTest { private static String entityTypeName = "MockEntity"; private static String[] fields = { "Field1", "Field2" }; private static List<KeyPredicate> keyPredicates; private static SortOrder[] orderType = { SortOrder.asc, SortOrder.desc }; private static JPQLSelectContextBuilder builder; private static JPQLSelectContext selectContext; @BeforeClass public static void setup() { } private void buildSelectContext(final boolean orderByIsNull, final boolean selectFieldsIsNull, final boolean filterIsNull, final boolean isTopNull, final boolean isSkipNull) { builder = null; selectContext = null; keyPredicates = new ArrayList<KeyPredicate>(); GetEntitySetUriInfo resultsView = EasyMock .createMock(GetEntitySetUriInfo.class); EdmEntitySet entitySet = EasyMock.createMock(EdmEntitySet.class); EdmEntityType entityType = EasyMock.createMock(EdmEntityType.class); KeyPredicate keyPredicate = EasyMock.createMock(KeyPredicate.class); EdmProperty kpProperty = EasyMock.createMock(EdmProperty.class); EdmType edmType1 = EasyMock.createMock(EdmType.class); EdmMapping mapping = EasyMock.createMock(EdmMapping.class); EasyMock.expect(keyPredicate.getLiteral()).andStubReturn("1"); try { EasyMock.expect(mapping.getInternalName()).andStubReturn("Field1"); EasyMock.expect(kpProperty.getMapping()).andStubReturn(mapping); EasyMock.expect(kpProperty.getType()).andStubReturn(edmType1); } catch (EdmException e2) { fail("this should not happen"); } EasyMock.expect(keyPredicate.getProperty()).andStubReturn(kpProperty); EasyMock.replay(mapping, edmType1, kpProperty, keyPredicate); keyPredicates.add(keyPredicate); int i = 0; List<OrderExpression> orderList = new ArrayList<OrderExpression>(2); do { EdmType edmType = EasyMock.createMock(EdmType.class); try { EasyMock.expect(edmType.getName()).andStubReturn(fields[i]); EasyMock.replay(edmType); } catch (EdmException e2) { fail("Exception not Expected"); } PropertyExpression commonExpression = EasyMock .createMock(PropertyExpression.class); EasyMock.expect(commonExpression.getEdmType()).andStubReturn( edmType); EdmProperty edmTyped = EasyMock.createMock(EdmProperty.class); EdmMapping edmMapping = EasyMock.createMock(EdmMapping.class); EasyMock.expect(edmMapping.getInternalName()).andStubReturn( fields[i]); try { EasyMock.expect(edmTyped.getMapping()) .andStubReturn(edmMapping); } catch (EdmException e) { // TODO Auto-generated catch block e.printStackTrace(); } EasyMock.expect(commonExpression.getEdmProperty()).andStubReturn( edmTyped); OrderExpression order = EasyMock.createMock(OrderExpression.class); EasyMock.expect(order.getExpression()).andStubReturn( commonExpression); EasyMock.expect(order.getSortOrder()).andStubReturn(orderType[i]); EasyMock.replay(edmMapping, edmTyped, commonExpression); EasyMock.replay(order); orderList.add(order); } while (++i < 2); OrderByExpression orderBy = EasyMock .createMock(OrderByExpression.class); EasyMock.expect(orderBy.getOrders()).andStubReturn(orderList); EasyMock.replay(orderBy); try { i = 0; List<SelectItem> selectItemList = new ArrayList<SelectItem>(2); do { EdmMapping edmMapping = EasyMock.createMock(EdmMapping.class); EasyMock.expect(edmMapping.getInternalName()).andStubReturn( fields[i]); EdmProperty edmProperty = EasyMock .createMock(EdmProperty.class); EasyMock.expect(edmProperty.getMapping()).andStubReturn( edmMapping); EasyMock.replay(edmMapping, edmProperty); SelectItem selectItem = EasyMock.createMock(SelectItem.class); EasyMock.expect(selectItem.getProperty()).andStubReturn( edmProperty); EasyMock.replay(selectItem); selectItemList.add(selectItem); } while (++i < 2); EasyMock.expect(entityType.getMapping()).andStubReturn(null); EasyMock.expect(entityType.getName()).andStubReturn(entityTypeName); EasyMock.expect(entityType.getKeyProperties()).andStubReturn(getLocalKeyProperties()); EasyMock.replay(entityType); EasyMock.expect(entitySet.getEntityType()) .andStubReturn(entityType); EasyMock.replay(entitySet); EasyMock.expect(resultsView.getTargetEntitySet()).andStubReturn( entitySet); if (orderByIsNull) { EasyMock.expect(resultsView.getOrderBy()).andStubReturn(null); } else { EasyMock.expect(resultsView.getOrderBy()) .andStubReturn(orderBy); } if (selectFieldsIsNull) { EasyMock.expect(resultsView.getSelect()).andStubReturn(null); } else { EasyMock.expect(resultsView.getSelect()).andStubReturn( selectItemList); } // FilterExpression filterExpression = // EasyMock.createMock(FilterExpression.class); // EasyMock.expect(filterExpression.g) if (filterIsNull) { EasyMock.expect(resultsView.getFilter()).andStubReturn(null); } else { EasyMock.expect(resultsView.getFilter()).andStubReturn( getFilterExpressionMockedObj(ExpressionKind.PROPERTY, "SalesOrder")); } if (isTopNull) { EasyMock.expect(resultsView.getTop()).andStubReturn(null); } else { EasyMock.expect(resultsView.getTop()).andStubReturn(10); } if (isSkipNull) { EasyMock.expect(resultsView.getSkip()).andStubReturn(null); } else { EasyMock.expect(resultsView.getSkip()).andStubReturn(0); } EasyMock.expect(resultsView.getKeyPredicates()).andStubReturn( keyPredicates); EasyMock.replay(resultsView); } catch (EdmException e1) { fail("Exception not Expected"); } try { builder = (JPQLSelectContextBuilder) JPQLContext.createBuilder( JPQLContextType.SELECT, resultsView); selectContext = (JPQLSelectContext) builder.build(); } catch (ODataJPAModelException e) { fail("Exception not Expected"); } catch (ODataJPARuntimeException e) { fail("Runtime Exception thrown"); } } private List<EdmProperty> getLocalKeyProperties() { List<EdmProperty> propertyList = new ArrayList<EdmProperty>(); EdmProperty edmProperty = EasyMock.createMock(EdmProperty.class); try { EasyMock.expect(edmProperty.getName()).andStubReturn("Field1"); EasyMock.expect(edmProperty.getMapping()).andStubReturn(null); } catch (EdmException e) { fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2); } EasyMock.replay(edmProperty); propertyList.add(edmProperty); return propertyList; } @Test public void testEntityNameThrowingException() { // buildSelectContext(false, false, false); GetEntitySetUriInfo resultsView = EasyMock .createMock(GetEntitySetUriInfo.class); EdmEntitySet entitySet = EasyMock.createMock(EdmEntitySet.class); EdmEntityType entityType = EasyMock.createMock(EdmEntityType.class); try { EasyMock.expect(entityType.getName()).andStubThrow( new EdmException(null)); EasyMock.expect(entitySet.getEntityType()).andStubThrow( new EdmException(null)); } catch (EdmException e1) { // throw new ODataException(); } EasyMock.replay(entityType); EasyMock.replay(entitySet); EasyMock.expect(resultsView.getTargetEntitySet()).andStubReturn( entitySet); EasyMock.expect(resultsView.getOrderBy()).andStubReturn(null); EasyMock.expect(resultsView.getSelect()).andStubReturn(null); EasyMock.expect(resultsView.getFilter()).andStubReturn(null); EasyMock.replay(resultsView); try { JPQLSelectContextBuilder builder1 = (JPQLSelectContextBuilder) JPQLContext .createBuilder(JPQLContextType.SELECT, resultsView); builder1.build(); fail("Should not come here"); } catch (ODataJPAModelException e) { fail(); } catch (ODataJPARuntimeException e) { assertTrue(true); } } @Test public void testSelectFieldsAsNull() { buildSelectContext(false, true, true, true, true); try { selectContext = (JPQLSelectContext) builder.build(); assertEquals("E2", selectContext.getSelectExpression()); } catch (ODataJPAModelException e) { fail(); } catch (ODataJPARuntimeException e) { fail(); } } @Test public void testGetOrderByCollection() { buildSelectContext(false, false, true, true, true); assertEquals( true, selectContext.getOrderByCollection().containsKey( "E1." + JPQLSelectContextImplTest.fields[0])); assertEquals( "", selectContext.getOrderByCollection().get( "E1." + JPQLSelectContextImplTest.fields[0])); assertEquals( true, selectContext.getOrderByCollection().containsKey( "E1." + JPQLSelectContextImplTest.fields[1])); assertEquals( "DESC", selectContext.getOrderByCollection().get( "E1." + JPQLSelectContextImplTest.fields[1])); } @Test public void testGetWhereExpression() { buildSelectContext(false, false, true, true, true); // fail("Not yet implemented"); } @Test public void testGetJPAEntityName() { buildSelectContext(false, false, true, true, true); assertEquals(JPQLSelectContextImplTest.entityTypeName, selectContext.getJPAEntityName()); } @Test public void testGetType() { buildSelectContext(false, false, true, true, true); assertEquals(JPQLContextType.SELECT, selectContext.getType()); } @Test public void testCreateBuilder() { buildSelectContext(false, false, true, true, true); assertEquals(JPQLSelectContextBuilder.class.toString(), builder .getClass().toString()); } @Test public void testEntitySetAsNull() { buildSelectContext(false, false, true, true, true); try { JPQLSelectContextBuilder builder = (JPQLSelectContextBuilder) JPQLContext .createBuilder(JPQLContextType.SELECT, null); JPQLSelectContext selectContext1 = (JPQLSelectContext) builder .build(); assertNull(selectContext1.getJPAEntityAlias()); assertNull(selectContext1.getJPAEntityName()); assertNull(selectContext1.getOrderByCollection()); assertNull(selectContext1.getSelectExpression()); assertNull(selectContext1.getType()); assertNull(selectContext1.getWhereExpression()); } catch (ODataJPAModelException e) { fail("Exception not Expected"); } catch (ODataJPARuntimeException e) { fail("Runtime Exception thrown"); } } @Test public void testOrderingWithSkip() { buildSelectContext(true, false, true, true, false); assertEquals( true, selectContext.getOrderByCollection().containsKey( "E1." + JPQLSelectContextImplTest.fields[0])); assertEquals( "", selectContext.getOrderByCollection().get( "E1." + JPQLSelectContextImplTest.fields[0])); assertEquals( false, selectContext.getOrderByCollection().containsKey( "E1." + JPQLSelectContextImplTest.fields[1])); } @Test public void testOrderingWithTop() { buildSelectContext(true, false, true, false, true); assertEquals( true, selectContext.getOrderByCollection().containsKey( "E1." + JPQLSelectContextImplTest.fields[0])); assertEquals( "", selectContext.getOrderByCollection().get( "E1." + JPQLSelectContextImplTest.fields[0])); assertEquals( false, selectContext.getOrderByCollection().containsKey( "E1." + JPQLSelectContextImplTest.fields[1])); } @Test public void testOrderByTopSkipAsNull() { buildSelectContext(true, true, true, true, true); assertNull(selectContext.getOrderByCollection()); } @Test public void testFilter() { buildSelectContext(true, false, false, false, false); assertEquals("E1.field", selectContext.whereCondition); } private FilterExpression getFilterExpressionMockedObj( final ExpressionKind leftOperandExpKind, final String propertyName) throws EdmException { FilterExpression filterExpression = EasyMock .createMock(FilterExpression.class); EasyMock.expect(filterExpression.getKind()) .andStubReturn(ExpressionKind.FILTER); EasyMock.expect(filterExpression.getExpression()) .andStubReturn( getPropertyExpressionMockedObj(leftOperandExpKind, propertyName)); EasyMock.replay(filterExpression); return filterExpression; } private PropertyExpression getPropertyExpressionMockedObj( final ExpressionKind expKind, final String propertyName) { PropertyExpression leftOperandPropertyExpresion = EasyMock .createMock(PropertyExpression.class); EasyMock.expect(leftOperandPropertyExpresion.getKind()).andReturn( ExpressionKind.PROPERTY); EasyMock.expect(leftOperandPropertyExpresion.getPropertyName()) .andReturn(propertyName); EdmProperty edmtTyped = EasyMock.createMock(EdmProperty.class); EdmMapping mapping = EasyMock.createMock(EdmMapping.class); EasyMock.expect(mapping.getInternalName()).andStubReturn("field"); try { EasyMock.expect(edmtTyped.getMapping()).andStubReturn(mapping); } catch (EdmException e) { // TODO Auto-generated catch block e.printStackTrace(); } EasyMock.expect(leftOperandPropertyExpresion.getEdmProperty()) .andReturn(edmtTyped); EasyMock.replay(mapping, edmtTyped, leftOperandPropertyExpresion); return leftOperandPropertyExpresion; } }