package com.thoughtworks.calabash.android.unit;
import com.thoughtworks.calabash.android.*;
import org.codehaus.jackson.JsonNode;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import java.util.List;
import static com.thoughtworks.calabash.android.TestUtils.readFileFromResources;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
public class TreeBuilderTest {
@Mock
private CalabashWrapper wrapper;
@Mock
private CalabashHttpClient httpClient;
@Mock
private TreeNodeBuilder treeNodeBuilder;
@Before
public void setUp() {
initMocks(this);
}
@Test
public void shouldGetDumpInfo() throws Exception {
String dump = readFileFromResources("simple-dump.json");
final TreeNode root = getMockedTreeNodeWithElement();
final TreeNode firstLevel = getMockedTreeNodeWithElement();
when(httpClient.getViewDump()).thenReturn(dump);
when(treeNodeBuilder.buildFrom(any(JsonNode.class), anyString())).thenReturn(root).thenReturn(firstLevel);
final TreeBuilder treeBuilder = new TreeBuilder(wrapper, httpClient, treeNodeBuilder);
List<TreeNode> tree = treeBuilder.createTree();
assertEquals(1, tree.size());
verify(root).appendChild(firstLevel);
}
@Test
public void shouldGetDumpInfoForNestedChildren() throws Exception {
final String dump = readFileFromResources("nested-view-dump.json");
final TreeNode root = getMockedTreeNodeWithElement();
final TreeNode firstLevelChild1 = getMockedTreeNodeWithElement();
final TreeNode firstLevelChild2 = getMockedTreeNodeWithElement();
when(httpClient.getViewDump()).thenReturn(dump);
when(treeNodeBuilder.buildFrom(any(JsonNode.class), anyString())).thenReturn(root).thenReturn(firstLevelChild1).thenReturn(firstLevelChild2);
final TreeBuilder treeBuilder = new TreeBuilder(wrapper, httpClient, treeNodeBuilder);
List<TreeNode> tree = treeBuilder.createTree();
assertEquals(1, tree.size());
ArgumentCaptor<TreeNode> treeNodeCaptor = ArgumentCaptor.forClass(TreeNode.class);
verify(root, times(2)).appendChild(treeNodeCaptor.capture());
List<TreeNode> capturedTreeNodes = treeNodeCaptor.getAllValues();
assertEquals(firstLevelChild1, capturedTreeNodes.get(0));
assertEquals(firstLevelChild2, capturedTreeNodes.get(1));
verify(root).appendChild(firstLevelChild1);
}
@Test
public void shouldAddOnlyVisibleNodes() throws Exception {
final String dump = readFileFromResources("nested-invisible-view-dump.json");
final TreeNode root = getMockedTreeNodeWithElement();
final TreeNode visibleChild = mock(TreeNode.class);
when(httpClient.getViewDump()).thenReturn(dump);
when(treeNodeBuilder.buildFrom(any(JsonNode.class), anyString())).thenReturn(root).thenReturn(visibleChild);
final TreeBuilder treeBuilder = new TreeBuilder(wrapper, httpClient, treeNodeBuilder);
List<TreeNode> tree = treeBuilder.createTree();
assertEquals(1, tree.size());
ArgumentCaptor<TreeNode> treeNodeCaptor = ArgumentCaptor.forClass(TreeNode.class);
verify(root, times(1)).appendChild(treeNodeCaptor.capture());
List<TreeNode> capturedTreeNodes = treeNodeCaptor.getAllValues();
assertEquals(visibleChild, capturedTreeNodes.get(0));
verify(treeNodeBuilder, times(2)).buildFrom(any(JsonNode.class), anyString());
verify(root).appendChild(visibleChild);
}
@Test
public void shouldAddQueryToElements() throws Exception {
final String dump = readFileFromResources("nested-view-dump.json");
final TreeNode root = getMockedTreeNodeWithElementWithQuery("* index:0");
final TreeNode firstLevelChild1 = getMockedTreeNodeWithElement();
final TreeNode firstLevelChild2 = getMockedTreeNodeWithElement();
when(httpClient.getViewDump()).thenReturn(dump);
when(treeNodeBuilder.buildFrom(any(JsonNode.class), anyString())).thenReturn(root).thenReturn(firstLevelChild1).thenReturn(firstLevelChild2);
final TreeBuilder treeBuilder = new TreeBuilder(wrapper, httpClient, treeNodeBuilder);
treeBuilder.createTree();
final ArgumentCaptor<String> queryCaptor = ArgumentCaptor.forClass(String.class);
verify(treeNodeBuilder, times(3)).buildFrom(any(JsonNode.class), queryCaptor.capture());
final List<String> queries = queryCaptor.getAllValues();
assertEquals("* index:0", queries.get(0));
assertEquals("* index:0 child * index:0", queries.get(1));
assertEquals("* index:0 child * index:1", queries.get(2));
}
@Test
public void shouldGenerateQueryOnlyForVisibleNodes() throws Exception {
final String dump = readFileFromResources("nested-invisible-view-dump.json");
final TreeNode root = getMockedTreeNodeWithElementWithQuery("* index:0");
final TreeNode firstLevelChild1 = getMockedTreeNodeWithElement();
final TreeNode firstLevelChild2 = getMockedTreeNodeWithElement();
when(httpClient.getViewDump()).thenReturn(dump);
when(treeNodeBuilder.buildFrom(any(JsonNode.class), anyString())).thenReturn(root).thenReturn(firstLevelChild1).thenReturn(firstLevelChild2);
final TreeBuilder treeBuilder = new TreeBuilder(wrapper, httpClient, treeNodeBuilder);
treeBuilder.createTree();
final ArgumentCaptor<String> queryCaptor = ArgumentCaptor.forClass(String.class);
verify(treeNodeBuilder, times(2)).buildFrom(any(JsonNode.class), queryCaptor.capture());
final List<String> queries = queryCaptor.getAllValues();
assertEquals("* index:0", queries.get(0));
assertEquals("* index:0 child * index:0", queries.get(1));
}
@Test
public void shouldEmptyTreeNodeForEmptyDump() throws Exception {
when(httpClient.getViewDump()).thenReturn("{}");
final TreeBuilder treeBuilder = new TreeBuilder(wrapper, httpClient, treeNodeBuilder);
List<TreeNode> tree = treeBuilder.createTree();
assertEquals(0, tree.size());
}
private TreeNode getMockedTreeNodeWithElementWithQuery(String query) {
final TreeNode mockedTreeNodeWithElement = getMockedTreeNodeWithElement();
when(mockedTreeNodeWithElement.getData().getQuery()).thenReturn(query);
return mockedTreeNodeWithElement;
}
private TreeNode getMockedTreeNodeWithElement() {
final TreeNode root = mock(TreeNode.class);
final UIElement rootElement = mock(UIElement.class);
when(root.getData()).thenReturn(rootElement);
return root;
}
}