// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.metadata.managment;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.utils.VersionUtils;
import org.talend.core.context.Context;
import org.talend.core.context.RepositoryContext;
import org.talend.core.database.EDatabaseTypeName;
import org.talend.core.model.context.JobContextManager;
import org.talend.core.model.general.Project;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.metadata.builder.connection.ConnectionFactory;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.core.model.properties.ContextItem;
import org.talend.core.model.properties.DatabaseConnectionItem;
import org.talend.core.model.properties.PropertiesFactory;
import org.talend.core.model.properties.Property;
import org.talend.core.model.utils.ContextParameterUtils;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.cwm.helper.CatalogHelper;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.cwm.helper.SchemaHelper;
import org.talend.dataprofiler.core.helper.UnitTestBuildHelper;
import org.talend.designer.core.model.utils.emf.talendfile.ContextParameterType;
import org.talend.designer.core.model.utils.emf.talendfile.ContextType;
import org.talend.designer.core.model.utils.emf.talendfile.TalendFileFactory;
import org.talend.metadata.managment.ui.utils.ConnectionContextHelper;
import org.talend.metadata.managment.ui.utils.DBConnectionContextUtils;
import org.talend.metadata.managment.ui.utils.SwitchContextGroupNameImpl;
import org.talend.repository.ProjectManager;
import orgomg.cwm.resource.relational.Catalog;
import orgomg.cwm.resource.relational.Schema;
/**
* created by talend on Oct 30, 2012 Detailled comment
*
*/
public class SwitchContextGroupNameImplTest {
final static String dqTestProjectName = "testForContextGroupTDQ"; //$NON-NLS-1$
DatabaseConnectionItem createDatabaseConnectionItem = null;
ProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
String catalogOld = "oldCatalog"; //$NON-NLS-1$
String catalogNew = "newCatalog"; //$NON-NLS-1$
String schemaOld = "oldSchema"; //$NON-NLS-1$
String schemaNew = "newSchema"; //$NON-NLS-1$
String ContextTpeyNameOld = "default"; //$NON-NLS-1$
String ContextTpeyNameNew = "test"; //$NON-NLS-1$
String connectionName = "conn1"; //$NON-NLS-1$
String Connectionlabel = "";// ConnectionContextHelper.convertContextLabel(connectionName);// should be label of
// connection property when
// use
static int index = 0;
String prefixName = Connectionlabel + ConnectionContextHelper.LINE;
String paramNameCatalog = prefixName + DBConnectionContextUtils.EDBParamName.Database;
String contextCatalogName = ContextParameterUtils.JAVA_NEW_CONTEXT_PREFIX + paramNameCatalog;
String paramNameSchema = prefixName + DBConnectionContextUtils.EDBParamName.Schema;
String contextSchemaName = ContextParameterUtils.JAVA_NEW_CONTEXT_PREFIX + paramNameSchema;
private static Project currentProject;
/**
* DOC talend Comment method "setUp".
*
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
UnitTestBuildHelper.initProjectStructure(dqTestProjectName); //$NON-NLS-1$
createContextItem("contentName" + index++); //$NON-NLS-1$
Connectionlabel = ConnectionContextHelper.convertContextLabel(connectionName);
}
@BeforeClass
public static void recordCurrentProject() {
currentProject = ProjectManager.getInstance().getCurrentProject();
}
@AfterClass
public static void backToCurrentProject() throws Exception {
if (currentProject != null) {
ProxyRepositoryFactory.getInstance().logOffProject();
ProxyRepositoryFactory.getInstance().logOnProject(currentProject, null);
}
// clean test project
IProject testProject = ResourcesPlugin.getWorkspace().getRoot().getProject(dqTestProjectName.toUpperCase());
if (testProject.exists()) {
testProject.delete(true, null);
}
}
/**
* Test method for
* {@link org.talend.repository.ui.utils.SwitchContextGroupNameImpl#updateContextGroup(org.talend.core.model.properties.ConnectionItem)}
* . mysql case
*/
@Test
public void testUpdateContextGroupSuccessMysql() {
boolean updateContextGroup = SwitchContextGroupNameImpl.getInstance().updateContextGroup(createDatabaseConnectionItem,
ContextTpeyNameNew);
Connection connection = createDatabaseConnectionItem.getConnection();
List<Catalog> catalogs = ConnectionHelper.getCatalogs(connection);
assertTrue(updateContextGroup);
assertTrue(catalogs.size() == 1);
assertTrue(catalogs.get(0).getName().equalsIgnoreCase(catalogNew));
}
/**
* Test method for
* {@link org.talend.repository.ui.utils.SwitchContextGroupNameImpl#updateContextGroup(org.talend.core.model.properties.ConnectionItem)}
* . sqlserver case
*/
@Test
public void testUpdateContextGroupSuccessMssql() {
createCatalogSchema(schemaOld);
boolean updateContextGroup = SwitchContextGroupNameImpl.getInstance().updateContextGroup(createDatabaseConnectionItem,
ContextTpeyNameNew);
Connection connection = createDatabaseConnectionItem.getConnection();
List<Catalog> catalogs = ConnectionHelper.getCatalogs(connection);
List<Schema> schemas = CatalogHelper.getSchemas(catalogs.get(0));
assertTrue(updateContextGroup);
assertTrue(schemas.size() == 1);
assertTrue(schemas.get(0).getName().equalsIgnoreCase(schemaNew));
assertTrue(catalogs.size() == 1);
assertTrue(catalogs.get(0).getName().equalsIgnoreCase(catalogNew));
}
/**
* DOC talend Comment method "createSchema".
*
* @param schemaOld2
*/
private void createCatalogSchema(String schemaOld2) {
Connection connection = createDatabaseConnectionItem.getConnection();
((DatabaseConnection) connection).setUiSchema(this.contextSchemaName);
List<Catalog> catalogs = ConnectionHelper.getCatalogs(connection);
Catalog catalog = catalogs.get(0);
Schema createSchema = SchemaHelper.createSchema(schemaOld);
List<Schema> schemas = new ArrayList<Schema>();
schemas.add(createSchema);
CatalogHelper.addSchemas(schemas, catalog);
}
/**
* Test method for
* {@link org.talend.repository.ui.utils.SwitchContextGroupNameImpl#updateContextGroup(org.talend.core.model.properties.ConnectionItem)}
* . oracle case
*/
@Test
public void testUpdateContextGroupSuccessOracle() {
createSchema();
boolean updateContextGroup = SwitchContextGroupNameImpl.getInstance().updateContextGroup(createDatabaseConnectionItem,
ContextTpeyNameNew);
Connection connection = createDatabaseConnectionItem.getConnection();
List<Schema> schemas = ConnectionHelper.getSchema(connection);
assertTrue(updateContextGroup);
assertTrue(schemas.size() == 1);
assertTrue(schemas.get(0).getName().equalsIgnoreCase(schemaNew));
}
/**
* DOC talend Comment method "createSchema".
*/
private void createSchema() {
Connection connection = createDatabaseConnectionItem.getConnection();
((DatabaseConnection) connection).setUiSchema(this.contextSchemaName);
((DatabaseConnection) connection).setSID(null);
Schema createSchema = SchemaHelper.createSchema(schemaOld);
ConnectionHelper.addSchema(createSchema, connection);
ConnectionHelper.removeCatalogs(ConnectionHelper.getCatalogs(connection), connection);
}
/**
* Test method for
* {@link org.talend.repository.ui.utils.SwitchContextGroupNameImpl#updateContextGroup(org.talend.core.model.properties.ConnectionItem)}
* . fail1: createDatabaseConnectionItem is null will nothing to do and return false
*/
@Test
public void testUpdateContextGroupfail1() {
boolean updateContextGroup = SwitchContextGroupNameImpl.getInstance().updateContextGroup(null, ContextTpeyNameNew);
Connection connection = createDatabaseConnectionItem.getConnection();
List<Catalog> catalogs = ConnectionHelper.getCatalogs(connection);
assertFalse(updateContextGroup);
assertTrue(catalogs.size() == 1);
assertTrue(catalogs.get(0).getName().equalsIgnoreCase(catalogOld));
}
/**
* Test method for
* {@link org.talend.repository.ui.utils.SwitchContextGroupNameImpl#updateContextGroup(org.talend.core.model.properties.ConnectionItem)}
* . fail2: connection is null return false
*/
@Test
public void testUpdateContextGroupfail2() {
createDatabaseConnectionItem.setConnection(null);
boolean updateContextGroup = SwitchContextGroupNameImpl.getInstance().updateContextGroup(createDatabaseConnectionItem,
ContextTpeyNameNew);
assertFalse(updateContextGroup);
}
/**
* Test method for
* {@link org.talend.repository.ui.utils.SwitchContextGroupNameImpl#updateContextGroup(org.talend.core.model.properties.ConnectionItem)}
* . fail3: the Connection type is ODBC case
*/
@Test
public void testUpdateContextGroupSuccessODBC() {
((DatabaseConnection) createDatabaseConnectionItem.getConnection()).setDatabaseType(EDatabaseTypeName.GODBC.getXmlName());
boolean updateContextGroup = SwitchContextGroupNameImpl.getInstance().updateContextGroup(createDatabaseConnectionItem,
ContextTpeyNameNew);
Connection connection = createDatabaseConnectionItem.getConnection();
List<Catalog> catalogs = ConnectionHelper.getCatalogs(connection);
assertTrue(updateContextGroup);
assertTrue(catalogs.size() == 1);
assertTrue(catalogs.get(0).getName().equalsIgnoreCase(catalogNew));
}
/**
* Test method for
* {@link org.talend.repository.ui.utils.SwitchContextGroupNameImpl#updateContextGroup(org.talend.core.model.properties.ConnectionItem)}
* . fail4: the Connection type is GENERAL_JDBC case
*/
@Test
public void testUpdateContextGroupSuccessGeneralJdbc() {
((DatabaseConnection) createDatabaseConnectionItem.getConnection()).setDatabaseType(EDatabaseTypeName.GENERAL_JDBC
.getXmlName());
boolean updateContextGroup = SwitchContextGroupNameImpl.getInstance().updateContextGroup(createDatabaseConnectionItem,
ContextTpeyNameNew);
Connection connection = createDatabaseConnectionItem.getConnection();
List<Catalog> catalogs = ConnectionHelper.getCatalogs(connection);
assertTrue(updateContextGroup);
assertTrue(catalogs.size() == 1);
assertTrue(catalogs.get(0).getName().equalsIgnoreCase(catalogNew));
}
private void createConnectionItem(String name, IFolder folder, Boolean isDelete) {
IPath createPath = Path.EMPTY;
if (folder != null) {
createPath = new Path(folder.getFullPath().lastSegment());
}
// connection
DatabaseConnection createConnection = ConnectionFactory.eINSTANCE.createDatabaseConnection();
createConnection.setName(name);
createConnection.setUsername("UserName"); //$NON-NLS-1$
createConnection.setRawPassword("Password"); //$NON-NLS-1$
createConnection.setURL("URL"); //$NON-NLS-1$
createConnection.setDatabaseType(EDatabaseTypeName.MYSQL.getXmlName());
createConnection.setContextMode(true);
createConnection.setContextName(ContextTpeyNameOld);
// ~connection
createDatabaseConnectionItem = PropertiesFactory.eINSTANCE.createDatabaseConnectionItem();
org.talend.core.model.properties.Property createDatabaseConnectionProperty = PropertiesFactory.eINSTANCE.createProperty();
createDatabaseConnectionProperty.setId(EcoreUtil.generateUUID());
createDatabaseConnectionProperty.setItem(createDatabaseConnectionItem);
createDatabaseConnectionProperty.setLabel(createConnection.getName());
createDatabaseConnectionItem.setProperty(createDatabaseConnectionProperty);
createDatabaseConnectionItem.setConnection(createConnection);
try {
factory.create(createDatabaseConnectionItem, createPath, false);
} catch (PersistenceException e) {
Assert.fail(e.getMessage());
}
}
public void createContextItem(String name) throws PersistenceException {
// ContextType--default
ContextType createContextDefault = TalendFileFactory.eINSTANCE.createContextType();
createContextDefault.setName(ContextTpeyNameOld);
ContextParameterType createContextParameterTypeForDefault = TalendFileFactory.eINSTANCE.createContextParameterType();
createContextParameterTypeForDefault.setName(paramNameCatalog);
createContextParameterTypeForDefault.setValue(catalogOld);
createContextDefault.getContextParameter().add(createContextParameterTypeForDefault);
createContextParameterTypeForDefault = TalendFileFactory.eINSTANCE.createContextParameterType();
createContextParameterTypeForDefault.setName(paramNameSchema);
createContextParameterTypeForDefault.setValue(schemaOld);
createContextDefault.getContextParameter().add(createContextParameterTypeForDefault);
// ~ContextType--default
// ContextType--test
ContextType createContextTest = TalendFileFactory.eINSTANCE.createContextType();
createContextTest.setName(ContextTpeyNameNew);
createContextParameterTypeForDefault = TalendFileFactory.eINSTANCE.createContextParameterType();
createContextParameterTypeForDefault.setName(paramNameCatalog);
createContextParameterTypeForDefault.setValue(catalogNew);
createContextTest.getContextParameter().add(createContextParameterTypeForDefault);
createContextParameterTypeForDefault = TalendFileFactory.eINSTANCE.createContextParameterType();
createContextParameterTypeForDefault.setName(paramNameSchema);
createContextParameterTypeForDefault.setValue(schemaNew);
createContextTest.getContextParameter().add(createContextParameterTypeForDefault);
// ~ContextType--test
// ConntextItem
ContextItem contextItem = PropertiesFactory.eINSTANCE.createContextItem();
Property contextProperty = PropertiesFactory.eINSTANCE.createProperty();
contextProperty.setAuthor(((RepositoryContext) CoreRuntimePlugin.getInstance().getContext()
.getProperty(Context.REPOSITORY_CONTEXT_KEY)).getUser());
contextProperty.setVersion(VersionUtils.DEFAULT_VERSION);
contextProperty.setStatusCode(""); //$NON-NLS-1$
contextProperty.setLabel(name);
contextItem.setProperty(contextProperty);
JobContextManager contextManager = new JobContextManager();
String nextId = factory.getNextId();
contextProperty.setId(nextId);
contextProperty.setLabel(contextProperty.getDisplayName());
contextManager.saveToEmf(contextItem.getContext());
contextItem.setDefaultContext(contextManager.getDefaultContext().getName());
contextItem.getContext().clear();
contextItem.getContext().add(createContextDefault);
contextItem.getContext().add(createContextTest);
factory.create(contextItem, Path.EMPTY);
// ContextItem
// connection
createConnectionItem(connectionName, null, false);
Connection connection = createDatabaseConnectionItem.getConnection();
connection.setContextId(contextProperty.getId());
createCatalog(catalogOld);
// ~connection data
}
/**
* DOC talend Comment method "createCatalog".
*
* @param catalogName
*/
private void createCatalog(String catalogName) {
Connection connection = createDatabaseConnectionItem.getConnection();
Catalog createCatalog = CatalogHelper.createCatalog(catalogOld);
ConnectionHelper.addCatalog(createCatalog, connection);
((DatabaseConnection) connection).setSID(contextCatalogName);
}
}