package org.bonitasoft.web.rest.server.datastore.applicationpage;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import org.bonitasoft.engine.api.ApplicationAPI;
import org.bonitasoft.engine.api.PageAPI;
import org.bonitasoft.engine.business.application.ApplicationPage;
import org.bonitasoft.engine.business.application.ApplicationPageNotFoundException;
import org.bonitasoft.engine.business.application.impl.ApplicationPageImpl;
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.applicationpage.ApplicationPageDefinition;
import org.bonitasoft.web.rest.model.applicationpage.ApplicationPageItem;
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.Spy;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ApplicationPageDataStoreTest extends APITestWithMock {
@Mock
private APISession session;
@Mock
private ApplicationAPI applicationAPI;
@Mock
private PageAPI pageAPI;
@Mock
private ApplicationPageItemConverter converter;
@Spy
@InjectMocks
private ApplicationPageDataStore dataStore;
@Before
public void setUp() throws Exception {
ItemDefinitionFactory.setDefaultFactory(new ItemDefinitionFactory() {
@Override
public ItemDefinition<?> defineItemDefinitions(final String token) {
return new ApplicationPageDefinition();
}
});
}
@Test
public void should_return_result_of_engine_call_converted_to_item_on_add() throws Exception {
//given
final ApplicationPageItem itemToCreate = new ApplicationPageItem();
itemToCreate.setToken("firstPage");
itemToCreate.setApplicationId(14L);
itemToCreate.setPageId(28L);
final ApplicationPageImpl applicationPage = new ApplicationPageImpl(14L, 28L, "firstPage");
given(applicationAPI.createApplicationPage(14L, 28L, "firstPage")).willReturn(applicationPage);
//when
final ApplicationPageItem createdItem = dataStore.add(itemToCreate);
//then
assertThat(createdItem).isEqualTo(createdItem);
}
@Test(expected = APIException.class)
public void should_throw_APIException_when_engine_throws_CreationException_on_add() throws Exception {
//given
given(applicationAPI.createApplicationPage(anyLong(), anyLong(), anyString())).willThrow(new CreationException(""));
//when
dataStore.add(new ApplicationPageItem());
//then exception
}
@Test
public void should_return_the_applicationPage_supplied_by_the_engine_converted_to_item_on_get() throws Exception {
//given
final ApplicationPage applicationPage = mock(ApplicationPage.class);
final ApplicationPageItem item = mock(ApplicationPageItem.class);
given(applicationAPI.getApplicationPage(1)).willReturn(applicationPage);
given(converter.toApplicationPageItem(applicationPage)).willReturn(item);
//when
final ApplicationPageItem retrivedItem = dataStore.get(APIID.makeAPIID("1"));
//then
assertThat(retrivedItem).isNotNull();
assertThat(retrivedItem).isEqualTo(item);
}
@Test(expected = APIException.class)
public void should_throw_APIException_when_the_engine_throw_NotFoundException_on_get() throws Exception {
//given
given(applicationAPI.getApplicationPage(1)).willThrow(new ApplicationPageNotFoundException(""));
//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)).deleteApplicationPage(1);
verify(applicationAPI, times(1)).deleteApplicationPage(2);
}
@Test(expected = APIException.class)
public void should_throw_APIException_on_delete_when_engine_throws_exception() throws Exception {
doThrow(new DeletionException("")).when(applicationAPI).deleteApplicationPage(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 = ApplicationPageItem.ATTRIBUTE_TOKEN + " DESC";
final ApplicationPageImpl appPage = new ApplicationPageImpl(1, 11, "MyAppPage");
appPage.setId(1);
final ApplicationPageItem item = new ApplicationPageItem();
given(converter.toApplicationPageItem(appPage)).willReturn(item);
given(applicationAPI.searchApplicationPages(any(SearchOptions.class))).willReturn(
new SearchResultImpl<ApplicationPage>(2, Arrays.<ApplicationPage> asList(appPage)));
//when
final ItemSearchResult<ApplicationPageItem> 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).getToken()).isEqualTo("MyAppPage");
}
@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 = ApplicationPageItem.ATTRIBUTE_TOKEN + " DESC";
final HashMap<String, String> filters = new HashMap<String, String>();
filters.put(ApplicationPageItem.ATTRIBUTE_APPLICATION_ID, "1");
final ApplicationPageImpl appPage = new ApplicationPageImpl(1, 11, "MyAppPage");
appPage.setId(1);
final ApplicationPageItem item = new ApplicationPageItem();
given(converter.toApplicationPageItem(appPage)).willReturn(item);
given(applicationAPI.searchApplicationPages(any(SearchOptions.class))).willReturn(
new SearchResultImpl<ApplicationPage>(2, Arrays.<ApplicationPage> asList(appPage)));
//when
dataStore.search(page, resultsByPage, search, orders, filters);
//then
final ArgumentCaptor<SearchOptions> captor = ArgumentCaptor.forClass(SearchOptions.class);
verify(applicationAPI, times(1)).searchApplicationPages(captor.capture());
final SearchOptions searchOption = captor.getValue();
assertThat(searchOption.getFilters()).hasSize(1);
assertThat(searchOption.getFilters().get(0).getField()).isEqualTo(ApplicationPageItem.ATTRIBUTE_APPLICATION_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(ApplicationPageItem.ATTRIBUTE_TOKEN);
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 = ApplicationPageItem.ATTRIBUTE_TOKEN + " DESC";
given(applicationAPI.searchApplicationPages(any(SearchOptions.class))).willThrow(new SearchException(null));
//when
dataStore.search(0, 1, null, orders, Collections.<String, String> emptyMap());
//then exception
}
}