// Copyright 2012 Google Inc. All Rights Reserved. // // Licensed 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 com.google.collide.client.workspace; import com.google.collide.client.code.FileTreeNodeDataAdapter; import com.google.collide.client.code.FileTreeNodeRenderer; import com.google.collide.client.code.debugging.DebuggingModel; import com.google.collide.client.code.debugging.DebuggingModelController; import com.google.collide.client.code.popup.EditorPopupController; import com.google.collide.client.editor.Editor; import com.google.collide.client.history.Place; import com.google.collide.client.history.PlaceNavigationEvent; import com.google.collide.client.testing.CommunicationGwtTestCase; import com.google.collide.client.testing.StubWorkspaceInfo; import com.google.collide.client.ui.tree.Tree; import com.google.collide.client.ui.tree.TreeNodeElement; import com.google.collide.client.ui.tree.TreeNodeLabelRenamer; import com.google.collide.client.util.Elements; import com.google.collide.dto.DirInfo; import com.google.collide.dto.FileInfo; import com.google.collide.dto.GetWorkspace; import com.google.collide.dto.GetWorkspaceResponse; import com.google.collide.dto.TreeNodeInfo; import com.google.collide.dto.WorkspaceInfo; import com.google.collide.dto.client.DtoClientImpls.DirInfoImpl; import com.google.collide.dto.client.DtoClientImpls.GetWorkspaceImpl; import com.google.collide.json.client.JsoArray; import com.google.collide.json.client.JsoStringMap; import com.google.collide.json.shared.JsonStringMap; import elemental.html.Element; import elemental.html.IFrameElement; /** */ public class FileTreeContextMenuControllerTest extends CommunicationGwtTestCase { private FileTreeContextMenuController controller; private Tree<FileTreeNode> tree; @Override public String getModuleName() { return TestUtils.BUILD_MODULE_NAME; } @Override public void gwtSetUp() throws Exception { super.gwtSetUp(); // Create our tree, with a model of a few dummy nodes. FileTreeNodeDataAdapter dataAdapter = new FileTreeNodeDataAdapter(); FileTreeNodeRenderer nodeRenderer = FileTreeNodeRenderer.create(context.getResources()); Tree.View<FileTreeNode> view = new Tree.View<FileTreeNode>(context.getResources()); Tree.Model<FileTreeNode> model = new Tree.Model<FileTreeNode>(dataAdapter, nodeRenderer, context.getResources()); // An empty root directory. DirInfoImpl mockDirInfo = DirInfoImpl.make(); mockDirInfo.setNodeType(TreeNodeInfo.DIR_TYPE); JsoArray<FileInfo> files = JsoArray.create(); mockDirInfo.setFiles(files); JsoArray<DirInfo> subdirs = JsoArray.create(); mockDirInfo.setSubDirectories(subdirs); mockDirInfo.setName(""); mockDirInfo.setIsComplete(true); FileTreeNode root = FileTreeNode.transform(mockDirInfo); model.setRoot(root); tree = new Tree<FileTreeNode>(view, model); // Create all the other objects we need, or mocks for them... Place place = new Place("mockPlace") { @Override public PlaceNavigationEvent<? extends Place> createNavigationEvent( JsonStringMap<String> decodedState) { return null; } }; FileTreeModel fileTreeModel = new FileTreeModel(new MockOutgoingController()); DebuggingModel debuggingModel = new DebuggingModel(); Editor editor = Editor.create(context); EditorPopupController editorPopupController = EditorPopupController.create(context.getResources(), editor); DebuggingModelController debuggingModelController = DebuggingModelController.create( place, context, debuggingModel, editor, editorPopupController, null); JsoStringMap<String> templates = JsoStringMap.create(); FileTreeUiController uiController = FileTreeUiController.create(place, fileTreeModel, tree, context, debuggingModelController); TreeNodeLabelRenamer<FileTreeNode> nodeRenamer = new TreeNodeLabelRenamer<FileTreeNode>(nodeRenderer, dataAdapter, context.getResources().workspaceNavigationFileTreeNodeRendererCss()); // ...all by way of getting to create the thing we actually want: controller = new FileTreeContextMenuController(place, uiController, fileTreeModel, nodeRenamer, context, debuggingModelController); } @Override public void gwtTearDown() throws Exception { super.gwtTearDown(); Element iframe = Elements.getDocument().getElementById(FileTreeContextMenuController.DOWNLOAD_FRAME_ID); if (iframe != null) { iframe.removeFromParent(); } } public void testDownloadUnknownWorkspace() { FileTreeNode data = null; TreeNodeElement<FileTreeNode> parentTreeNode = tree.getNode(tree.getModel().getRoot()); controller.handleDownload(parentTreeNode, true); Element iframe = Elements.getDocument().getElementById(FileTreeContextMenuController.DOWNLOAD_FRAME_ID); assertFalse("No iframe added", iframe == null); String url = ((IFrameElement) iframe).getSrc(); // TODO: fix // assertTrue("Bad url: " + url, url.contains("/workspace-" + MOCK_WORKSPACE_ID + ".zip?")); } public void testDownloadWorkspace() { FileTreeNode data = null; TreeNodeElement<FileTreeNode> parentTreeNode = tree.getNode(tree.getModel().getRoot()); expectMockWorkspaceInfo("Mock Workspace"); controller.handleDownload(parentTreeNode, true); Element iframe = Elements.getDocument().getElementById(FileTreeContextMenuController.DOWNLOAD_FRAME_ID); assertFalse(iframe == null); String url = ((IFrameElement) iframe).getSrc(); assertTrue("Bad url: " + url, url.contains("/Mock_Workspace.zip?rt=zip&")); assertTrue("Bad url: " + url, url.endsWith("&file=/")); iframe.removeFromParent(); controller.handleDownload(null, true); iframe = Elements.getDocument().getElementById(FileTreeContextMenuController.DOWNLOAD_FRAME_ID); assertFalse(iframe == null); url = ((IFrameElement) iframe).getSrc(); assertTrue("Bad url: " + url, url.contains("/Mock_Workspace.zip?rt=zip&")); assertTrue("Bad url: " + url, url.endsWith("&file=/")); iframe.removeFromParent(); } public void testBadCharacterWorkspace() { FileTreeNode data = null; TreeNodeElement<FileTreeNode> parentTreeNode = tree.getNode(tree.getModel().getRoot()); expectMockWorkspaceInfo("M o\tc/k:W\\o;r'k\"s&p?a#c%e"); controller.handleDownload(parentTreeNode, true); Element iframe = Elements.getDocument().getElementById(FileTreeContextMenuController.DOWNLOAD_FRAME_ID); assertFalse(iframe == null); String url = ((IFrameElement) iframe).getSrc(); assertTrue("Bad url: " + url, url.contains("/M_o_c_k_W_o_r_k_s%26p%3Fa%23c%25e.zip?")); } private GetWorkspace makeRequest() { return GetWorkspaceImpl.make(); } private void expectMockWorkspaceInfo(final String name) { GetWorkspace request = makeRequest(); GetWorkspaceResponse response = new GetWorkspaceResponse() { WorkspaceInfo info = StubWorkspaceInfo .make() .setName(name) .setDescription("description of a workspace " + name) .setParentId("mockParentWorkspaceId"); @Override public WorkspaceInfo getWorkspace() { return info; } @Override public int getType() { return 0; } }; // TODO: fix? // context.getMockFrontendApi().getGetWorkspacesMockApi().expectAndReturn(request, response); } }