package org.bonitasoft.web.rest.server.datastore.applicationmenu;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.bonitasoft.engine.api.ApplicationAPI;
import org.bonitasoft.engine.business.application.ApplicationMenu;
import org.bonitasoft.engine.business.application.ApplicationMenuCreator;
import org.bonitasoft.engine.business.application.ApplicationMenuNotFoundException;
import org.bonitasoft.engine.business.application.ApplicationMenuUpdater;
import org.bonitasoft.engine.business.application.impl.ApplicationMenuImpl;
import org.bonitasoft.engine.exception.CreationException;
import org.bonitasoft.engine.exception.DeletionException;
import org.bonitasoft.engine.exception.SearchException;
import org.bonitasoft.engine.search.Order;
import org.bonitasoft.engine.search.SearchOptions;
import org.bonitasoft.engine.search.impl.SearchResultImpl;
import org.bonitasoft.engine.session.APISession;
import org.bonitasoft.web.rest.model.applicationmenu.ApplicationMenuDefinition;
import org.bonitasoft.web.rest.model.applicationmenu.ApplicationMenuItem;
import org.bonitasoft.web.rest.server.APITestWithMock;
import org.bonitasoft.web.rest.server.framework.search.ItemSearchResult;
import org.bonitasoft.web.toolkit.client.ItemDefinitionFactory;
import org.bonitasoft.web.toolkit.client.common.exception.api.APIException;
import org.bonitasoft.web.toolkit.client.data.APIID;
import org.bonitasoft.web.toolkit.client.data.item.ItemDefinition;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ApplicationMenuDataStoreTest extends APITestWithMock {
@Mock
private APISession session;
@Mock
private ApplicationAPI applicationAPI;
@Mock
private ApplicationMenuItemConverter converter;
@Mock
private ApplicationMenuUpdater applicationMenuUpdater;
@InjectMocks
private ApplicationMenuDataStore dataStore;
@Before
public void setUp() throws Exception {
ItemDefinitionFactory.setDefaultFactory(new ItemDefinitionFactory() {
@Override
public ItemDefinition<?> defineItemDefinitions(final String token) {
return new ApplicationMenuDefinition();
}
});
}
@Test
public void should_return_result_of_engine_call_converted_to_item_on_add() throws Exception {
//given
final ApplicationMenuItem itemToCreate = new ApplicationMenuItem();
final ApplicationMenuImpl applicationMenu = new ApplicationMenuImpl("firstMenu", 11L, 14L, 1);
given(applicationAPI.createApplicationMenu(any(ApplicationMenuCreator.class))).willReturn(applicationMenu);
given(converter.toApplicationMenuItem(applicationMenu)).willReturn(new ApplicationMenuItem());
//when
final ApplicationMenuItem createdItem = dataStore.add(itemToCreate);
//then
assertThat(createdItem).isEqualTo(itemToCreate);
}
@Test(expected = APIException.class)
public void should_throw_APIException_when_engine_throws_CreationException_on_add() throws Exception {
//given
given(applicationAPI.createApplicationMenu(any(ApplicationMenuCreator.class))).willThrow(new CreationException(""));
//when
dataStore.add(new ApplicationMenuItem());
//then exception
}
@Test
public void should_return_application_menu_updated_by_ApplicationAPI_and_converted_to_ApplicationItem_on_update() throws Exception {
//given
final HashMap<String, String> attributesToUpDate = new HashMap<String, String>();
given(converter.toApplicationMenuUpdater(any(Map.class))).willReturn(applicationMenuUpdater);
final ApplicationMenuImpl applicationMenu = new ApplicationMenuImpl("menu name", 1L, 1L, 2);
given(applicationAPI.updateApplicationMenu(1, applicationMenuUpdater)).willReturn(applicationMenu);
final ApplicationMenuItem item = new ApplicationMenuItem();
given(converter.toApplicationMenuItem(applicationMenu)).willReturn(item);
//when
final ApplicationMenuItem createdItem = dataStore.update(APIID.makeAPIID(1L), attributesToUpDate);
//then
verify(converter, times(1)).toApplicationMenuUpdater(attributesToUpDate);
verify(applicationAPI, times(1)).updateApplicationMenu(1, applicationMenuUpdater);
verify(converter, times(1)).toApplicationMenuItem(applicationMenu);
assertThat(createdItem).isEqualTo(new ApplicationMenuItem());
}
@Test
public void should_return_the_ApplicationMenu_supplied_by_the_engine_converted_to_item_on_get() throws Exception {
//given
final ApplicationMenuItem itemToCreate = new ApplicationMenuItem();
final ApplicationMenuImpl applicationMenu = new ApplicationMenuImpl("firstMenu", 11L, 14L, 1);
given(applicationAPI.getApplicationMenu(1L)).willReturn(applicationMenu);
given(converter.toApplicationMenuItem(applicationMenu)).willReturn(new ApplicationMenuItem());
//when
final ApplicationMenuItem createdItem = dataStore.get(APIID.makeAPIID(1L));
//then
assertThat(createdItem).isEqualTo(itemToCreate);
}
@Test(expected = APIException.class)
public void should_throw_APIException_when_the_engine_throw_NotFoundException_on_get() throws Exception {
//given
given(applicationAPI.getApplicationMenu(1)).willThrow(new ApplicationMenuNotFoundException(""));
//when
dataStore.get(APIID.makeAPIID("1"));
//then exception
}
@Test
public void should_delete_the_good_Application_Page_on_delete() throws Exception {
//given
//when
dataStore.delete(Arrays.<APIID> asList(APIID.makeAPIID("1"), APIID.makeAPIID("2")));
//then
verify(applicationAPI, times(1)).deleteApplicationMenu(1);
verify(applicationAPI, times(1)).deleteApplicationMenu(2);
}
@Test(expected = APIException.class)
public void should_throw_APIException_on_delete_when_engine_throws_exception() throws Exception {
doThrow(new DeletionException("")).when(applicationAPI).deleteApplicationMenu(1);
//when
dataStore.delete(Arrays.<APIID> asList(APIID.makeAPIID("1")));
//then exception
}
@Test
public void should_return_a_valid_ItemSearchResult_on_search() throws Exception {
//given
final String orders = ApplicationMenuItem.ATTRIBUTE_DISPLAY_NAME + " DESC";
final ApplicationMenuImpl appMenu = new ApplicationMenuImpl("MyMenu", 11L, 2L, 1);
appMenu.setParentId(-1L);
given(applicationAPI.searchApplicationMenus(any(SearchOptions.class))).willReturn(
new SearchResultImpl<ApplicationMenu>(2, Arrays.<ApplicationMenu> asList(appMenu)));
//when
final ItemSearchResult<ApplicationMenuItem> retrievedItems = dataStore.search(0, 1, null, orders,
Collections.<String, String> emptyMap());
//then
assertThat(retrievedItems).isNotNull();
assertThat(retrievedItems.getLength()).isEqualTo(1);
assertThat(retrievedItems.getPage()).isEqualTo(0);
assertThat(retrievedItems.getTotal()).isEqualTo(2);
assertThat(retrievedItems.getResults().get(0).getDisplayName()).isEqualTo("MyMenu");
}
@Test
public void should_call_engine_with_good_parameters_on_search() throws Exception {
//given
final int page = 0;
final int resultsByPage = 1;
final String search = "string to Match";
final String orders = ApplicationMenuItem.ATTRIBUTE_DISPLAY_NAME + " DESC";
final HashMap<String, String> filters = new HashMap<String, String>();
filters.put(ApplicationMenuItem.ATTRIBUTE_APPLICATION_PAGE_ID, "1");
final ApplicationMenuImpl appPage = new ApplicationMenuImpl("MyMenu", 11L, 1L, 2);
appPage.setParentId(-1L);
given(applicationAPI.searchApplicationMenus(any(SearchOptions.class))).willReturn(
new SearchResultImpl<ApplicationMenu>(2, Arrays.<ApplicationMenu> asList(appPage)));
//when
dataStore.search(page, resultsByPage, search, orders, filters);
//then
final ArgumentCaptor<SearchOptions> captor = ArgumentCaptor.forClass(SearchOptions.class);
verify(applicationAPI, times(1)).searchApplicationMenus(captor.capture());
final SearchOptions searchOption = captor.getValue();
assertThat(searchOption.getFilters()).hasSize(1);
assertThat(searchOption.getFilters().get(0).getField()).isEqualTo(ApplicationMenuItem.ATTRIBUTE_APPLICATION_PAGE_ID);
assertThat(searchOption.getFilters().get(0).getValue()).isEqualTo("1");
assertThat(searchOption.getSearchTerm()).isEqualTo(search);
assertThat(searchOption.getMaxResults()).isEqualTo(1);
assertThat(searchOption.getStartIndex()).isEqualTo(0);
assertThat(searchOption.getSorts()).hasSize(1);
assertThat(searchOption.getSorts().get(0).getField()).isEqualTo(ApplicationMenuItem.ATTRIBUTE_DISPLAY_NAME);
assertThat(searchOption.getSorts().get(0).getOrder()).isEqualTo(Order.DESC);
}
@Test(expected = APIException.class)
public void should_throw_APIException_when_engine_throws_SearchException_on_search() throws Exception {
//given
final String orders = ApplicationMenuItem.ATTRIBUTE_DISPLAY_NAME + " DESC";
given(applicationAPI.searchApplicationMenus(any(SearchOptions.class))).willThrow(new SearchException(null));
//when
dataStore.search(0, 1, null, orders, Collections.<String, String> emptyMap());
//then exception
}
}