package hudson.model; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import hudson.model.Descriptor.FormException; import hudson.search.SearchIndex; import hudson.search.SearchIndexBuilder; import hudson.search.SearchItem; import hudson.views.ViewsTabBar; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import javax.servlet.ServletException; import org.junit.Test; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.mockito.Mockito; public class ViewTest { /* * This test verifies that urls and displaynames in the TopLevelItem list * are added to the SearchIndexBuilder */ @Test public void testAddDisplayNamesToSearchIndex() { final String url1 = "url1"; final String displayName1 = "displayName1"; final String url2 = "url2"; final String displayName2 = "displayName2"; SearchIndexBuilder sib = new SearchIndexBuilder(); // mock the items to be indexed TopLevelItem item1 = Mockito.mock(TopLevelItem.class); Mockito.when(item1.getSearchUrl()).thenReturn(url1); Mockito.when(item1.getDisplayName()).thenReturn(displayName1); TopLevelItem item2 = Mockito.mock(TopLevelItem.class); Mockito.when(item2.getSearchUrl()).thenReturn(url2); Mockito.when(item2.getDisplayName()).thenReturn(displayName2); Collection<TopLevelItem> items = new ArrayList<TopLevelItem>(); items.add(item1); items.add(item2); // mock the view class except for the addDisplayNamesToSearchIndex() call as that // is what we are testing View view = Mockito.mock(View.class); Mockito.doCallRealMethod().when(view).addDisplayNamesToSearchIndex(sib, items); // now make the actual call to index items view.addDisplayNamesToSearchIndex(sib, items); // make and index with sib SearchIndex index = sib.make(); // now make sure we can fetch item1 from the index List<SearchItem> result = new ArrayList<SearchItem>(); index.find(displayName1, result); assertEquals(1, result.size()); SearchItem actual = result.get(0); assertEquals(actual.getSearchName(), item1.getDisplayName()); assertEquals(actual.getSearchUrl(), item1.getSearchUrl()); // clear the result array for the next search result to test result.clear(); // make sure we can fetch item 2 from the index index.find(displayName2, result); assertEquals(1, result.size()); actual = result.get(0); assertEquals(actual.getSearchName(), item2.getDisplayName()); assertEquals(actual.getSearchUrl(), item2.getSearchUrl()); } /* * Get all items recursively when View implements ViewGroup at the same time */ @Test public void getAllItems() throws Exception { final View leftView = Mockito.mock(View.class); final View rightView = Mockito.mock(View.class); CompositeView rootView = new CompositeView("rootJob", leftView, rightView); Mockito.when(leftView.getAllItems()).thenCallRealMethod(); Mockito.when(rightView.getAllItems()).thenCallRealMethod(); final TopLevelItem rootJob = createJob("rootJob"); final TopLevelItem sharedJob = createJob("sharedJob"); rootView = rootView.withJobs(rootJob, sharedJob); final TopLevelItem leftJob = createJob("leftJob"); final TopLevelItem rightJob = createJob("rightJob"); Mockito.when(leftView.getItems()).thenReturn(Arrays.asList(leftJob, sharedJob)); Mockito.when(rightView.getItems()).thenReturn(Arrays.asList(rightJob)); final TopLevelItem[] expected = new TopLevelItem[] {rootJob, sharedJob, leftJob, rightJob}; assertArrayEquals(expected, rootView.getAllItems().toArray()); } private TopLevelItem createJob(String jobName) { final TopLevelItem rootJob = Mockito.mock(TopLevelItem.class); Mockito.when(rootJob.getDisplayName()).thenReturn(jobName); return rootJob; } public static class CompositeView extends View implements ViewGroup { private View[] views; private TopLevelItem[] jobs; protected CompositeView(final String name, View... views) { super(name); this.views = views; } private CompositeView withJobs(TopLevelItem... jobs) { this.jobs = jobs; return this; } @Override public Collection<TopLevelItem> getItems() { return Arrays.asList(this.jobs); } @Override public Collection<View> getViews() { return Arrays.asList(this.views); } @Override public boolean canDelete(View view) { return false; } @Override public void deleteView(View view) throws IOException { } @Override public View getView(String name) { return null; } @Override public View getPrimaryView() { return null; } @Override public void onViewRenamed(View view, String oldName, String newName) { } @Override public ViewsTabBar getViewsTabBar() { return null; } @Override public ItemGroup<? extends TopLevelItem> getItemGroup() { return null; } @Override public List<Action> getViewActions() { return null; } @Override public boolean contains(TopLevelItem item) { return false; } @Override protected void submit(StaplerRequest req) throws IOException, ServletException, FormException { } @Override public Item doCreateItem(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { return null; } } }