package com.apollographql.apollo.api.graphql;
import com.apollographql.apollo.api.Operation;
import com.apollographql.apollo.api.Field;
import com.apollographql.apollo.api.internal.UnmodifiableMapBuilder;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nonnull;
import static com.google.common.truth.Truth.assertThat;
public class CacheKeyForFieldTest {
enum Episode {
JEDI
}
@Test
public void testFieldWithNoArguments() {
Field field = Field.forString("hero", "hero", null, false);
Operation.Variables variables = new Operation.Variables() {
@Nonnull @Override public Map<String, Object> valueMap() {
return super.valueMap();
}
};
assertThat(field.cacheKey(variables)).isEqualTo("hero");
}
@Test
public void testFieldWithNoArgumentsWithAlias() {
Field field = Field.forString("r2", "hero", null, false);
Operation.Variables variables = new Operation.Variables() {
@Nonnull @Override public Map<String, Object> valueMap() {
return super.valueMap();
}
};
assertThat(field.cacheKey(variables)).isEqualTo("hero");
}
@Test
public void testFieldWithArgument() {
//noinspection unchecked
Field field = Field.forString("hero", "hero", new UnmodifiableMapBuilder<String, Object>(1)
.put("episode", "JEDI")
.build(), false);
Operation.Variables variables = new Operation.Variables() {
@Nonnull @Override public Map<String, Object> valueMap() {
return super.valueMap();
}
};
assertThat(field.cacheKey(variables)).isEqualTo("hero(episode:JEDI)");
}
@Test
public void testFieldWithArgumentAndAlias() {
//noinspection unchecked
Field field = Field.forString("r2", "hero", new UnmodifiableMapBuilder<String, Object>(1)
.put("episode", "JEDI")
.build(), false);
Operation.Variables variables = new Operation.Variables() {
@Nonnull @Override public Map<String, Object> valueMap() {
return super.valueMap();
}
};
assertThat(field.cacheKey(variables)).isEqualTo("hero(episode:JEDI)");
}
@Test
public void testFieldWithVariableArgument() {
//noinspection unchecked
Field field = Field.forString("hero", "hero", new UnmodifiableMapBuilder<String, Object>(1)
.put("episode", new UnmodifiableMapBuilder<String, Object>(2)
.put("kind", "Variable")
.put("variableName", "episode")
.build())
.build(), false);
Operation.Variables variables = new Operation.Variables() {
@Nonnull @Override public Map<String, Object> valueMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("episode", Episode.JEDI);
return map;
}
};
assertThat(field.cacheKey(variables)).isEqualTo("hero(episode:JEDI)");
}
@Test
public void testFieldWithVariableArgumentNull() {
//noinspection unchecked
Field field = Field.forString("hero", "hero", new UnmodifiableMapBuilder<String, Object>(1)
.put("episode", new UnmodifiableMapBuilder<String, Object>(2)
.put("kind", "Variable")
.put("variableName", "episode")
.build())
.build(), false);
Operation.Variables variables = new Operation.Variables() {
@Nonnull @Override public Map<String, Object> valueMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("episode", null);
return map;
}
};
assertThat(field.cacheKey(variables)).isEqualTo("hero(episode:null)");
}
@Test
public void testFieldWithMultipleArgument() {
//noinspection unchecked
Field field = Field.forString("hero", "hero", new UnmodifiableMapBuilder<String, Object>(1)
.put("episode", "JEDI")
.put("color", "blue")
.build(), false);
Operation.Variables variables = new Operation.Variables() {
@Nonnull @Override public Map<String, Object> valueMap() {
return super.valueMap();
}
};
assertThat(field.cacheKey(variables)).isEqualTo("hero(color:blue,episode:JEDI)");
}
@Test
public void testFieldWithMultipleArgumentsOrderIndependent() {
//noinspection unchecked
Field field = Field.forString("hero", "hero", new UnmodifiableMapBuilder<String, Object>(1)
.put("episode", "JEDI")
.put("color", "blue")
.build(), false);
Operation.Variables variables = new Operation.Variables() {
@Nonnull @Override public Map<String, Object> valueMap() {
return super.valueMap();
}
};
//noinspection unchecked
Field fieldTwo = Field.forString("hero", "hero", new UnmodifiableMapBuilder<String, Object>(1)
.put("color", "blue")
.put("episode", "JEDI")
.build(), false);
assertThat(fieldTwo.cacheKey(variables)).isEqualTo(field.cacheKey(variables));
}
@Test
public void testFieldWithNestedObject() {
//noinspection unchecked
Field field = Field.forString("hero", "hero", new UnmodifiableMapBuilder<String, Object>(1)
.put("episode", "JEDI")
.put("nested", new UnmodifiableMapBuilder<String, Object>(2)
.put("foo", 1)
.put("bar", 2)
.build())
.build(), false);
Operation.Variables variables = new Operation.Variables() {
@Nonnull @Override public Map<String, Object> valueMap() {
return super.valueMap();
}
};
assertThat(field.cacheKey(variables)).isEqualTo("hero(episode:JEDI,nested:[bar:2,foo:1])");
}
@Test
public void testFieldWithNestedObjectAndVariables() {
//noinspection unchecked
Field field = Field.forString("hero", "hero", new UnmodifiableMapBuilder<String, Object>(1)
.put("episode", "JEDI")
.put("nested", new UnmodifiableMapBuilder<String, Object>(2)
.put("foo", new UnmodifiableMapBuilder<String, Object>(2)
.put("kind", "Variable")
.put("variableName", "stars")
.build())
.put("bar", "2")
.build())
.build(), false);
Operation.Variables variables = new Operation.Variables() {
@Nonnull @Override public Map<String, Object> valueMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("stars", 1);
return map;
}
};
assertThat(field.cacheKey(variables)).isEqualTo("hero(episode:JEDI,nested:[bar:2,foo:1])");
}
}