/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* 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 Affero 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/>.
*/
package org.kuali.kfs.sys.dataaccess;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.context.KualiTestBase;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.framework.persistence.platform.OracleDatabasePlatform;
@ConfigureContext
public class MismatchedForeignKeyTest extends KualiTestBase {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(MismatchedForeignKeyTest.class);
protected UnitTestSqlDao unitTestSqlDao = null;
public MismatchedForeignKeyTest() {
super();
}
@Override
protected void setUp() throws Exception {
super.setUp();
LOG.debug("setUp() starting");
unitTestSqlDao = SpringContext.getBean(UnitTestSqlDao.class);
}
/**
* TODO: Remove once other tests are fixed
*/
public void testNothing() {
}
/**
* select occurrences where foreign key columns do not match the parent columns in data types or sizes.
* TODO: Fix test once Jira KFSMI-5132 is resolved
*/
public void NORUN_testExistingMismatchedForeignKeys() {
if ( unitTestSqlDao.getDbPlatform() instanceof OracleDatabasePlatform ) {
final List rows = unitTestSqlDao.sqlSelect("SELECT c.table_name AS child_table_name, cc.column_name AS child_column_name, " +
"rc.table_name AS parent_table_name, rcc.column_name AS parent_column_name, " +
"DECODE( cols.data_type, 'NUMBER', DECODE( cols.data_precision, NULL, cols.data_type, " +
"cols.data_type||'('||cols.DATA_PRECISION||','||cols.DATA_SCALE||')' ), 'CHAR', cols.data_type||'('||cols.data_length||')', " +
"'VARCHAR2', cols.data_type||'('||cols.data_length||')', cols.data_type ) AS child_data_type, " +
"DECODE( cols.data_type, 'NUMBER', DECODE( rcols.data_precision, NULL, rcols.data_type, " +
"rcols.data_type||'('||rcols.DATA_PRECISION||','||rcols.DATA_SCALE||')' ), " +
"'CHAR', rcols.data_type||'('||rcols.data_length||')', 'VARCHAR2', rcols.data_type||'('||rcols.data_length||')', " +
"rcols.data_type ) AS parent_data_type " +
"FROM user_constraints c, user_constraints rc, user_cons_columns cc, user_cons_columns rcc, user_tab_columns cols, user_tab_columns rcols " +
"WHERE c.constraint_type = 'R' AND cc.constraint_name = c.constraint_name AND rcc.constraint_name = c.r_constraint_name " +
"AND rcc.position = cc.position AND cols.table_name = c.table_name AND cols.column_name = cc.column_name " +
"AND rc.constraint_name = c.r_constraint_name AND rcols.table_name = rc.table_name AND rcols.column_name = rcc.column_name " +
"AND ( cols.data_type <> rcols.data_type OR NVL( cols.data_length, 0 ) <> NVL( rcols.data_length, 0 ) " +
"OR NVL( cols.data_precision, 0 ) <> NVL( rcols.data_precision, 0 ) OR NVL( cols.data_scale, 0 ) <> NVL( rcols.data_scale, 0 ))\n" +
"AND c.table_name NOT LIKE 'NOTIFICATION%'"
);
StringBuffer failureMessage = new StringBuffer("Foreign Key Mismatches: ");
if (rows.size() > 0) {
for (Iterator iter = rows.iterator(); iter.hasNext();) {
Map element = (Map) iter.next();
failureMessage.append("\n\tCHILD table/column/data-type: ");
failureMessage.append(element.get("CHILD_TABLE_NAME")).append("/").append(element.get("CHILD_COLUMN_NAME")).append("/").append(element.get("CHILD_DATA_TYPE"));
failureMessage.append(" -- PARENT table/column/data-type: ");
failureMessage.append(element.get("PARENT_TABLE_NAME")).append("/").append(element.get("PARENT_COLUMN_NAME")).append("/").append(element.get("PARENT_DATA_TYPE"));
}
failureMessage.append("\n");
}
assertEquals(failureMessage.toString(), 0, rows.size());
} else {
System.err.println( "Unable to test as no SQL available to test for this platform.");
}
}
}