package com.aol.micro.server.s3.manifest.comparator;
import com.aol.micro.server.manifest.Data;
import com.aol.micro.server.manifest.VersionedKey;
import com.aol.micro.server.s3.data.S3Deleter;
import com.aol.micro.server.s3.data.S3ObjectWriter;
import com.aol.micro.server.s3.data.S3Reader;
import com.aol.micro.server.s3.data.S3StringWriter;
import cyclops.control.Try;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.Date;
import static org.junit.Assert.*;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class S3ManifestComparatorTest {
@Mock
private S3Reader reader;
@Mock
private S3StringWriter stringWriter;
@Mock
private S3Deleter deleter;
@Mock
private S3ObjectWriter objectWriter;
private String versionKey;
private Date lastModTime;
private Data<String> expectedData;
@Before
public void setup() {
lastModTime = new Date();
setupExpectedData(lastModTime, "foobar", "data", 1L);
}
private void setupExpectedData(Date lastModTime, String key, String data, long version) {
expectedData = new Data<>(data, lastModTime, versionKey);
versionKey = new VersionedKey(key, version).toJson();
when(reader.getAsString(key)).thenReturn(Try.of(versionKey));
when(reader.getAsObject(versionKey)).thenReturn(Try.of(expectedData));
when(reader.getLastModified(versionKey)).thenReturn(lastModTime);
}
@Test
public void loadInitial() throws Exception {
S3ManifestComparator<String> comparator = new S3ManifestComparator<>("foobar", reader, objectWriter, deleter, stringWriter);
comparator.load();
assertEquals("data", comparator.getData());
verify(reader, times(1)).getAsObject(versionKey);
}
@Test
public void loadUnchanged() throws Exception {
S3ManifestComparator<String> comparator = new S3ManifestComparator<>("foobar", reader, objectWriter, deleter, stringWriter);
comparator.load();
assertEquals("data", comparator.getData());
comparator.load();
assertEquals("data", comparator.getData());
verify(reader, times(1)).getAsObject(versionKey);
}
@Test
public void loadUpdated() throws Exception {
S3ManifestComparator<String> comparator = new S3ManifestComparator<>("foobar", reader, objectWriter, deleter, stringWriter);
comparator.load();
assertEquals("data", comparator.getData());
setupExpectedData(new Date(), "foobar", "data2", 2L);
comparator.load();
assertEquals("data2", comparator.getData());
}
}