package org.baeldung.common.web.listeners;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import javax.servlet.http.HttpServletResponse;
import org.baeldung.common.util.LinkUtil;
import org.baeldung.common.web.events.PaginatedResultsRetrievedEvent;
import org.baeldung.um.web.dto.UserDto;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.web.util.UriComponentsBuilder;
import com.google.common.net.HttpHeaders;
@RunWith(MockitoJUnitRunner.class)
@Ignore("in progress")
public class PaginatedResultsRetrievedDiscoverabilityListenerUnitTest {
private static final Class<UserDto> RESOURCE_CLASS = UserDto.class;
private static final int PAGE_SIZE_TO_SET = 10;
private static final String RESOURCE_HTTP_LOCATION = "http://example.com/context/api/resource";
private PaginatedResultsRetrievedDiscoverabilityListener listener;
@Mock
private HttpServletResponse httpServletResponse;
private UriComponentsBuilder uriComponentsBuilder;
@Before
public final void before() {
listener = new PaginatedResultsRetrievedDiscoverabilityListener();
uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(RESOURCE_HTTP_LOCATION);
}
// tests
@Test
public final void givenOnlyOnePage_whenNotifiedToAddLinkForFirstPage_thenAddNoLinksAdded() {
// given
final int pageToSet = 0;
final int totalPagesToSet = 1;
// when
listener.onApplicationEvent(new PaginatedResultsRetrievedEvent<UserDto>(RESOURCE_CLASS, uriComponentsBuilder, httpServletResponse, pageToSet, totalPagesToSet, PAGE_SIZE_TO_SET));
// then
verify(httpServletResponse, never()).addHeader(eq(HttpHeaders.LINK), anyString());
}
@Test
public final void givenThreePages_whenNotifierToAddLinkForFirstPage_thenNextAndLastLinksAreAdded() {
// given
final int pageToSet = 0;
final int totalPagesToSet = 3;
// when
listener.onApplicationEvent(new PaginatedResultsRetrievedEvent<UserDto>(RESOURCE_CLASS, uriComponentsBuilder, httpServletResponse, pageToSet, totalPagesToSet, PAGE_SIZE_TO_SET));
// then
verify(httpServletResponse).addHeader(eq(HttpHeaders.LINK), eq(LinkUtil.createLinkHeader(RESOURCE_HTTP_LOCATION + "/" + RESOURCE_CLASS.getSimpleName().toLowerCase() + "?page=" + (pageToSet + 1) + "&size=" + PAGE_SIZE_TO_SET, "next") + ", "
+ LinkUtil.createLinkHeader(RESOURCE_HTTP_LOCATION + "/" + RESOURCE_CLASS.getSimpleName().toLowerCase() + "?page=" + (totalPagesToSet - 1) + "&size=" + PAGE_SIZE_TO_SET, "last")));
}
@Test
public final void givenThreePages_whenNotifiedToAddLinkForThirdPage_thenPreviousAndFirstLinksAreAdded() {
// given
final int pageToSet = 2;
final int totalPagesToSet = 3;
// when
listener.onApplicationEvent(new PaginatedResultsRetrievedEvent<UserDto>(RESOURCE_CLASS, uriComponentsBuilder, httpServletResponse, pageToSet, totalPagesToSet, PAGE_SIZE_TO_SET));
// then
verify(httpServletResponse).addHeader(eq(HttpHeaders.LINK), eq(LinkUtil.createLinkHeader(RESOURCE_HTTP_LOCATION + "/" + RESOURCE_CLASS.getSimpleName().toLowerCase() + "?page=" + (pageToSet - 1) + "&size=" + PAGE_SIZE_TO_SET, "prev") + ", "
+ LinkUtil.createLinkHeader(RESOURCE_HTTP_LOCATION + "/" + RESOURCE_CLASS.getSimpleName().toLowerCase() + "?page=0&size=" + PAGE_SIZE_TO_SET, "first")));
}
@Test
public final void givenThreePages_whenNotifiedToAddLinkForSecondPage_thenAllLinksAreAdded() {
// given
final int pageToSet = 1;
final int totalPagesToSet = 3;
// when
listener.onApplicationEvent(new PaginatedResultsRetrievedEvent<UserDto>(RESOURCE_CLASS, uriComponentsBuilder, httpServletResponse, pageToSet, totalPagesToSet, PAGE_SIZE_TO_SET));
// then
verify(httpServletResponse).addHeader(eq(HttpHeaders.LINK),
eq(LinkUtil.createLinkHeader(RESOURCE_HTTP_LOCATION + "/" + RESOURCE_CLASS.getSimpleName().toLowerCase() + "?page=" + (pageToSet + 1) + "&size=" + PAGE_SIZE_TO_SET, "next") + ", "
+ LinkUtil.createLinkHeader(RESOURCE_HTTP_LOCATION + "/" + RESOURCE_CLASS.getSimpleName().toLowerCase() + "?page=" + (pageToSet - 1) + "&size=" + PAGE_SIZE_TO_SET, "prev") + ", "
+ LinkUtil.createLinkHeader(RESOURCE_HTTP_LOCATION + "/" + RESOURCE_CLASS.getSimpleName().toLowerCase() + "?page=0&size=" + PAGE_SIZE_TO_SET, "first") + ", "
+ LinkUtil.createLinkHeader(RESOURCE_HTTP_LOCATION + "/" + RESOURCE_CLASS.getSimpleName().toLowerCase() + "?page=" + (totalPagesToSet - 1) + "&size=" + PAGE_SIZE_TO_SET, "last")));
}
}