package com.apollographql.apollo;
import android.support.annotation.NonNull;
import com.apollographql.android.impl.normalizer.HeroAndFriendsNames;
import com.apollographql.android.impl.normalizer.type.Episode;
import com.apollographql.apollo.cache.ApolloCacheHeaders;
import com.apollographql.apollo.cache.CacheHeaders;
import com.apollographql.apollo.cache.normalized.NormalizedCache;
import com.apollographql.apollo.cache.normalized.NormalizedCacheFactory;
import com.apollographql.apollo.cache.normalized.Record;
import com.apollographql.apollo.cache.normalized.RecordFieldAdapter;
import com.apollographql.apollo.exception.ApolloException;
import com.squareup.moshi.Moshi;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.Collections;
import java.util.Set;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import okhttp3.OkHttpClient;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import static com.google.common.truth.Truth.assertThat;
public class CacheHeadersTest {
private MockWebServer server;
@Before
public void setUp() {
server = new MockWebServer();
}
@After
public void tearDown() throws IOException {
server.shutdown();
}
@Test
public void testHeadersReceived() throws ApolloException, IOException {
final NormalizedCache normalizedCache = new NormalizedCache(RecordFieldAdapter.create(new Moshi.Builder().build())) {
@Nullable @Override public Record loadRecord(@NonNull String key, @NonNull CacheHeaders cacheHeaders) {
assertThat(cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)).isTrue();
return null;
}
@Nonnull @Override public Set<String> merge(@NonNull Record record, @NonNull CacheHeaders cacheHeaders) {
assertThat(cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)).isTrue();
return Collections.emptySet();
}
@Override public void clearAll() {
}
};
final NormalizedCacheFactory<NormalizedCache> cacheFactory = new NormalizedCacheFactory<NormalizedCache>() {
@Override public NormalizedCache createNormalizedCache(RecordFieldAdapter recordFieldAdapter) {
return normalizedCache;
}
};
ApolloClient apolloClient = ApolloClient.builder()
.normalizedCache(cacheFactory, new IdFieldCacheKeyResolver())
.serverUrl(server.url("/"))
.okHttpClient(new OkHttpClient())
.build();
server.enqueue(mockResponse("HeroAndFriendsNameResponse.json"));
CacheHeaders cacheHeaders = CacheHeaders.builder().addHeader(ApolloCacheHeaders.DO_NOT_STORE, "true").build();
apolloClient.query(new HeroAndFriendsNames(Episode.NEWHOPE))
.cacheHeaders(cacheHeaders)
.execute();
}
@Test
public void testDefaultHeadersReceived() throws IOException, ApolloException {
final NormalizedCache normalizedCache = new NormalizedCache(RecordFieldAdapter.create(new Moshi.Builder().build())) {
@Nullable @Override public Record loadRecord(@NonNull String key, @NonNull CacheHeaders cacheHeaders) {
assertThat(cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)).isTrue();
return null;
}
@Nonnull @Override public Set<String> merge(@NonNull Record record, @NonNull CacheHeaders cacheHeaders) {
assertThat(cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)).isTrue();
return Collections.emptySet();
}
@Override public void clearAll() {
}
};
final NormalizedCacheFactory<NormalizedCache> cacheFactory = new NormalizedCacheFactory<NormalizedCache>() {
@Override public NormalizedCache createNormalizedCache(RecordFieldAdapter recordFieldAdapter) {
return normalizedCache;
}
};
CacheHeaders cacheHeaders = CacheHeaders.builder().addHeader(ApolloCacheHeaders.DO_NOT_STORE, "true").build();
ApolloClient apolloClient = ApolloClient.builder()
.normalizedCache(cacheFactory, new IdFieldCacheKeyResolver())
.serverUrl(server.url("/"))
.okHttpClient(new OkHttpClient())
.defaultCacheHeaders(cacheHeaders)
.build();
server.enqueue(mockResponse("HeroAndFriendsNameResponse.json"));
apolloClient.query(new HeroAndFriendsNames(Episode.NEWHOPE)).execute();
}
private MockResponse mockResponse(String fileName) throws IOException {
return new MockResponse().setChunkedBody(Utils.readFileToString(getClass(), "/" + fileName), 32);
}
}