Skip to content

Commit

Permalink
Refactor DefaultS3StoreImpl tests
Browse files Browse the repository at this point in the history
  • Loading branch information
paulcwarren committed May 26, 2020
1 parent 64cc93e commit 0e0ce6b
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ public S3StoreResource(AmazonS3 client, String bucket, Resource delegate) {
this.delegate = delegate;
}

public AmazonS3 getClient() {
return client;
}

@Override
public boolean exists() {
return delegate.exists();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
import internal.org.springframework.content.s3.config.DefaultAssociativeStoreS3ObjectIdResolver;
import internal.org.springframework.content.s3.config.S3ObjectIdResolverConverter;
import internal.org.springframework.content.s3.config.S3StoreConfiguration;
import internal.org.springframework.content.s3.io.S3StoreResource;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.springframework.cloud.aws.core.io.s3.SimpleStorageProtocolResolver;
import org.springframework.content.commons.annotations.ContentId;
import org.springframework.content.commons.annotations.ContentLength;
import org.springframework.content.commons.repository.StoreAccessException;
Expand All @@ -18,39 +20,23 @@
import org.springframework.content.s3.S3ObjectIdResolver;
import org.springframework.core.convert.ConversionFailedException;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.WritableResource;
import org.springframework.util.Assert;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;

import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.BeforeEach;
import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.Context;
import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.Describe;
import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.It;
import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.JustBeforeEach;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import java.io.*;

import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.*;
import static java.lang.String.format;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.matches;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.endsWith;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.*;
import static org.springframework.content.s3.S3ObjectIdResolver.createS3ObjectIdResolver;

@RunWith(Ginkgo4jRunner.class)
Expand Down Expand Up @@ -92,17 +78,35 @@ public class DefaultS3StoreImplTest {
Context("#getResource", () -> {
Context("given the store's ID is an S3ObjectId type", () -> {
BeforeEach(() -> {
placementService = new PlacementServiceImpl();
S3StoreConfiguration.addDefaultS3ObjectIdConverters(placementService, defaultBucket);
placementService.addConverter(new Converter<String, String>() {
@Override
public String convert(String source) {
return "/some/object/id";
}
});

SimpleStorageProtocolResolver s3Protocol = new SimpleStorageProtocolResolver(client);
s3Protocol.afterPropertiesSet();
loader = new DefaultResourceLoader();
((DefaultResourceLoader)loader).addProtocolResolver(s3Protocol);

s3ObjectIdBasedStore = new DefaultS3StoreImpl<ContentProperty, S3ObjectId>(
loader, placementService, client);
when(placementService.convert(eq("some-object-id"),
eq(String.class))).thenReturn("/some/object/id");
when(loader.getResource(anyString())).thenReturn(resource);
});
JustBeforeEach(() -> {
s3ObjectIdBasedStore.getResource(new S3ObjectId("some-defaultBucket", "some-object-id"));
try {
r = s3ObjectIdBasedStore.getResource(new S3ObjectId("some-defaultBucket", "some-object-id"));
} catch (Exception e) {
this.e = e;
}
});
It("should fetch the resource", () -> {
verify(loader).getResource(eq("s3://some-defaultBucket/some/object/id"));
It("should return the resource", () -> {
assertThat(e, is(nullValue()));
assertThat(r, is(instanceOf(S3StoreResource.class)));
assertThat(((S3StoreResource)r).getClient(), is(client));
assertThat(r.getDescription(), is(format("Amazon s3 resource [bucket='%s' and object='%s']","some-defaultBucket", "some/object/id")));
});
});
Context("given the store's ID is a custom ID type", () -> {
Expand All @@ -111,7 +115,7 @@ public class DefaultS3StoreImplTest {
loader, placementService, client/*, resolver, defaultBucket*/);

try {
customS3ContentIdBasedStore.getResource(customId);
r = customS3ContentIdBasedStore.getResource(customId);
}
catch (Exception e) {
this.e = e;
Expand All @@ -132,6 +136,11 @@ public class DefaultS3StoreImplTest {
null,
CustomContentId.class);
placementService.addConverter(new S3ObjectIdResolverConverter(resolver, defaultBucket));

SimpleStorageProtocolResolver s3Protocol = new SimpleStorageProtocolResolver(client);
s3Protocol.afterPropertiesSet();
loader = new DefaultResourceLoader();
((DefaultResourceLoader)loader).addProtocolResolver(s3Protocol);
});
Context("given an ID", () -> {
BeforeEach(() -> {
Expand All @@ -140,7 +149,10 @@ public class DefaultS3StoreImplTest {
"some-object-id");
});
It("should fetch the resource", () -> {
verify(loader).getResource(eq("s3://some-customer/some-object-id"));
assertThat(e, is(nullValue()));
assertThat(r, is(instanceOf(S3StoreResource.class)));
assertThat(((S3StoreResource)r).getClient(), is(client));
assertThat(r.getDescription(), is(format("Amazon s3 resource [bucket='%s' and object='%s']","some-customer", "some-object-id")));
});
});
});
Expand All @@ -163,14 +175,21 @@ public String getKey(CustomContentId idOrEntity) {
placementService = new PlacementServiceImpl();
S3StoreConfiguration.addDefaultS3ObjectIdConverters(placementService, defaultBucket);
placementService.addConverter(new S3ObjectIdResolverConverter(resolver, defaultBucket));

SimpleStorageProtocolResolver s3Protocol = new SimpleStorageProtocolResolver(client);
s3Protocol.afterPropertiesSet();
loader = new DefaultResourceLoader();
((DefaultResourceLoader)loader).addProtocolResolver(s3Protocol);
});
Context("given an ID", () -> {
BeforeEach(() -> {
customId = new CustomContentId("some-customer",
"some-object-id");
customId = new CustomContentId("some-customer","some-object-id");
});
It("should fetch the resource", () -> {
verify(loader).getResource(eq("s3://some-customer/some-object-id"));
assertThat(e, is(nullValue()));
assertThat(r, is(instanceOf(S3StoreResource.class)));
assertThat(((S3StoreResource)r).getClient(), is(client));
assertThat(r.getDescription(), is(format("Amazon s3 resource [bucket='%s' and object='%s']","some-customer", "some-object-id")));
});
});
});
Expand All @@ -188,8 +207,7 @@ public String getKey(CustomContentId idOrEntity) {
});
Context("given an invalid ID", () -> {
BeforeEach(() -> {
customId = new CustomContentId(
"some-bucket", "some-object-id");
customId = new CustomContentId("some-bucket", "some-object-id");
});
It("should throw an error", () -> {
assertThat(e, is(instanceOf(ConversionFailedException.class)));
Expand Down Expand Up @@ -225,10 +243,10 @@ public String getKey(CustomContentId idOrEntity) {
});
});
});

