CAY-1966 SQLTemplate/SQLSelect positional parameter binding * utest cleanup
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/617628c7 Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/617628c7 Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/617628c7 Branch: refs/heads/master Commit: 617628c7f50c544718f9b3d8e66cdd3ad408a38a Parents: 5aedf54 Author: aadamchik <[email protected]> Authored: Sun Nov 2 15:49:38 2014 +0300 Committer: aadamchik <[email protected]> Committed: Sun Nov 2 18:33:45 2014 +0300 ---------------------------------------------------------------------- .../access/dbsync/SchemaUpdateStrategyBase.java | 129 +++++++ .../access/dbsync/SchemaUpdateStrategyIT.java | 335 ++----------------- ...hrowOnPartialOrCreateSchemaStrategyTest.java | 78 +++++ .../ThrowOnPartialSchemaStrategyTest.java | 85 +++++ .../cayenne/unit/di/server/ServerCase.java | 51 +-- .../di/server/ServerCaseDataSourceFactory.java | 2 - .../src/test/resources/cayenne-default.xml | 1 - .../src/test/resources/cayenne-sus.xml | 4 + 8 files changed, 349 insertions(+), 336 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/617628c7/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyBase.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyBase.java b/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyBase.java new file mode 100644 index 0000000..3022457 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyBase.java @@ -0,0 +1,129 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.cayenne.access.dbsync; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.cayenne.CayenneRuntimeException; +import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.access.DataNode; +import org.apache.cayenne.dba.DbAdapter; +import org.apache.cayenne.di.Inject; +import org.apache.cayenne.map.DataMap; +import org.apache.cayenne.query.SQLTemplate; +import org.apache.cayenne.unit.di.server.ServerCase; + +public class SchemaUpdateStrategyBase extends ServerCase { + + @Inject + protected ObjectContext context; + + @Inject + protected DataNode node; + + @Inject + protected DbAdapter adapter; + + @Override + protected void setUpAfterInjection() throws Exception { + + DataMap map = node.getEntityResolver().getDataMap("sus-map"); + for (String name : existingTables()) { + + for (String drop : adapter.dropTableStatements(map.getDbEntity(name))) { + context.performGenericQuery(new SQLTemplate(Object.class, drop)); + } + } + } + + protected void setStrategy(Class<? extends SchemaUpdateStrategy> type) throws Exception { + node.setSchemaUpdateStrategyName(type.getName()); + node.setSchemaUpdateStrategy(type.newInstance()); + } + + protected Collection<String> existingTables() { + Collection<String> present = new ArrayList<String>(); + for (Entry<String, Boolean> e : tablesMap().entrySet()) { + if (e.getValue()) { + present.add(e.getKey()); + } + } + + return present; + } + + protected void createOneTable(String entityName) { + DataMap map = node.getEntityResolver().getDataMap("sus-map"); + String createTable = adapter.createTable(map.getDbEntity(entityName)); + context.performGenericQuery(new SQLTemplate(Object.class, createTable)); + } + + protected Map<String, Boolean> tablesMap() { + DataMap map = node.getEntityResolver().getDataMap("sus-map"); + Map<String, String> tables = new HashMap<String, String>(); + + // add upper/lower case permutations + for (String name : map.getDbEntityMap().keySet()) { + tables.put(name.toLowerCase(), name); + tables.put(name.toUpperCase(), name); + } + + Map<String, Boolean> presentInDB = new HashMap<String, Boolean>(); + for (String name : map.getDbEntityMap().keySet()) { + presentInDB.put(name, false); + } + + String tableLabel = node.getAdapter().tableTypeForTable(); + Connection con = null; + try { + con = node.getDataSource().getConnection(); + ResultSet rs = con.getMetaData().getTables(null, null, "%", new String[] { tableLabel }); + while (rs.next()) { + String dbName = rs.getString("TABLE_NAME"); + + String name = tables.get(dbName); + + if (name != null) { + presentInDB.put(name, true); + } + } + rs.close(); + } catch (SQLException e) { + throw new CayenneRuntimeException(e); + } finally { + try { + if (con != null) { + con.close(); + } + } catch (SQLException e) { + throw new CayenneRuntimeException(e); + } + } + + return presentInDB; + } + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/617628c7/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyIT.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyIT.java index fd8b118..682d187 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyIT.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/SchemaUpdateStrategyIT.java @@ -18,329 +18,46 @@ ****************************************************************/ package org.apache.cayenne.access.dbsync; -import org.apache.cayenne.CayenneRuntimeException; -import org.apache.cayenne.access.DataNode; +import java.util.Collections; +import java.util.Map; + import org.apache.cayenne.access.MockOperationObserver; -import org.apache.cayenne.dba.DbAdapter; -import org.apache.cayenne.di.Inject; -import org.apache.cayenne.log.JdbcEventLogger; -import org.apache.cayenne.map.DataMap; -import org.apache.cayenne.map.DbEntity; -import org.apache.cayenne.map.EntityResolver; +import org.apache.cayenne.access.OperationObserver; import org.apache.cayenne.query.Query; import org.apache.cayenne.query.SQLTemplate; import org.apache.cayenne.unit.di.server.ServerCase; -import org.apache.cayenne.unit.di.server.ServerCaseDataSourceFactory; import org.apache.cayenne.unit.di.server.UseServerRuntime; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -@UseServerRuntime(ServerCase.DEFAULT_PROJECT) -public class SchemaUpdateStrategyIT extends ServerCase { - - @Inject - private DataNode node; - - @Inject - private DbAdapter adapter; - - @Inject - private ServerCaseDataSourceFactory dataSourceFactory; - - @Inject - private JdbcEventLogger jdbcEventLogger; - - public void testDBGeneratorStrategy() throws Exception { - - String template = "SELECT #result('id' 'int') FROM SUS1"; - SQLTemplate query = new SQLTemplate(Object.class, template); - - DataMap map = node.getEntityResolver().getDataMap("sus-map"); - DataNode dataNode = createDataNode(map); - int sizeDB = getNameTablesInDB(dataNode).size(); - MockOperationObserver observer = new MockOperationObserver(); - try { - - generateDBWithDBGeneratorStrategy(dataNode, query, observer); - int sizeDB2 = getNameTablesInDB(dataNode).size(); - assertEquals(2, sizeDB2 - sizeDB); - dataNode.performQueries(Collections.singletonList((Query) query), observer); - int sizeDB3 = getNameTablesInDB(dataNode).size(); - assertEquals(sizeDB2, sizeDB3); - } - finally { - DataNode dataNode2 = createDataNode(map); - dataNode2.setSchemaUpdateStrategy((SchemaUpdateStrategy) Class.forName( - dataNode2.getSchemaUpdateStrategyName()).newInstance()); - dropTables(map, dataNode2, observer); - } - assertEquals(getNameTablesInDB(dataNode).size(), sizeDB); - } - - public void testThrowOnPartialStrategyTableNoExist() throws Exception { - - String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID"; - SQLTemplate query = new SQLTemplate(Object.class, template); - DataMap map = node.getEntityResolver().getDataMap("sus-map"); - MockOperationObserver observer = new MockOperationObserver(); - DataNode dataNode = createDataNode(map); - - setStrategy(ThrowOnPartialSchemaStrategy.class.getName(), dataNode); - - try { - dataNode.performQueries(Collections.singletonList((Query) query), observer); - } - catch (CayenneRuntimeException e) { - assertNotNull(e); - } - - try { - dataNode.performQueries(Collections.singletonList((Query) query), observer); - } - catch (CayenneRuntimeException e) { - assertNotNull(e); - } - } - - public void testThrowOnPartialStrategyTableExist() throws Exception { - tableExistfForThrowOnPartialAndMixStrategy(ThrowOnPartialSchemaStrategy.class - .getName()); - } - - public void testThrowOnPartialStrategyWithOneTable() throws Exception { - withOneTableForThrowOnPartialAndMixStrategy(ThrowOnPartialSchemaStrategy.class - .getName()); - } - - public void testMixedStrategyTableNoExist() throws Exception { - - String template = "SELECT #result('id' 'int') FROM SUS1"; - SQLTemplate query = new SQLTemplate(Object.class, template); - DataMap map = node.getEntityResolver().getDataMap("sus-map"); - DataNode dataNode = createDataNode(map); - int sizeDB = getNameTablesInDB(dataNode).size(); - MockOperationObserver observer = new MockOperationObserver(); - - setStrategy(ThrowOnPartialOrCreateSchemaStrategy.class.getName(), dataNode); - - try { - dataNode.performQueries(Collections.singletonList((Query) query), observer); - Map<String, Boolean> nameTables = getNameTablesInDB(dataNode); - assertTrue(nameTables.get("sus1") != null || nameTables.get("SUS1") != null); - int sizeDB2 = getNameTablesInDB(dataNode).size(); - assertEquals(2, sizeDB2 - sizeDB); - dataNode.performQueries(Collections.singletonList((Query) query), observer); - int sizeDB3 = getNameTablesInDB(dataNode).size(); - assertEquals(sizeDB2, sizeDB3); - } - finally { - DataNode dataNode2 = createDataNode(map); - dataNode2.setSchemaUpdateStrategy((SchemaUpdateStrategy) Class.forName( - dataNode2.getSchemaUpdateStrategyName()).newInstance()); - dropTables(map, dataNode2, observer); - } - assertEquals(getNameTablesInDB(dataNode).size(), sizeDB); - - } - - public void testMixedStrategyTableExist() throws Exception { - tableExistfForThrowOnPartialAndMixStrategy(ThrowOnPartialOrCreateSchemaStrategy.class - .getName()); - } - - public void testMixedStrategyWithOneTable() throws Exception { - withOneTableForThrowOnPartialAndMixStrategy(ThrowOnPartialOrCreateSchemaStrategy.class - .getName()); - }; - - public void testNoStandartSchema() { - String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID"; - SQLTemplate query = new SQLTemplate(Object.class, template); - MockOperationObserver observer = new MockOperationObserver(); - DataMap map = node.getEntityResolver().getDataMap("sus-map"); - DataNode dataNode = createDataNode(map); - - setStrategy(TstSchemaUpdateStrategy.class.getName(), dataNode); - - dataNode.performQueries(Collections.singletonList((Query) query), observer); - assertTrue(dataNode.getSchemaUpdateStrategy() instanceof TstSchemaUpdateStrategy); - } - - private void withOneTableForThrowOnPartialAndMixStrategy(String strategy) { - DbEntity entity = null; - String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID"; - SQLTemplate query = new SQLTemplate(Object.class, template); - DataMap map = node.getEntityResolver().getDataMap("sus-map"); - MockOperationObserver observer = new MockOperationObserver(); - DataNode dataNode = createDataNode(map); - - DataNode dataNode2 = createDataNode(map); - - try { - - int sizeDB = getNameTablesInDB(dataNode).size(); - entity = createOneTable(dataNode); - int sizeDB2 = getNameTablesInDB(dataNode).size(); - assertEquals(1, sizeDB2 - sizeDB); - setStrategy(strategy, dataNode2); - dataNode2.performQueries(Collections.singletonList((Query) query), observer); - - } - catch (CayenneRuntimeException e) { - assertNotNull(e); - } - try { - dataNode2.performQueries(Collections.singletonList((Query) query), observer); - } - catch (CayenneRuntimeException e) { - assertNotNull(e); - } - finally { - - if (entity != null) { - - Collection<String> template2 = dataNode.getAdapter().dropTableStatements( - entity); - Iterator<String> it = template2.iterator(); - List<Query> list = new ArrayList<Query>(); - while (it.hasNext()) { - SQLTemplate q = new SQLTemplate(Object.class, it.next()); - list.add(q); - } - dataNode.performQueries(list, observer); - } - } - } - - private void tableExistfForThrowOnPartialAndMixStrategy(String strategy) - throws Exception { - - String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID"; - SQLTemplate query = new SQLTemplate(Object.class, template); - DataMap map = node.getEntityResolver().getDataMap("sus-map"); - MockOperationObserver observer = new MockOperationObserver(); - DataNode dataNode = createDataNode(map); - int sizeDB = getNameTablesInDB(dataNode).size(); - generateDBWithDBGeneratorStrategy(dataNode, query, observer); - int sizeDB2 = getNameTablesInDB(dataNode).size(); - assertEquals(2, sizeDB2 - sizeDB); - try { - DataNode dataNode2 = createDataNode(map); - setStrategy(strategy, dataNode2); - dataNode2.performQueries(Collections.singletonList((Query) query), observer); - } - finally { - dropTables(map, dataNode, observer); - } - - } - - private DbEntity createOneTable(DataNode dataNode) { - DataMap map = node.getEntityResolver().getDataMap("sus-map"); - Collection<DbEntity> ent = map.getDbEntities(); - DbEntity entity = ent.iterator().next(); - String template = dataNode.getAdapter().createTable(entity); - - SQLTemplate query = new SQLTemplate(Object.class, template); - MockOperationObserver observer = new MockOperationObserver(); +@UseServerRuntime(ServerCase.SUS_PROJECT) +public class SchemaUpdateStrategyIT extends SchemaUpdateStrategyBase { - setStrategy(null, dataNode); + public void testCreateIfNoSchemaStrategy() throws Exception { - dataNode.performQueries(Collections.singletonList((Query) query), observer); - return entity; - } + setStrategy(CreateIfNoSchemaStrategy.class); - private DataNode createDataNode(DataMap map) { - Collection<DataMap> colection = new ArrayList<DataMap>(); - colection.add(map); - DataNode dataNode = new DataNode(); - dataNode.setJdbcEventLogger(jdbcEventLogger); - dataNode.setDataMaps(colection); - dataNode.setAdapter(adapter); - dataNode.setDataSource(dataSourceFactory.getSharedDataSource()); - dataNode.setDataSourceFactory(node.getDataSourceFactory()); - dataNode.setSchemaUpdateStrategyName(node.getSchemaUpdateStrategyName()); - dataNode.setRowReaderFactory(node.getRowReaderFactory()); - dataNode.setBatchTranslatorFactory(node.getBatchTranslatorFactory()); - dataNode.setEntityResolver(new EntityResolver(colection)); - return dataNode; - } + String template = "SELECT #result('id' 'int') FROM SUS1"; + SQLTemplate query = new SQLTemplate(Object.class, template); - private void generateDBWithDBGeneratorStrategy( - DataNode dataNode, - SQLTemplate query, - MockOperationObserver observer) { + OperationObserver observer = new MockOperationObserver(); - setStrategy(CreateIfNoSchemaStrategy.class.getName(), dataNode); + node.performQueries(Collections.singletonList((Query) query), observer); + Map<String, Boolean> nameTables = tablesMap(); + assertTrue(nameTables.get("SUS1")); - dataNode.performQueries(Collections.singletonList((Query) query), observer); - Map<String, Boolean> nameTables = getNameTablesInDB(dataNode); - assertTrue(nameTables.get("sus1") != null || nameTables.get("SUS1") != null); + assertEquals(2, existingTables().size()); + node.performQueries(Collections.singletonList(query), observer); + assertEquals(2, existingTables().size()); + } - } + public void testNoStandardSchema() throws Exception { + String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID"; + SQLTemplate query = new SQLTemplate(Object.class, template); + MockOperationObserver observer = new MockOperationObserver(); - private void setStrategy(String name, DataNode dataNode) { - dataNode.setSchemaUpdateStrategyName(name); - try { - dataNode.setSchemaUpdateStrategy((SchemaUpdateStrategy) Class.forName( - dataNode.getSchemaUpdateStrategyName()).newInstance()); - } - catch (Exception e) { - throw new CayenneRuntimeException(e); - } - } + setStrategy(TstSchemaUpdateStrategy.class); - private void dropTables(DataMap map, DataNode dataNode, MockOperationObserver observer) { - Collection<DbEntity> ent = map.getDbEntities(); - Iterator<DbEntity> iterator = ent.iterator(); - while (iterator.hasNext()) { - Collection<String> collectionDrop = dataNode - .getAdapter() - .dropTableStatements(iterator.next()); - for (String s : collectionDrop) { - SQLTemplate queryDrop = new SQLTemplate(Object.class, s); - dataNode.performQueries( - Collections.singletonList((Query) queryDrop), - observer); - } - } - } + node.performQueries(Collections.singletonList((Query) query), observer); + assertTrue(node.getSchemaUpdateStrategy() instanceof TstSchemaUpdateStrategy); + } - private Map<String, Boolean> getNameTablesInDB(DataNode dataNode) { - String tableLabel = dataNode.getAdapter().tableTypeForTable(); - Connection con = null; - Map<String, Boolean> nameTables = new HashMap<String, Boolean>(); - try { - con = dataNode.getDataSource().getConnection(); - ResultSet rs = con.getMetaData().getTables(null, null, "%", new String[] { - tableLabel - }); - while (rs.next()) { - String name = rs.getString("TABLE_NAME"); - nameTables.put(name, false); - } - rs.close(); - } - catch (SQLException e) { - throw new CayenneRuntimeException(e); - } - finally { - try { - con.close(); - } - catch (SQLException e) { - throw new CayenneRuntimeException(e); - } - } - return nameTables; - } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/617628c7/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/ThrowOnPartialOrCreateSchemaStrategyTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/ThrowOnPartialOrCreateSchemaStrategyTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/ThrowOnPartialOrCreateSchemaStrategyTest.java new file mode 100644 index 0000000..138f131 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/ThrowOnPartialOrCreateSchemaStrategyTest.java @@ -0,0 +1,78 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.cayenne.access.dbsync; + +import static org.mockito.Mockito.mock; + +import java.util.Collections; +import java.util.Map; + +import org.apache.cayenne.CayenneRuntimeException; +import org.apache.cayenne.access.OperationObserver; +import org.apache.cayenne.query.SQLTemplate; +import org.apache.cayenne.unit.di.server.ServerCase; +import org.apache.cayenne.unit.di.server.UseServerRuntime; + +@UseServerRuntime(ServerCase.SUS_PROJECT) +public class ThrowOnPartialOrCreateSchemaStrategyTest extends SchemaUpdateStrategyBase { + + public void testMixedStrategyTableExist() throws Exception { + + createOneTable("SUS1"); + createOneTable("SUS2"); + + String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID"; + SQLTemplate query = new SQLTemplate(Object.class, template); + + setStrategy(ThrowOnPartialOrCreateSchemaStrategy.class); + node.performQueries(Collections.singletonList(query), mock(OperationObserver.class)); + } + + public void testMixedStrategyTableNoExist() throws Exception { + + String template = "SELECT #result('id' 'int') FROM SUS1"; + SQLTemplate query = new SQLTemplate(Object.class, template); + + setStrategy(ThrowOnPartialOrCreateSchemaStrategy.class); + + node.performQueries(Collections.singletonList(query), mock(OperationObserver.class)); + Map<String, Boolean> nameTables = tablesMap(); + assertTrue(nameTables.get("SUS1")); + assertEquals(2, existingTables().size()); + + node.performQueries(Collections.singletonList(query), mock(OperationObserver.class)); + assertEquals(2, existingTables().size()); + } + + public void testMixedStrategyWithOneTable() throws Exception { + createOneTable("SUS1"); + setStrategy(ThrowOnPartialOrCreateSchemaStrategy.class); + + String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID"; + SQLTemplate query = new SQLTemplate(Object.class, template); + + try { + node.performQueries(Collections.singletonList(query), mock(OperationObserver.class)); + assertEquals(1, existingTables().size()); + fail("Must have thrown on partial schema"); + } catch (CayenneRuntimeException e) { + // expected + } + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/617628c7/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/ThrowOnPartialSchemaStrategyTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/ThrowOnPartialSchemaStrategyTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/ThrowOnPartialSchemaStrategyTest.java new file mode 100644 index 0000000..383996a --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/dbsync/ThrowOnPartialSchemaStrategyTest.java @@ -0,0 +1,85 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.cayenne.access.dbsync; + +import java.util.Collections; + +import org.apache.cayenne.CayenneRuntimeException; +import org.apache.cayenne.access.MockOperationObserver; +import org.apache.cayenne.query.Query; +import org.apache.cayenne.query.SQLTemplate; +import org.apache.cayenne.unit.di.server.ServerCase; +import org.apache.cayenne.unit.di.server.UseServerRuntime; + +@UseServerRuntime(ServerCase.SUS_PROJECT) +public class ThrowOnPartialSchemaStrategyTest extends SchemaUpdateStrategyBase { + + public void testThrowOnPartialStrategyTableNoExist() throws Exception { + + String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID"; + SQLTemplate query = new SQLTemplate(Object.class, template); + MockOperationObserver observer = new MockOperationObserver(); + + setStrategy(ThrowOnPartialSchemaStrategy.class); + + try { + node.performQueries(Collections.singletonList((Query) query), observer); + } catch (CayenneRuntimeException e) { + assertNotNull(e); + } + + try { + node.performQueries(Collections.singletonList((Query) query), observer); + } catch (CayenneRuntimeException e) { + assertNotNull(e); + } + } + + public void testThrowOnPartialStrategyTableExist() throws Exception { + + String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID"; + SQLTemplate query = new SQLTemplate(Object.class, template); + MockOperationObserver observer = new MockOperationObserver(); + + createOneTable("SUS1"); + createOneTable("SUS2"); + + setStrategy(ThrowOnPartialSchemaStrategy.class); + node.performQueries(Collections.singletonList(query), observer); + } + + public void testThrowOnPartialStrategyWithOneTable() throws Exception { + createOneTable("SUS1"); + + setStrategy(ThrowOnPartialSchemaStrategy.class); + + String template = "SELECT #result('ARTIST_ID' 'int') FROM ARTIST ORDER BY ARTIST_ID"; + SQLTemplate query = new SQLTemplate(Object.class, template); + MockOperationObserver observer = new MockOperationObserver(); + + try { + node.performQueries(Collections.singletonList(query), observer); + assertEquals(1, existingTables().size()); + fail("Must have thrown on partial schema"); + } catch (CayenneRuntimeException e) { + // expected + } + } + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/617628c7/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCase.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCase.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCase.java index 0240cec..854f7cc 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCase.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCase.java @@ -25,31 +25,34 @@ import org.apache.cayenne.unit.di.DICase; public class ServerCase extends DICase { - // known runtimes... unit tests may reuse these with @UseServerRuntime annotation or - // can define their own on the fly (TODO: how would that work with the global schema - // setup?) - public static final String INHERTITANCE_SINGLE_TABLE1_PROJECT = "cayenne-inheritance-single-table1.xml"; - public static final String INHERTITANCE_VERTICAL_PROJECT = "cayenne-inheritance-vertical.xml"; - public static final String LOCKING_PROJECT = "cayenne-locking.xml"; - public static final String QUOTED_IDENTIFIERS_PROJECT = "cayenne-quoted-identifiers.xml"; - public static final String PEOPLE_PROJECT = "cayenne-people.xml"; - public static final String RELATIONSHIPS_PROJECT = "cayenne-relationships.xml"; - public static final String TESTMAP_PROJECT = "cayenne-testmap.xml"; - public static final String DEFAULT_PROJECT = "cayenne-default.xml"; - public static final String MULTINODE_PROJECT = "cayenne-multinode.xml"; - public static final String ONEWAY_PROJECT = "cayenne-oneway-rels.xml"; - public static final String MULTI_TIER_PROJECT = "cayenne-multi-tier.xml"; + // known runtimes... unit tests may reuse these with @UseServerRuntime + // annotation or + // can define their own on the fly (TODO: how would that work with the + // global schema + // setup?) + public static final String INHERTITANCE_SINGLE_TABLE1_PROJECT = "cayenne-inheritance-single-table1.xml"; + public static final String INHERTITANCE_VERTICAL_PROJECT = "cayenne-inheritance-vertical.xml"; + public static final String LOCKING_PROJECT = "cayenne-locking.xml"; + public static final String QUOTED_IDENTIFIERS_PROJECT = "cayenne-quoted-identifiers.xml"; + public static final String PEOPLE_PROJECT = "cayenne-people.xml"; + public static final String RELATIONSHIPS_PROJECT = "cayenne-relationships.xml"; + public static final String TESTMAP_PROJECT = "cayenne-testmap.xml"; + public static final String DEFAULT_PROJECT = "cayenne-default.xml"; + public static final String MULTINODE_PROJECT = "cayenne-multinode.xml"; + public static final String ONEWAY_PROJECT = "cayenne-oneway-rels.xml"; + public static final String MULTI_TIER_PROJECT = "cayenne-multi-tier.xml"; + public static final String SUS_PROJECT = "cayenne-sus.xml"; - private static final Injector injector; + private static final Injector injector; - static { - DefaultScope testScope = new DefaultScope(); - injector = DIBootstrap.createInjector(new ServerCaseModule(testScope)); - injector.getInstance(SchemaBuilder.class).rebuildSchema(); - } + static { + DefaultScope testScope = new DefaultScope(); + injector = DIBootstrap.createInjector(new ServerCaseModule(testScope)); + injector.getInstance(SchemaBuilder.class).rebuildSchema(); + } - @Override - protected Injector getUnitTestInjector() { - return injector; - } + @Override + protected Injector getUnitTestInjector() { + return injector; + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/617628c7/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java index 203d06d..6859f2f 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java @@ -27,8 +27,6 @@ import java.util.Set; import javax.sql.DataSource; -import org.apache.cayenne.configuration.DataNodeDescriptor; -import org.apache.cayenne.configuration.server.DataSourceFactory; import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.conn.PoolDataSource; import org.apache.cayenne.conn.PoolManager; http://git-wip-us.apache.org/repos/asf/cayenne/blob/617628c7/cayenne-server/src/test/resources/cayenne-default.xml ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/resources/cayenne-default.xml b/cayenne-server/src/test/resources/cayenne-default.xml index 8ef6d91..a248a10 100644 --- a/cayenne-server/src/test/resources/cayenne-default.xml +++ b/cayenne-server/src/test/resources/cayenne-default.xml @@ -3,5 +3,4 @@ <map name="embeddable"/> <map name="generic"/> <map name="qualified"/> - <map name="sus-map"/> </domain> http://git-wip-us.apache.org/repos/asf/cayenne/blob/617628c7/cayenne-server/src/test/resources/cayenne-sus.xml ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/resources/cayenne-sus.xml b/cayenne-server/src/test/resources/cayenne-sus.xml new file mode 100644 index 0000000..ff93d6c --- /dev/null +++ b/cayenne-server/src/test/resources/cayenne-sus.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<domain project-version="7"> + <map name="sus-map"/> +</domain>
