package com.belladati.sdk.util.impl;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import org.apache.http.entity.StringEntity;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.belladati.sdk.impl.BellaDatiClient;
import com.belladati.sdk.impl.BellaDatiServiceImpl;
import com.belladati.sdk.impl.TokenHolder;
import com.belladati.sdk.test.SDKTest;
import com.belladati.sdk.test.TestRequestHandler;
import com.belladati.sdk.util.CachedList;
import com.belladati.sdk.util.impl.CachedListImpl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
@Test
public class CachedListTest extends SDKTest {
private CachedList<Item> list;
private final String uri = "/list";
private final String field = "field";
/** Loading a cached list calls the right URL. */
public void load() {
assertEquals(list.get(), Collections.emptyList());
server.register(uri, new TestRequestHandler() {
@Override
protected void handle(HttpHolder holder) throws IOException {
assertEquals(holder.getUrlParameters(), Collections.emptyMap());
holder.response.setEntity(new StringEntity(buildResponse().toString()));
}
});
list.load();
server.assertRequestUris(uri);
assertEquals(list.get(), Collections.emptyList());
assertEquals(list.get(), list.toList());
}
/** first time load is called just once */
public void loadFirstTime() {
server.register(uri, buildResponse().toString());
list.loadFirstTime();
assertTrue(list.isLoaded());
list.loadFirstTime();
server.assertRequestUris(uri);
}
/** Items are parsed correctly. */
public void loadItems() {
final String id1 = "id1";
final String id2 = "id2";
server.register(uri, buildResponse(id1, id2).toString());
list.load();
Item item1 = new Item(id1);
Item item2 = new Item(id2);
assertEquals(list.get(), Arrays.asList(item1, item2));
assertEquals(list.get(), list.toList());
assertEquals(list.toString(), list.get().toString());
}
/** Items are parsed correctly during loadFirstTime. */
public void loadFirstTimeItems() {
final String id1 = "id1";
final String id2 = "id2";
server.register(uri, buildResponse(id1, id2).toString());
list.loadFirstTime();
Item item1 = new Item(id1);
Item item2 = new Item(id2);
assertEquals(list.get(), Arrays.asList(item1, item2));
assertEquals(list.get(), list.toList());
assertEquals(list.toString(), list.get().toString());
}
/** Previously loaded items are discarded when load is called again. */
public void discardOnLoad() {
final String id1 = "id1";
final String id2 = "id2";
server.register(uri, buildResponse(id1).toString());
list.load();
server.register(uri, buildResponse(id2).toString());
list.load();
assertEquals(list.get(), Arrays.asList(new Item(id2)));
}
/** Previously loaded items are not discarded when loadFirstTime is called. */
public void noDiscardOnLoadFirstTime() {
final String id1 = "id1";
final String id2 = "id2";
server.register(uri, buildResponse(id1).toString());
list.load();
server.register(uri, buildResponse(id2).toString());
list.loadFirstTime();
server.assertRequestUris(uri);
assertEquals(list.get(), Arrays.asList(new Item(id1)));
}
/** isLoaded is set correctly */
public void isLoaded() {
assertFalse(list.isLoaded());
server.register(uri, buildResponse().toString());
list.load();
assertTrue(list.isLoaded());
}
private JsonNode buildResponse(String... ids) {
ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
ArrayNode items = mapper.createArrayNode();
for (String id : ids) {
items.add(mapper.createObjectNode().put("id", id));
}
node.put(field, items);
return node;
}
@BeforeMethod
protected void setupList() {
BellaDatiClient client = new BellaDatiClient(server.getHttpURL(), false);
BellaDatiServiceImpl service = new BellaDatiServiceImpl(client, new TokenHolder("key", "secret"));
list = new CachedListImpl<Item>(service, uri, field) {
@Override
protected Item parse(BellaDatiServiceImpl service, JsonNode node) {
return new Item(node.get("id").asText());
}
};
}
}