Describe("AssociativeStore", () -> {
JustBeforeEach(() -> {
s3StoreImpl = new DefaultS3StoreImpl<ContentProperty, String>(loader,
placementService, client/*, resolver, defaultBucket*/);
s3StoreImpl = new DefaultS3StoreImpl<ContentProperty, String>(loader,placementService,client/*, resolver, defaultBucket*/);
});
Context("#getResource", () -> {
JustBeforeEach(() -> {
Expand Down Expand Up @@ -259,9 +277,17 @@ public String convert(S3ObjectId source) {
return "/" + source.getKey().replaceAll("-", "/");
}
});

SimpleStorageProtocolResolver s3Protocol = new SimpleStorageProtocolResolver(client);
s3Protocol.afterPropertiesSet();
loader = new DefaultResourceLoader();
((DefaultResourceLoader)loader).addProtocolResolver(s3Protocol);
});
It("should fetch the resource", () -> {
verify(loader).getResource(matches("^s3://default-defaultBucket/12345/67890"));
assertThat(e, is(nullValue()));
assertThat(r, is(instanceOf(S3StoreResource.class)));
assertThat(((S3StoreResource)r).getClient(), is(client));
assertThat(r.getDescription(), is(format("Amazon s3 resource [bucket='%s' and object='%s']","default-defaultBucket", "12345/67890")));
});
});
Context("when called with an entity that has an @Bucket value", () -> {
Expand All @@ -272,9 +298,17 @@ public String convert(S3ObjectId source) {

placementService = new PlacementServiceImpl();
S3StoreConfiguration.addDefaultS3ObjectIdConverters(placementService, defaultBucket);

SimpleStorageProtocolResolver s3Protocol = new SimpleStorageProtocolResolver(client);
s3Protocol.afterPropertiesSet();
loader = new DefaultResourceLoader();
((DefaultResourceLoader)loader).addProtocolResolver(s3Protocol);
});
It("should fetch the correct resource", () -> {
verify(loader).getResource(matches("^s3://some-other-bucket/12345-67890"));
assertThat(e, is(nullValue()));
assertThat(r, is(instanceOf(S3StoreResource.class)));
assertThat(((S3StoreResource)r).getClient(), is(client));
assertThat(r.getDescription(), is(format("Amazon s3 resource [bucket='%s' and object='%s']","some-other-bucket", "12345-67890")));
});
});
Context("when called with an entity that has no associated resource", () -> {
Expand All @@ -290,9 +324,7 @@ public String convert(S3ObjectId source) {
});
Context("given a custom id resolver", () -> {
BeforeEach(() -> {
resolver = createS3ObjectIdResolver(
id -> "custom-bucket", id -> "custom-object-id",
null);
resolver = createS3ObjectIdResolver(id -> "custom-bucket", id -> "custom-object-id",null);
});
Context("given a default bucket", () -> {
BeforeEach(() -> {
Expand All @@ -304,16 +336,23 @@ public String convert(S3ObjectId source) {

placementService = new PlacementServiceImpl();
S3StoreConfiguration.addDefaultS3ObjectIdConverters(placementService, defaultBucket);

placementService.addConverter(new Converter<TestEntity, S3ObjectId>() {
@Override
public S3ObjectId convert(TestEntity source) {
return new S3ObjectId( "custom-bucket", "custom-object-id");
}
});

SimpleStorageProtocolResolver s3Protocol = new SimpleStorageProtocolResolver(client);
s3Protocol.afterPropertiesSet();
loader = new DefaultResourceLoader();
((DefaultResourceLoader)loader).addProtocolResolver(s3Protocol);
});
It("should fetch the resource", () -> {
verify(loader).getResource(matches("^s3://custom-bucket/custom-object-id$"));
assertThat(e, is(nullValue()));
assertThat(r, is(instanceOf(S3StoreResource.class)));
assertThat(((S3StoreResource)r).getClient(), is(client));
assertThat(r.getDescription(), is(format("Amazon s3 resource [bucket='%s' and object='%s']","custom-bucket", "custom-object-id")));
});
});
});
Expand Down Expand Up @@ -374,10 +413,10 @@ public S3ObjectId convert(TestEntity source) {
});
});
});

Describe("ContentStore", () -> {
JustBeforeEach(() -> {
s3StoreImpl = new DefaultS3StoreImpl<ContentProperty, String>(loader,
placementService, client);
s3StoreImpl = new DefaultS3StoreImpl<ContentProperty, String>(loader,placementService,client);
});
Context("#setContent", () -> {
BeforeEach(() -> {
Expand Down

0 comments on commit 0e0ce6b

Please sign in to comment.