package uk.gov.gchq.gaffer.integration.impl;
import com.google.common.collect.Lists;
import org.junit.Test;
import uk.gov.gchq.gaffer.commonutil.TestGroups;
import uk.gov.gchq.gaffer.commonutil.TestPropertyNames;
import uk.gov.gchq.gaffer.commonutil.iterable.CloseableIterable;
import uk.gov.gchq.gaffer.data.element.Element;
import uk.gov.gchq.gaffer.data.element.Entity;
import uk.gov.gchq.gaffer.data.elementdefinition.view.View;
import uk.gov.gchq.gaffer.integration.AbstractStoreIT;
import uk.gov.gchq.gaffer.integration.TraitRequirement;
import uk.gov.gchq.gaffer.operation.OperationException;
import uk.gov.gchq.gaffer.operation.data.EntitySeed;
import uk.gov.gchq.gaffer.operation.impl.add.AddElements;
import uk.gov.gchq.gaffer.operation.impl.get.GetElements;
import uk.gov.gchq.gaffer.store.StoreTrait;
import uk.gov.gchq.gaffer.user.User;
import java.util.Collections;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class StoreValidationIT extends AbstractStoreIT {
private static final String VERTEX = "vertex";
@Test
@TraitRequirement(StoreTrait.STORE_VALIDATION)
public void shouldAgeOfDataBasedOnTimestampAndAgeOfFunctionInSchema() throws OperationException, InterruptedException {
// Given
final User user = new User();
final long now = System.currentTimeMillis();
final Entity entity = new Entity(TestGroups.ENTITY_2, VERTEX);
entity.putProperty(TestPropertyNames.TIMESTAMP, now);
entity.putProperty(TestPropertyNames.INT, 5);
graph.execute(new AddElements.Builder()
.input(entity)
.build(), user);
// When 1 - before age off
final CloseableIterable<? extends Element> results1 = graph.execute(new GetElements.Builder()
.input(new EntitySeed(VERTEX))
.view(new View.Builder()
.entity(TestGroups.ENTITY_2)
.build())
.build(), user);
// Then 1
final List<Element> results1List = Lists.newArrayList(results1);
assertEquals(1, results1List.size());
assertEquals(VERTEX, ((Entity) results1List.get(0)).getVertex());
// Wait until after the age off time
while (System.currentTimeMillis() - now < AGE_OFF_TIME) {
Thread.sleep(1000L);
}
// When 2 - after age off
final CloseableIterable<? extends Element> results2 = graph.execute(new GetElements.Builder()
.input(new EntitySeed(VERTEX))
.view(new View.Builder()
.entity(TestGroups.ENTITY_2)
.build())
.build(), user);
// Then 2
final List<Element> results2List = Lists.newArrayList(results2);
assertTrue(results2List.isEmpty());
}
@Test
@TraitRequirement(StoreTrait.STORE_VALIDATION)
public void shouldRemoveInvalidElements() throws OperationException, InterruptedException {
// Given
final User user = new User();
final Entity entity = new Entity(TestGroups.ENTITY_2, VERTEX);
entity.putProperty(TestPropertyNames.INT, 100);
// add elements but skip the validation
graph.execute(new AddElements.Builder()
.input(Collections.<Element>singleton(entity))
.validate(false)
.build(), user);
// When
final CloseableIterable<? extends Element> results1 = graph.execute(new GetElements.Builder()
.input(new EntitySeed(VERTEX))
.view(new View.Builder()
.entity(TestGroups.ENTITY_2)
.build())
.build(), user);
// Then
final List<Element> results1List = Lists.newArrayList(results1);
assertTrue(results1List.isEmpty());
}
}