package org.odata4j.test.unit.consumer.jdbc; /* * #%L * interaction-commands-odata-bridge * %% * Copyright (C) 2012 - 2013 Temenos Holdings N.V. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.ext.RuntimeDelegate; import junit.framework.Assert; import org.core4j.Enumerable; import org.core4j.Func; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.odata4j.consumer.ODataConsumer; import org.odata4j.consumer.ODataConsumerAdapter; import org.odata4j.core.OEntity; import org.odata4j.core.OEntityKey; import org.odata4j.core.OProperties; import org.odata4j.core.OQueryRequest; import org.odata4j.edm.EdmDataServices; import org.odata4j.edm.EdmEntitySet; import org.odata4j.exceptions.NotFoundException; import org.odata4j.producer.command.ProducerCommandContext; import org.odata4j.producer.jdbc.JdbcModelToMetadata; import org.odata4j.producer.jdbc.JdbcProducer; import org.odata4j.producer.jdbc.LoggingCommand; import org.odata4j.test.unit.Asserts; public class JdbcConsumerTest { private static final String CUSTOMER = "Customer"; private static final String CUSTOMER_ID = "CustomerId"; private static final String CUSTOMER_NAME = "CustomerName"; private static final String CUSTOMER_PRODUCT = "CustomerProduct"; private static String constantToPascalCase(String constantCase) { String[] tokens = constantCase.split("_"); StringBuilder sb = new StringBuilder(); for (String token : tokens) { if (token.isEmpty()) continue; sb.append(Character.toUpperCase(token.charAt(0))); if (token.length() > 1) sb.append(token.substring(1).toLowerCase()); } return sb.toString(); } @BeforeClass public static void setupClass() { // a ResponseBuilder instance is required by negative tests checking for an exception (e.g. NotFoundException) ResponseBuilder rbMock = mock(ResponseBuilder.class); RuntimeDelegate rdMock = mock(RuntimeDelegate.class); when(rdMock.createResponseBuilder()).thenReturn(rbMock); RuntimeDelegate.setInstance(rdMock); } @AfterClass public static void cleanTables(){ JdbcTest.dropExample(); } @Test public void jdbcProducer() { JdbcTest.populateExample(); JdbcModelToMetadata modelToMetadata = new JdbcModelToMetadata() { @Override public String rename(String dbName) { return constantToPascalCase(dbName); } }; JdbcProducer localProducer = JdbcProducer.newBuilder() .jdbc(JdbcTest.HSQL_DB) .insert(ProducerCommandContext.class, new LoggingCommand()) .register(JdbcModelToMetadata.class, modelToMetadata) .build(); ODataConsumer consumer = new ODataConsumerAdapter(localProducer); // getMetadata EdmDataServices metadata = consumer.getMetadata(); Assert.assertNotNull(metadata); JdbcTest.dump(metadata); EdmEntitySet customerEntitySet = metadata.findEdmEntitySet(CUSTOMER); Assert.assertNotNull(customerEntitySet); Assert.assertEquals(CUSTOMER, customerEntitySet.getName()); // getEntity - simple key OEntity entity = consumer.getEntity(CUSTOMER, OEntityKey.create(1)).execute(); Assert.assertNotNull(entity); Assert.assertEquals("Customer One", entity.getProperty(CUSTOMER_NAME).getValue()); // getEntity - not found Asserts.assertThrows(NotFoundException.class, getEntity(consumer, CUSTOMER, OEntityKey.create(-1), null)); // getEntity - complex key entity = consumer.getEntity(CUSTOMER_PRODUCT, OEntityKey.create("CustomerId", 1, "ProductId", 1)).execute(); Assert.assertNotNull(entity); // getEntities - no query Enumerable<OEntity> entities = consumer.getEntities(CUSTOMER).execute(); Assert.assertNotNull(entities); Assert.assertEquals(2, entities.count()); //Assert.assertEquals(CUSTOMER, entitiesResponse.getEntitySet().getName()); // getEntities - not found Asserts.assertThrows(NotFoundException.class, getEntities(consumer, "badEntitySet", null)); // getEntities - id = 1 entities = consumer.getEntities(CUSTOMER).filter(CUSTOMER_ID + " eq 1").execute(); Assert.assertNotNull(entities); Assert.assertEquals(1, entities.count()); Assert.assertEquals("Customer One", entities.first().getProperty(CUSTOMER_NAME).getValue()); // getEntities - name = 'Customer Two' entities = consumer.getEntities(CUSTOMER).filter(CUSTOMER_NAME + " eq 'Customer Two'").execute(); Assert.assertNotNull(entities); Assert.assertEquals(1, entities.count()); Assert.assertEquals("Customer Two", entities.first().getProperty(CUSTOMER_NAME).getValue()); // getEntities - 1 = id entities = consumer.getEntities(CUSTOMER).filter(CUSTOMER_ID + " eq 1").execute(); Assert.assertNotNull(entities); Assert.assertEquals(1, entities.count()); Assert.assertEquals("Customer One", entities.first().getProperty(CUSTOMER_NAME).getValue()); // getEntities - no results entities = consumer.getEntities(CUSTOMER).filter(CUSTOMER_ID + " eq -1").execute(); Assert.assertNotNull(entities); Assert.assertEquals(0, entities.count()); // getEntities - id <> 1 entities = consumer.getEntities(CUSTOMER).filter(CUSTOMER_ID + " ne 1").execute(); Assert.assertNotNull(entities); Assert.assertEquals(1, entities.count()); Assert.assertEquals("Customer Two", entities.first().getProperty(CUSTOMER_NAME).getValue()); // getEntities - id > 1 entities = consumer.getEntities(CUSTOMER).filter(CUSTOMER_ID + " gt 1").execute(); Assert.assertNotNull(entities); Assert.assertEquals(1, entities.count()); // getEntities - id >= 1 entities = consumer.getEntities(CUSTOMER).filter(CUSTOMER_ID + " ge 1").execute(); Assert.assertNotNull(entities); Assert.assertEquals(2, entities.count()); // getEntities - id < 2 entities = consumer.getEntities(CUSTOMER).filter(CUSTOMER_ID + " lt 2").execute(); Assert.assertNotNull(entities); Assert.assertEquals(1, entities.count()); // getEntities - id <= 2 entities = consumer.getEntities(CUSTOMER).filter(CUSTOMER_ID + " le 2").execute(); Assert.assertNotNull(entities); Assert.assertEquals(2, entities.count()); // createEntity - id = 3 entity = consumer.createEntity(CUSTOMER) .properties(OProperties.int32(CUSTOMER_ID, 3)) .properties(OProperties.string(CUSTOMER_NAME, "Customer Three")) .execute(); Assert.assertNotNull(entity); entities = consumer.getEntities(CUSTOMER).execute(); Assert.assertNotNull(entities); Assert.assertEquals(3, entities.count()); // updateEntity - id = 3 /* boolean success = consumer.updateEntity(entity) .properties(OProperties.string(CUSTOMER_NAME, "Customer Three (modified)")) .execute(); Assert.assertTrue(success); entities = consumer.getEntities(CUSTOMER).execute(); Assert.assertNotNull(entities); Assert.assertEquals(3, entities.count()); entities = consumer.getEntities(CUSTOMER).filter(CUSTOMER_ID + " eq 3").execute(); Assert.assertNotNull(entities); Assert.assertEquals(1, entities.count()); Assert.assertEquals("Customer Three (modified)", entities.first().getProperty(CUSTOMER_NAME).getValue()); */ // deleteEntity - id = 3 consumer.deleteEntity(CUSTOMER, OEntityKey.create(3)); entities = consumer.getEntities(CUSTOMER).execute(); Assert.assertNotNull(entities); Assert.assertEquals(2, entities.count()); // createEntity - id = 3 entity = consumer.createEntity(CUSTOMER) .properties(OProperties.int32(CUSTOMER_ID, 3)) .properties(OProperties.string(CUSTOMER_NAME, "Customer Three")) .execute(); Assert.assertNotNull(entity); entities = consumer.getEntities(CUSTOMER).execute(); Assert.assertNotNull(entities); Assert.assertEquals(3, entities.count()); // deleteEntity - id = 3 consumer.deleteEntity(CUSTOMER, 3); entities = consumer.getEntities(CUSTOMER).execute(); Assert.assertNotNull(entities); Assert.assertEquals(2, entities.count()); // createEntity - id = 3 entity = consumer.createEntity(CUSTOMER) .properties(OProperties.int32(CUSTOMER_ID, 3)) .properties(OProperties.string(CUSTOMER_NAME, "Customer Three")) .execute(); Assert.assertNotNull(entity); entities = consumer.getEntities(CUSTOMER).execute(); Assert.assertNotNull(entities); Assert.assertEquals(3, entities.count()); // deleteEntity - id = 3 consumer.deleteEntity(entity); entities = consumer.getEntities(CUSTOMER).execute(); Assert.assertNotNull(entities); Assert.assertEquals(2, entities.count()); } private static Func<Enumerable<OEntity>> getEntities(final ODataConsumer consumer, final String entitySet, final String filter) { return new Func<Enumerable<OEntity>>() { @Override public Enumerable<OEntity> apply() { OQueryRequest<OEntity> request = consumer.getEntities(entitySet); if (filter != null){ request.filter(filter); } return request.execute(); }}; } private static Func<OEntity> getEntity(final ODataConsumer consumer, final String entitySet, final OEntityKey key, final String filter) { return new Func<OEntity>() { @Override public OEntity apply() { return consumer.getEntity(entitySet, key).execute(); }}; } }