/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, version 2 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 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 General Public License for more details.
*
*
* Copyright 2006 - 2016 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.aggdes.ui;
import static org.pentaho.aggdes.test.util.TestUtils.getTestProperty;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.pentaho.aggdes.test.algorithm.impl.SchemaStub;
import org.pentaho.aggdes.ui.ext.impl.MondrianFileSchemaModel;
import org.pentaho.aggdes.ui.form.controller.ConnectionController;
import org.pentaho.aggdes.ui.form.controller.MainController;
import org.pentaho.aggdes.ui.form.model.ConnectionModelImpl;
import org.pentaho.aggdes.ui.model.AggList;
import org.pentaho.aggdes.ui.util.SerializationService;
import org.pentaho.aggdes.ui.xulstubs.XulDomContainerStub;
import org.pentaho.aggdes.ui.xulstubs.XulFileDialogStub;
import org.pentaho.aggdes.ui.xulstubs.XulMessageBoxStub;
import org.pentaho.di.core.KettleClientEnvironment;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.ui.xul.XulDomContainer;
import org.pentaho.ui.xul.XulException;
import org.pentaho.ui.xul.components.XulFileDialog.RETURN_CODE;
public class MainControllerTest extends TestCase {
public void setUp() {
try {
KettleClientEnvironment.init();
} catch (Exception e) {
e.printStackTrace();
}
XulMessageBoxStub.openedMessageBoxes.clear();
XulMessageBoxStub.returnCode = 0;
XulFileDialogStub.returnFile = null;
}
public void testSaveWorkspace() throws Exception {
// INITIAL STUB WIRING
Workspace workspace = new Workspace();
SchemaStub schemaStub = new SchemaStub();
ConnectionModelImpl connectionModel = new ConnectionModelImpl();
connectionModel.setDatabaseMeta(new DatabaseMeta());
MondrianFileSchemaModel schemaModel = new MondrianFileSchemaModel();
schemaModel.setMondrianSchemaFilename(getTestProperty("test.mondrian.foodmart.connectString.catalog"));
connectionModel.setSelectedSchemaModel(schemaModel);
connectionModel.setCubeName("Sales");
AggList aggList = SerializationServiceTest.getAggList(schemaStub);
SerializationService serializationService = new SerializationService();
serializationService.setConnectionModel(connectionModel);
serializationService.setAggList(aggList);
workspace.setSchema(schemaStub);
XulDomContainer xulDomContainer = new XulDomContainerStub();
MainController controller = new MainController();
controller.setXulDomContainer(xulDomContainer);
controller.setWorkspace(workspace);
controller.setConnectionModel(connectionModel);
controller.setSerializationService(serializationService);
// TEST 1 - App Locked
workspace.setWorkspaceUpToDate(false);
workspace.setApplicationUnlocked(false);
controller.saveWorkspace(false);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 1);
assertTrue(XulMessageBoxStub.openedMessageBoxes.get(0).getMessage().indexOf("Cannot save") >= 0);
// makes sure we didn't make it past where we were
assertFalse(workspace.getWorkspaceUpToDate());
// TEST 2 - User Cancels In File Dialog
XulMessageBoxStub.openedMessageBoxes.clear();
XulFileDialogStub.openedFileDialogs.clear();
XulFileDialogStub.returnCode = RETURN_CODE.CANCEL;
workspace.setApplicationUnlocked(true);
controller.saveWorkspace(false);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 0);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 1);
assertFalse(workspace.getWorkspaceUpToDate());
// TEST 3 - Save Design
XulMessageBoxStub.openedMessageBoxes.clear();
XulFileDialogStub.openedFileDialogs.clear();
XulFileDialogStub.returnCode = RETURN_CODE.OK;
XulFileDialogStub.returnFile = new File("temp_design_output.xml");
if (XulFileDialogStub.returnFile.exists()) {
XulFileDialogStub.returnFile.delete();
}
controller.saveWorkspace(false);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 0);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 1);
assertEquals(workspace.getWorkspaceLocation(), XulFileDialogStub.returnFile);
assertTrue(workspace.getWorkspaceUpToDate());
assertTrue(XulFileDialogStub.returnFile.exists());
// TEST 4 - Save without File Dialog, already has save location
XulMessageBoxStub.openedMessageBoxes.clear();
XulFileDialogStub.openedFileDialogs.clear();
if (XulFileDialogStub.returnFile.exists()) {
XulFileDialogStub.returnFile.delete();
}
controller.saveWorkspace(false);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 0);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 0);
assertEquals(workspace.getWorkspaceLocation(), XulFileDialogStub.returnFile);
assertTrue(workspace.getWorkspaceUpToDate());
assertTrue(XulFileDialogStub.returnFile.exists());
// TEST 5 - Save As
XulMessageBoxStub.openedMessageBoxes.clear();
XulFileDialogStub.openedFileDialogs.clear();
XulFileDialogStub.returnCode = RETURN_CODE.OK;
XulFileDialogStub.returnFile = new File("temp_design_output.xml");
if (XulFileDialogStub.returnFile.exists()) {
XulFileDialogStub.returnFile.delete();
}
controller.saveWorkspace(true);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 0);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 1);
assertEquals(workspace.getWorkspaceLocation(), XulFileDialogStub.returnFile);
assertTrue(workspace.getWorkspaceUpToDate());
assertTrue(XulFileDialogStub.returnFile.exists());
// TEST 6 - Save to Directory
workspace.setWorkspaceLocation(null);
workspace.setWorkspaceUpToDate(false);
XulMessageBoxStub.openedMessageBoxes.clear();
XulFileDialogStub.openedFileDialogs.clear();
XulFileDialogStub.returnCode = RETURN_CODE.OK;
XulFileDialogStub.returnFile = new File(".");
controller.saveWorkspace(false);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 1);
assertTrue(XulMessageBoxStub.openedMessageBoxes.get(0).getMessage().indexOf("Failed") >= 0);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 1);
assertNull(workspace.getWorkspaceLocation());
assertFalse(workspace.getWorkspaceUpToDate());
}
public void testPromptIfSaveRequired() throws XulException {
// INITIAL STUB WIRING
Workspace workspace = new Workspace();
SchemaStub schemaStub = new SchemaStub();
ConnectionModelImpl connectionModel = new ConnectionModelImpl();
connectionModel.setDatabaseMeta(new DatabaseMeta());
MondrianFileSchemaModel schemaModel = new MondrianFileSchemaModel();
schemaModel.setMondrianSchemaFilename(getTestProperty("test.mondrian.foodmart.connectString.catalog"));
connectionModel.setSelectedSchemaModel(schemaModel);
connectionModel.setCubeName("Sales");
AggList aggList = SerializationServiceTest.getAggList(schemaStub);
SerializationService serializationService = new SerializationService();
serializationService.setConnectionModel(connectionModel);
serializationService.setAggList(aggList);
workspace.setSchema(schemaStub);
XulDomContainer xulDomContainer = new XulDomContainerStub();
MainController controller = new MainController();
controller.setXulDomContainer(xulDomContainer);
controller.setWorkspace(workspace);
controller.setConnectionModel(connectionModel);
controller.setSerializationService(serializationService);
// Test 1 - No Prompt Necessary
XulMessageBoxStub.openedMessageBoxes.clear();
XulFileDialogStub.openedFileDialogs.clear();
workspace.setApplicationUnlocked(false);
workspace.setWorkspaceUpToDate(false);
boolean rtnValue = controller.promptIfSaveRequired();
assertEquals(rtnValue, true);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 0);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 0);
// Test 2 - Still No Prompt Necessary
workspace.setApplicationUnlocked(false);
workspace.setWorkspaceUpToDate(true);
rtnValue = controller.promptIfSaveRequired();
assertEquals(rtnValue, true);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 0);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 0);
// Test 3 - Still No Prompt Necessary
workspace.setApplicationUnlocked(true);
workspace.setWorkspaceUpToDate(true);
rtnValue = controller.promptIfSaveRequired();
assertEquals(rtnValue, true);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 0);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 0);
// Test 4 - Prompt Necessary, Cancel
workspace.setApplicationUnlocked(true);
workspace.setWorkspaceUpToDate(false);
XulMessageBoxStub.returnCode = 2;
rtnValue = controller.promptIfSaveRequired();
assertEquals(rtnValue, false);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 1);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 0);
// Test 4 - Prompt Necessary, Don't Save
XulMessageBoxStub.openedMessageBoxes.clear();
workspace.setApplicationUnlocked(true);
workspace.setWorkspaceUpToDate(false);
XulMessageBoxStub.returnCode = 1;
rtnValue = controller.promptIfSaveRequired();
assertEquals(rtnValue, true);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 1);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 0);
// Test 5 - Prompt Necessary, Save (Cancel)
XulMessageBoxStub.openedMessageBoxes.clear();
workspace.setApplicationUnlocked(true);
workspace.setWorkspaceUpToDate(false);
XulMessageBoxStub.returnCode = 0;
XulFileDialogStub.returnCode = RETURN_CODE.OK;
rtnValue = controller.promptIfSaveRequired();
assertEquals(rtnValue, false);
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 2);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 1);
}
public void testOpenWorkspace() throws XulException {
// INITIAL STUB WIRING
Workspace workspace = new Workspace();
final SchemaStub schemaStub = new SchemaStub();
final ConnectionModelImpl connectionModel = new ConnectionModelImpl();
connectionModel.setDatabaseMeta(new DatabaseMeta());
MondrianFileSchemaModel schemaModel = new MondrianFileSchemaModel();
schemaModel.setMondrianSchemaFilename(getTestProperty("test.mondrian.foodmart.connectString.catalog"));
connectionModel.setSelectedSchemaModel(schemaModel);
connectionModel.setCubeName("Sales");
AggList aggList = SerializationServiceTest.getAggList(schemaStub);
SerializationService serializationService = new SerializationService();
serializationService.setConnectionModel(connectionModel);
serializationService.setAggList(aggList);
workspace.setSchema(schemaStub);
XulDomContainer xulDomContainer = new XulDomContainerStub();
MainController controller = new MainController();
controller.setXulDomContainer(xulDomContainer);
controller.setWorkspace(workspace);
controller.setConnectionModel(connectionModel);
controller.setSerializationService(serializationService);
final List<Integer> connected = new ArrayList<Integer>();
final List<Integer> applied = new ArrayList<Integer>();
ConnectionController connectionController = new ConnectionController() {
public void connect() {
connected.add(1);
connectionModel.setSchema(schemaStub);
}
public void apply() {
applied.add(1);
}
};
connectionController.setConnectionModel(connectionModel);
controller.setConnectionController(connectionController);
// Save temporary design
XulMessageBoxStub.openedMessageBoxes.clear();
XulFileDialogStub.openedFileDialogs.clear();
workspace.setApplicationUnlocked(true);
workspace.setWorkspaceUpToDate(true);
XulFileDialogStub.returnCode = RETURN_CODE.OK;
XulFileDialogStub.returnFile = new File("temp_design_output.xml");
if (XulFileDialogStub.returnFile.exists()) {
XulFileDialogStub.returnFile.delete();
}
controller.saveWorkspace(false);
assertTrue(XulFileDialogStub.returnFile.exists());
// Test 1 - Cancel Opening
XulMessageBoxStub.openedMessageBoxes.clear();
XulFileDialogStub.openedFileDialogs.clear();
XulFileDialogStub.returnCode = RETURN_CODE.CANCEL;
controller.openWorkspace();
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 0);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 1);
// Test 2 - Happy Path
XulMessageBoxStub.openedMessageBoxes.clear();
XulFileDialogStub.openedFileDialogs.clear();
XulFileDialogStub.returnCode = RETURN_CODE.OK;
aggList.clearAggs();
connected.clear();
applied.clear();
controller.openWorkspace();
assertEquals(XulMessageBoxStub.openedMessageBoxes.size(), 0);
assertEquals(XulFileDialogStub.openedFileDialogs.size(), 1);
assertEquals(connected.size(), 1);
assertEquals(applied.size(), 1);
assertEquals(aggList.getSize(), 4);
assertEquals(workspace.isApplicationUnlocked(), true);
assertEquals(workspace.getWorkspaceUpToDate(), true);
}
public void testNewWorkspace() throws Exception {
Workspace workspace = new Workspace();
SchemaStub schemaStub = new SchemaStub();
ConnectionModelImpl connectionModel = new ConnectionModelImpl();
// ConnectionController connectionController = new ConnectionController();
// connectionController.setConnectionModel(connectionModel);
// List<SchemaProviderUiExtension> providerList = new ArrayList<SchemaProviderUiExtension>();
// MondrianFileSchemaProvider mondrianProvider = new MondrianFileSchemaProvider();
// providerList.add(mondrianProvider);
connectionModel.setDatabaseMeta(new DatabaseMeta());
MondrianFileSchemaModel schemaModel = new MondrianFileSchemaModel();
schemaModel.setMondrianSchemaFilename(getTestProperty("test.mondrian.foodmart.connectString.catalog"));
connectionModel.setSelectedSchemaModel(schemaModel);
connectionModel.setCubeName("Sales");
AggList aggList = SerializationServiceTest.getAggList(schemaStub);
SerializationService serializationService = new SerializationService();
serializationService.setConnectionModel(connectionModel);
serializationService.setAggList(aggList);
workspace.setSchema(schemaStub);
XulDomContainer xulDomContainer = new XulDomContainerStub();
MainController controller = new MainController();
final List<Integer> showDialog = new ArrayList<Integer>();
ConnectionController connectionController = new ConnectionController() {
public void showConnectionDialog(){
showDialog.add(1);
}
};
connectionController.setConnectionModel(connectionModel);
controller.setConnectionController(connectionController);
controller.setAggList(aggList);
controller.setXulDomContainer(xulDomContainer);
controller.setWorkspace(workspace);
controller.setConnectionModel(connectionModel);
controller.setConnectionController(connectionController);
controller.setSerializationService(serializationService);
controller.newWorkspace();
assertEquals(aggList.getSize(), 0);
assertEquals(showDialog.size(), 1);
}
}