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>

Reply via email to