diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/Foo.java b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/Foo.java new file mode 100644 index 00000000..5fdce338 --- /dev/null +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/Foo.java @@ -0,0 +1,21 @@ +package org.socialsignin.spring.data.dynamodb.issue77; + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; + +@DynamoDBTable(tableName = "foo") +public class Foo { + + private long id; + + @DynamoDBHashKey(attributeName = "Id") + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + +} diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooRepository.java b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooRepository.java new file mode 100644 index 00000000..bf1c7331 --- /dev/null +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooRepository.java @@ -0,0 +1,9 @@ +package org.socialsignin.spring.data.dynamodb.issue77; + +import org.springframework.data.repository.CrudRepository; + +public interface FooRepository extends CrudRepository, FooRepositoryCustom { + + // Workaround as per DATACMNS-1008 + // X save(X foo); +} diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooRepositoryCustom.java b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooRepositoryCustom.java new file mode 100644 index 00000000..8cdd316d --- /dev/null +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooRepositoryCustom.java @@ -0,0 +1,9 @@ +package org.socialsignin.spring.data.dynamodb.issue77; + +public interface FooRepositoryCustom { + Foo doNonstandardThing(Foo foo); + + // just here for testing... + boolean isDoNonstandardThingCalled(); + boolean isSaveCalled(); +} diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooRepositoryImpl.java b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooRepositoryImpl.java new file mode 100644 index 00000000..56ad599c --- /dev/null +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooRepositoryImpl.java @@ -0,0 +1,31 @@ +package org.socialsignin.spring.data.dynamodb.issue77; + +public class FooRepositoryImpl implements FooRepositoryCustom { + + private ThreadLocal saveCalled = new ThreadLocal<>(); + private ThreadLocal doNonstandardThingCalled = new ThreadLocal<>(); + + public FooRepositoryImpl() { + saveCalled.set(false); + doNonstandardThingCalled.set(false); + } + + public Foo save(Foo foo) { + // Do things + saveCalled.set(true); + return foo; + } + + public Foo doNonstandardThing(Foo foo) { + doNonstandardThingCalled.set(true); + return foo; + } + + public boolean isDoNonstandardThingCalled() { + return doNonstandardThingCalled.get(); + } + + public boolean isSaveCalled() { + return saveCalled.get(); + } +} \ No newline at end of file diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooService.java b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooService.java new file mode 100644 index 00000000..db08a71b --- /dev/null +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/FooService.java @@ -0,0 +1,19 @@ +package org.socialsignin.spring.data.dynamodb.issue77; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class FooService { + private final FooRepository fooRepo; + + @Autowired + public FooService(FooRepository fooRepo) { + this.fooRepo = fooRepo; + } + + public void processFoo(Foo foo) { + fooRepo.doNonstandardThing(foo); + fooRepo.save(foo); + } +} \ No newline at end of file diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/Issue77Test.java b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/Issue77Test.java new file mode 100644 index 00000000..01a653fd --- /dev/null +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/issue77/Issue77Test.java @@ -0,0 +1,54 @@ +package org.socialsignin.spring.data.dynamodb.issue77; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.model.UpdateItemResult; + +import static org.mockito.Mockito.*; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes={Issue77Test.TestAppConfig.class}) +public class Issue77Test { + + @Configuration + @ComponentScan(basePackageClasses = FooService.class) + @EnableDynamoDBRepositories(basePackages = "org.socialsignin.spring.data.dynamodb.issue77") + public static class TestAppConfig { + + @Bean + public AmazonDynamoDB amazonDynamoDB() { + AmazonDynamoDB amazonDynamoDB = Mockito.mock(AmazonDynamoDB.class); + UpdateItemResult result = new UpdateItemResult(); + when(amazonDynamoDB.updateItem(any())).thenReturn(result); + + return amazonDynamoDB; + } + } + + @Autowired + FooService fooService; + @Autowired + FooRepository fooRepository; + + @Test + public void testIssue77() { + Foo foo = new Foo(); + + fooService.processFoo(foo); + + assertTrue(fooRepository.isDoNonstandardThingCalled()); + assertTrue(fooRepository.isSaveCalled()); + } +}