/** * Copyright (C) 2008 Abiquo Holdings S.L. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.abiquo.apiclient.domain; import static com.abiquo.apiclient.domain.PageIterator.flatten; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; import java.util.Iterator; import org.testng.annotations.Test; import com.abiquo.apiclient.BaseMockTest; import com.abiquo.model.rest.RESTLink; import com.abiquo.model.transport.SingleResourceTransportDto; import com.abiquo.server.core.infrastructure.DatacenterDto; import com.abiquo.server.core.infrastructure.DatacentersDto; import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.RecordedRequest; @Test public class PageIteratorTest extends BaseMockTest { public void testOnePageDoesNotPerformRequests() throws Exception { DatacenterDto datacenter = new DatacenterDto(); DatacenterDto datacenter2 = new DatacenterDto(); DatacentersDto datacenters = new DatacentersDto(); datacenters.add(datacenter); datacenters.add(datacenter2); server.start(); Iterator<DatacenterDto> it = flatten(newApiClient().getClient(), datacenters).iterator(); assertTrue(it.hasNext()); assertEquals(it.next(), datacenter); assertTrue(it.hasNext()); assertEquals(it.next(), datacenter2); assertFalse(it.hasNext()); assertEquals(server.getRequestCount(), 0); } public void testMultiplePagesAreLazilyFetched() throws Exception { MockResponse response = new MockResponse() // .setHeader("Content-Type", DatacentersDto.SHORT_MEDIA_TYPE_JSON) // .setBody(payloadFromResource("dcs.json")); server.enqueue(response); server.start(); DatacenterDto datacenter = new DatacenterDto(); DatacenterDto datacenter2 = new DatacenterDto(); DatacentersDto datacenters = new DatacentersDto(); datacenters.add(datacenter); datacenters.add(datacenter2); datacenters.addLink(new RESTLink("next", server.getUrl("") + "/api/admin/datacenters?startwith=2")); Iterator<DatacenterDto> it = flatten(newApiClient().getClient(), datacenters).iterator(); // First two elements are in the initial page. No request should be performed, as the // elements in the second page are still not needed assertTrue(it.hasNext()); assertEquals(it.next(), datacenter); assertTrue(it.hasNext()); assertEquals(it.next(), datacenter2); assertEquals(server.getRequestCount(), 0); // There is a second page, so it should be fetched now and its elements returned as normal // elements in the collection assertTrue(it.hasNext()); assertNotNull(it.next()); assertTrue(it.hasNext()); assertNotNull(it.next()); assertEquals(server.getRequestCount(), 1); RecordedRequest request = server.takeRequest(); assertRequest(request, "GET", "/api/admin/datacenters?startwith=2"); assertAccept(request, DatacentersDto.SHORT_MEDIA_TYPE_JSON, SingleResourceTransportDto.API_VERSION); // After reading the second page, there are no elements left assertFalse(it.hasNext()); } public void testMultiplePagesAreLazilyFetchedWithTheProperVersion() throws Exception { MockResponse response = new MockResponse() // .setHeader("Content-Type", DatacentersDto.SHORT_MEDIA_TYPE_JSON) // .setBody(payloadFromResource("dcs.json")); server.enqueue(response); server.start(); DatacenterDto datacenter = new DatacenterDto(); DatacenterDto datacenter2 = new DatacenterDto(); DatacentersDto datacenters = new DatacentersDto(); datacenters.add(datacenter); datacenters.add(datacenter2); datacenters.addLink(new RESTLink("next", server.getUrl("") + "/api/admin/datacenters?startwith=2")); Iterator<DatacenterDto> it = flatten(newApiClient("0.0.0").getClient(), datacenters).iterator(); // First two elements are in the initial page. No request should be performed, as the // elements in the second page are still not needed assertTrue(it.hasNext()); assertEquals(it.next(), datacenter); assertTrue(it.hasNext()); assertEquals(it.next(), datacenter2); assertEquals(server.getRequestCount(), 0); // There is a second page, so it should be fetched now and its elements returned as normal // elements in the collection assertTrue(it.hasNext()); assertNotNull(it.next()); assertTrue(it.hasNext()); assertNotNull(it.next()); assertEquals(server.getRequestCount(), 1); RecordedRequest request = server.takeRequest(); assertRequest(request, "GET", "/api/admin/datacenters?startwith=2"); assertAccept(request, DatacentersDto.SHORT_MEDIA_TYPE_JSON, "0.0.0"); // After reading the second page, there are no elements left assertFalse(it.hasNext()); } }