/*******************************************************************************
* Copyright (c) 2012-2015 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.api.project.tree.generic;
import org.eclipse.che.api.project.shared.dto.ItemReference;
import org.eclipse.che.api.project.shared.dto.ProjectDescriptor;
import org.eclipse.che.ide.api.project.tree.TreeNode;
import org.eclipse.che.ide.collections.Array;
import org.eclipse.che.ide.collections.Collections;
import org.eclipse.che.ide.rest.AsyncRequestCallback;
import org.eclipse.che.test.GwtReflectionUtils;
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Testing {@link FolderNode} functionality.
*
* @author Artem Zatsarynnyy
*/
public class FolderNodeTest extends BaseNodeTest {
private static final String ITEM_PATH = "/project/folder/folder_name";
private static final String ITEM_NAME = "folder_name";
@Captor
private ArgumentCaptor<AsyncRequestCallback<Array<ItemReference>>> asyncRequestCallbackCaptor;
@Captor
private ArgumentCaptor<Array<ItemReference>> arrayCaptor;
@Mock
private ItemReference itemReference;
@Mock
private ProjectDescriptor projectDescriptor;
@Mock
private ProjectNode projectNode;
@InjectMocks
private FolderNode folderNode;
@Before
public void setUp() {
super.setUp();
when(itemReference.getPath()).thenReturn(ITEM_PATH);
when(itemReference.getName()).thenReturn(ITEM_NAME);
final Array<TreeNode<?>> children = Collections.createArray();
when(projectNode.getChildren()).thenReturn(children);
}
@Test
public void testGetName() throws Exception {
assertEquals(ITEM_NAME, folderNode.getName());
}
@Test
public void testGetPath() throws Exception {
assertEquals(ITEM_PATH, folderNode.getPath());
}
@Test
public void testGetProject() throws Exception {
assertEquals(projectNode, folderNode.getProject());
}
@Test
public void shouldNotBeLeaf() throws Exception {
assertFalse(folderNode.isLeaf());
}
@Test
public void shouldBeRenemable() throws Exception {
assertTrue(folderNode.isRenamable());
}
@Test
public void testRenameWhenRenameIsSuccessful() throws Exception {
final String newName = "new_name";
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] arguments = invocation.getArguments();
AsyncRequestCallback<Void> callback = (AsyncRequestCallback<Void>)arguments[3];
GwtReflectionUtils.callOnSuccess(callback, (Void)null);
return callback;
}
}).when(projectServiceClient).rename(anyString(), anyString(), anyString(), (AsyncRequestCallback<Void>)anyObject());
TreeNode.RenameCallback callback = mock(TreeNode.RenameCallback.class);
folderNode.rename(newName, callback);
verify(projectServiceClient).rename(eq(ITEM_PATH), eq(newName), anyString(), Matchers.<AsyncRequestCallback<Void>>anyObject());
// verify(callback).onRenamed();
}
@Test
public void testRenameWhenRenameIsFailed() throws Exception {
final String newName = "new_name";
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] arguments = invocation.getArguments();
AsyncRequestCallback<Void> callback = (AsyncRequestCallback<Void>)arguments[3];
GwtReflectionUtils.callOnFailure(callback, mock(Throwable.class));
return callback;
}
}).when(projectServiceClient).rename(anyString(), anyString(), anyString(), (AsyncRequestCallback<Void>)anyObject());
TreeNode.RenameCallback callback = mock(TreeNode.RenameCallback.class);
folderNode.rename(newName, callback);
verify(projectServiceClient).rename(eq(ITEM_PATH), eq(newName), anyString(), Matchers.<AsyncRequestCallback<Void>>anyObject());
verify(callback).onFailure(Matchers.<Throwable>anyObject());
}
@Test
public void shouldBeDeletable() throws Exception {
assertTrue(folderNode.isDeletable());
}
@Test
public void testDeleteWhenDeleteIsSuccessful() throws Exception {
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] arguments = invocation.getArguments();
AsyncRequestCallback<Void> callback = (AsyncRequestCallback<Void>)arguments[1];
GwtReflectionUtils.callOnSuccess(callback, (Void)null);
return callback;
}
}).when(projectServiceClient).delete(anyString(), (AsyncRequestCallback<Void>)anyObject());
TreeNode.DeleteCallback callback = mock(TreeNode.DeleteCallback.class);
folderNode.delete(callback);
verify(projectServiceClient).delete(eq(ITEM_PATH), Matchers.<AsyncRequestCallback<Void>>anyObject());
verify(callback).onDeleted();
}
@Test
public void testDeleteWhenDeleteIsFailed() throws Exception {
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] arguments = invocation.getArguments();
AsyncRequestCallback<Void> callback = (AsyncRequestCallback<Void>)arguments[1];
GwtReflectionUtils.callOnFailure(callback, mock(Throwable.class));
return callback;
}
}).when(projectServiceClient).delete(anyString(), (AsyncRequestCallback<Void>)anyObject());
TreeNode.DeleteCallback callback = mock(TreeNode.DeleteCallback.class);
folderNode.delete(callback);
verify(projectServiceClient).delete(eq(ITEM_PATH), Matchers.<AsyncRequestCallback<Void>>anyObject());
verify(callback).onFailure(Matchers.<Throwable>anyObject());
}
@Test
public void shouldCreateChildFileNode() throws Exception {
ItemReference fileItem = mock(ItemReference.class);
when(fileItem.getType()).thenReturn("file");
folderNode.createChildNode(fileItem);
verify(treeStructure).newFileNode(eq(folderNode), eq(fileItem));
}
@Test
public void shouldCreateChildFolderNodeForFolderItem() {
ItemReference folderItem = mock(ItemReference.class);
when(folderItem.getType()).thenReturn("folder");
folderNode.createChildNode(folderItem);
verify(treeStructure).newFolderNode(eq(folderNode), eq(folderItem));
}
@Test
public void shouldCreateChildFolderNodeForProjectItem() {
ItemReference folderItem = mock(ItemReference.class);
when(folderItem.getType()).thenReturn("project");
folderNode.createChildNode(folderItem);
verify(treeStructure).newFolderNode(eq(folderNode), eq(folderItem));
}
@Test
public void testGetChildrenWhenHiddenItemsAreShown() throws Exception {
when(treeSettings.isShowHiddenItems()).thenReturn(true);
String path = "path";
AsyncCallback asyncCallback = mock(AsyncCallback.class);
Array<ItemReference> children = Collections.createArray();
ItemReference item = mock(ItemReference.class);
when(item.getName()).thenReturn("item");
ItemReference hiddenItem = mock(ItemReference.class);
when(hiddenItem.getName()).thenReturn(".item");
children.add(item);
children.add(hiddenItem);
folderNode.getChildren(path, asyncCallback);
verify(projectServiceClient).getChildren(eq(path), asyncRequestCallbackCaptor.capture());
AsyncRequestCallback<Array<ItemReference>> requestCallback = asyncRequestCallbackCaptor.getValue();
GwtReflectionUtils.callOnSuccess(requestCallback, children);
verify(asyncCallback).onSuccess(arrayCaptor.capture());
Array<ItemReference> array = arrayCaptor.getValue();
assertEquals(children.size(), array.size());
assertTrue(array.contains(item));
assertTrue(array.contains(hiddenItem));
}
@Test
public void testGetChildrenWhenHiddenItemsAreNotShown() throws Exception {
when(treeSettings.isShowHiddenItems()).thenReturn(false);
String path = "path";
AsyncCallback asyncCallback = mock(AsyncCallback.class);
Array<ItemReference> children = Collections.createArray();
ItemReference item = mock(ItemReference.class);
when(item.getName()).thenReturn("item");
ItemReference hiddenItem = mock(ItemReference.class);
when(hiddenItem.getName()).thenReturn(".item");
children.add(item);
children.add(hiddenItem);
folderNode.getChildren(path, asyncCallback);
verify(projectServiceClient).getChildren(eq(path), asyncRequestCallbackCaptor.capture());
AsyncRequestCallback<Array<ItemReference>> requestCallback = asyncRequestCallbackCaptor.getValue();
GwtReflectionUtils.callOnSuccess(requestCallback, children);
verify(asyncCallback).onSuccess(arrayCaptor.capture());
Array<ItemReference> array = arrayCaptor.getValue();
assertEquals(1, array.size());
assertTrue(array.contains(item));
assertFalse(array.contains(hiddenItem));
}
@Test
public void testGetChildrenWhenRequestFailure() throws Exception {
String path = "path";
AsyncCallback asyncCallback = mock(AsyncCallback.class);
folderNode.getChildren(path, asyncCallback);
verify(projectServiceClient).getChildren(eq(path), asyncRequestCallbackCaptor.capture());
AsyncRequestCallback<Array<ItemReference>> requestCallback = asyncRequestCallbackCaptor.getValue();
GwtReflectionUtils.callOnFailure(requestCallback, mock(Throwable.class));
verify(asyncCallback).onFailure(Matchers.<Throwable>anyObject());
}
}