// ============================================================================
//
// 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.dataprofiler.core.ui.action.actions;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.junit.Test;
import org.powermock.api.mockito.PowerMockito;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.database.EDatabaseTypeName;
import org.talend.core.model.general.Project;
import org.talend.core.model.metadata.IMetadataConnection;
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.DatabaseConnectionItem;
import org.talend.core.model.properties.PropertiesFactory;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.cwm.helper.CatalogHelper;
import org.talend.cwm.helper.ColumnSetHelper;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.cwm.helper.SchemaHelper;
import org.talend.repository.localprovider.model.LocalRepositoryFactory;
import orgomg.cwm.objectmodel.core.Package;
import orgomg.cwm.resource.relational.Catalog;
import orgomg.cwm.resource.relational.Schema;
/**
* created by zshen on Apr 23, 2013 Detailled comment
*
*/
public class ExportConnectionToTOSActionRealTest {
private static LocalRepositoryFactory repositoryFactory;
private static ProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
private static Project originalProject;
private static ExportConnectionToTOSAction createAction = null;
private static Catalog catalog1 = null;
private static Catalog catalog2 = null;
private static Catalog catalog3 = null;
private static Catalog catalog4 = null;
private static Catalog catalog5 = null;
private static Schema schema1 = null;
private static Schema schema2 = null;
Logger log = Logger.getLogger(ExportConnectionToTOSActionRealTest.class);
private static Catalog addCataPackage(String packageName, DatabaseConnectionItem connItem) throws PersistenceException {
Connection connection = connItem.getConnection();
Catalog createCatalog = CatalogHelper.createCatalog(packageName);
ConnectionHelper.addCatalog(createCatalog, connection);
return createCatalog;
}
private static DatabaseConnectionItem createConnectionItem(String name, IFolder folder, Boolean isDelete, boolean isSave) {
IPath createPath = Path.EMPTY;
if (folder != null) {
createPath = new Path(folder.getFullPath().lastSegment());
}
// connection
DatabaseConnection createConnection = ConnectionFactory.eINSTANCE.createDatabaseConnection();
createConnection.setName(name);
createConnection.setLabel(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);
// ~connection
DatabaseConnectionItem 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 {
if (isSave) {
factory.create(createDatabaseConnectionItem, createPath, false);
}
} catch (PersistenceException e) {
Assert.fail(e.getMessage());
}
return createDatabaseConnectionItem;
}
/**
* DOC zshen Comment method "initPackageList".
*
* @param packageList
* @throws PersistenceException
*/
private static void initCatalogList(DatabaseConnectionItem createConnectionItem) throws PersistenceException {
catalog1 = addCataPackage("catalog1", createConnectionItem); //$NON-NLS-1$
catalog2 = addCataPackage("catalog2", createConnectionItem); //$NON-NLS-1$
catalog3 = addCataPackage("catalog3", createConnectionItem); //$NON-NLS-1$
catalog4 = addCataPackage("catalog4", createConnectionItem); //$NON-NLS-1$
catalog5 = addCataPackage("catalog5", createConnectionItem); //$NON-NLS-1$
factory.save(createConnectionItem, null);
}
/**
* DOC zshen Comment method "initPackageList".
*
* @param packageList
* @throws PersistenceException
*/
private static void initSchemaOfCagalogList(DatabaseConnectionItem createConnectionItem) throws PersistenceException {
schema1 = addSchePackage("schema1", catalog1); //$NON-NLS-1$
schema2 = addSchePackage("schema2", catalog2); //$NON-NLS-1$
factory.save(createConnectionItem, null);
}
/**
* DOC zshen Comment method "initPackageList".
*
* @param packageList
* @throws PersistenceException
*/
private static void initSchemaList(DatabaseConnectionItem createConnectionItem) throws PersistenceException {
schema1 = addSchePackage("schema1", (DatabaseConnection) createConnectionItem.getConnection()); //$NON-NLS-1$
schema2 = addSchePackage("schema2", (DatabaseConnection) createConnectionItem.getConnection()); //$NON-NLS-1$
factory.save(createConnectionItem, null);
}
/**
* DOC zshen Comment method "addSchePackage".
*
* @param string
* @param catalog1
* @return
*/
private static Schema addSchePackage(String schemaName, Catalog catalog1) {
Schema createSchema = SchemaHelper.createSchema(schemaName);
CatalogHelper.addSchemas(createSchema, catalog1);
return createSchema;
}
/**
* DOC zshen Comment method "addSchePackage".
*
* @param string
* @param catalog1
* @return
*/
private static Schema addSchePackage(String schemaName, DatabaseConnection conn) {
Schema createSchema = SchemaHelper.createSchema(schemaName);
ConnectionHelper.addSchema(createSchema, conn);
return createSchema;
}
/**
* Test method for {@link org.talend.dataprofiler.core.ui.action.actions.ExportConnectionToTOSAction#run()}.
*
* @throws PersistenceException
*
* case1: create new connection from catalog case
*/
@Test
public void testRuncase1() throws PersistenceException {
// connectionNode
DatabaseConnectionItem createOldConnectionItem = createConnectionItem(
"ExportConnectionToTOSActionRealTest1", null, false, true); //$NON-NLS-1$
Assert.assertTrue(createOldConnectionItem.getConnection() != null);
Assert.assertTrue(createOldConnectionItem.getConnection().eResource() != null);
Assert.assertTrue(!createOldConnectionItem.getConnection().eIsProxy());
IRepositoryViewObject createdByUs = factory.getLastVersion(createOldConnectionItem.getProperty().getId());
Assert.assertTrue(createdByUs != null);
Assert.assertTrue("ExportConnectionToTOSActionRealTest1".equals(createdByUs.getLabel())); //$NON-NLS-1$
initCatalogList(createOldConnectionItem);
// ~connectionNode
List<Package> packageList = new ArrayList<Package>();
packageList.add(catalog1);
createAction = PowerMockito.spy(new ExportConnectionToTOSAction(packageList));
PowerMockito.doNothing().when(createAction).openSuccessInformation();
PowerMockito.doNothing().when(createAction).refreshViewerAndNode();
createAction.run();
IRepositoryViewObject createByAction = getNewCreatedConnectionByName(createOldConnectionItem.getConnection().getLabel()
+ "_" + catalog1.getName()); //$NON-NLS-1$
Assert.assertTrue(createByAction != null);
DatabaseConnectionItem item = (DatabaseConnectionItem) createByAction.getProperty().getItem();
Connection newConnection = item.getConnection();
Catalog exportedCatalog = CatalogHelper.getCatalog(newConnection, catalog1.getName());
Assert.assertTrue(newConnection.getLabel().equals(
createOldConnectionItem.getConnection().getLabel() + "_" + catalog1.getName())); //$NON-NLS-1$
Assert.assertTrue(exportedCatalog != null);
Assert.assertTrue(exportedCatalog != catalog1);
factory.deleteObjectPhysical(createByAction);
factory.deleteObjectPhysical(createdByUs);
}
/**
* DOC zshen Comment method "getNewCreatedConnectionByName".
*
* @param string
* @throws PersistenceException
*/
private IRepositoryViewObject getNewCreatedConnectionByName(String NewConnectionLabel) throws PersistenceException {
List<IRepositoryViewObject> all = factory.getAll(ERepositoryObjectType.METADATA_CONNECTIONS, false);
Assert.assertTrue(all != null);
for (IRepositoryViewObject conn : all) {
if (NewConnectionLabel.equalsIgnoreCase(conn.getLabel())) {
return conn;
}
}
return null;
}
/**
* Test method for {@link org.talend.dataprofiler.core.ui.action.actions.ExportConnectionToTOSAction#run()}.
*
* @throws PersistenceException
*
* case2: create new connection from schema below catalog case
*/
@Test
public void testRuncase2() throws PersistenceException {
// connectionNode
DatabaseConnectionItem createOldConnectionItem = createConnectionItem(
"ExportConnectionToTOSActionRealTest2", null, false, true); //$NON-NLS-1$
initCatalogList(createOldConnectionItem);
initSchemaOfCagalogList(createOldConnectionItem);
IRepositoryViewObject createdByUs = factory.getLastVersion(createOldConnectionItem.getProperty().getId());
Assert.assertTrue(createdByUs != null);
Assert.assertTrue("ExportConnectionToTOSActionRealTest2".equals(createdByUs.getLabel())); //$NON-NLS-1$
// ~connectionNode
List<Package> packageList = new ArrayList<Package>();
packageList.add(schema1);
createAction = PowerMockito.spy(new ExportConnectionToTOSAction(packageList));
PowerMockito.doNothing().when(createAction).openSuccessInformation();
PowerMockito.doNothing().when(createAction).refreshViewerAndNode();
createAction.run();
IRepositoryViewObject createByAction = getNewCreatedConnectionByName(createOldConnectionItem.getConnection().getLabel()
+ "_" + schema1.getName()); //$NON-NLS-1$
DatabaseConnectionItem item = (DatabaseConnectionItem) createByAction.getProperty().getItem();
Connection newConnection = item.getConnection();
Catalog exportedCatalog = CatalogHelper.getCatalog(newConnection, catalog1.getName());
Assert.assertTrue(exportedCatalog != null);
Assert.assertTrue(newConnection.getLabel().equals(
createOldConnectionItem.getConnection().getLabel() + "_" + schema1.getName())); //$NON-NLS-1$
Assert.assertTrue(exportedCatalog != catalog1);
factory.deleteObjectPhysical(createByAction);
factory.deleteObjectPhysical(createdByUs);
}
/**
* Test method for {@link org.talend.dataprofiler.core.ui.action.actions.ExportConnectionToTOSAction#run()}.
*
* @throws PersistenceException
*
* case3: create new connection from only schema case
*/
@Test
public void testRuncase3() throws PersistenceException {
// connectionNode
DatabaseConnectionItem createOldConnectionItem = createConnectionItem(
"ExportConnectionToTOSActionRealTest3", null, false, true); //$NON-NLS-1$
DatabaseConnection oldConnection = ((DatabaseConnection) createOldConnectionItem.getConnection());
oldConnection.setSID("orcl"); //$NON-NLS-1$
initSchemaList(createOldConnectionItem);
IRepositoryViewObject createdByUs = factory.getLastVersion(createOldConnectionItem.getProperty().getId());
Assert.assertTrue(createdByUs != null);
Assert.assertTrue("ExportConnectionToTOSActionRealTest3".equals(createdByUs.getLabel())); //$NON-NLS-1$
// ~connectionNode
List<Package> packageList = new ArrayList<Package>();
packageList.add(schema1);
createAction = PowerMockito.spy(new ExportConnectionToTOSAction(packageList));
PowerMockito.doNothing().when(createAction).openSuccessInformation();
PowerMockito.doNothing().when(createAction).refreshViewerAndNode();
createAction.run();
IRepositoryViewObject createByAction = getNewCreatedConnectionByName(createOldConnectionItem.getConnection().getLabel()
+ "_" + schema1.getName()); //$NON-NLS-1$
DatabaseConnectionItem item = (DatabaseConnectionItem) createByAction.getProperty().getItem();
DatabaseConnection newConnection = (DatabaseConnection) item.getConnection();
Assert.assertTrue(newConnection.getSID().equalsIgnoreCase(oldConnection.getSID()));
Assert.assertTrue(newConnection.getUiSchema().equalsIgnoreCase(schema1.getName()));
Schema exportedSchema = SchemaHelper.getSchema(newConnection, schema1.getName());
Assert.assertTrue(exportedSchema != null);
Assert.assertTrue(newConnection.getLabel().equals(
createOldConnectionItem.getConnection().getLabel() + "_" + schema1.getName())); //$NON-NLS-1$
Assert.assertTrue(exportedSchema != schema1);
factory.deleteObjectPhysical(createByAction);
factory.deleteObjectPhysical(createdByUs);
}
class MetadataConnectionMatcher extends BaseMatcher<IMetadataConnection> {
private Package comparePackage = null;
public MetadataConnectionMatcher(Package comparePackage) {
this.comparePackage = comparePackage;
}
/*
* (non-Javadoc)
*
* @see org.hamcrest.Matcher#matches(java.lang.Object)
*/
@Override
public boolean matches(Object item) {
if (comparePackage == null || !(item instanceof IMetadataConnection)) {
return false;
}
DatabaseConnection connection = (DatabaseConnection) ConnectionHelper.getConnection(comparePackage);
String compareLabel = connection.getName() + "_" + comparePackage.getName(); //$NON-NLS-1$
String compareUiSchema = ""; //$NON-NLS-1$
String compareDatabase = comparePackage.getName();
if (comparePackage instanceof Schema) {
Package parent = ColumnSetHelper.getParentCatalogOrSchema(comparePackage);
if (parent != null) {
compareDatabase = parent.getName();
} else {
compareDatabase = connection.getSID();
}
compareUiSchema = comparePackage.getName();
}
IMetadataConnection metadataConneciton = (IMetadataConnection) item;
if (!compareLabel.equalsIgnoreCase(metadataConneciton.getLabel())) {
return false;
}
if (!compareDatabase.equalsIgnoreCase(metadataConneciton.getDatabase())) {
return false;
}
if (!compareUiSchema.equalsIgnoreCase(metadataConneciton.getUiSchema())) {
return false;
}
return true;
}
/*
* (non-Javadoc)
*
* @see org.hamcrest.SelfDescribing#describeTo(org.hamcrest.Description)
*/
@Override
public void describeTo(Description description) {
// TODO Auto-generated method stub
}
}
}