1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.socialsignin.spring.data.dynamodb.core;
17
18 import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
19 import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
20 import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
21 import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig.TableNameOverride;
22 import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
23 import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression;
24 import org.junit.Assert;
25 import org.junit.Before;
26 import org.junit.Rule;
27 import org.junit.Test;
28 import org.junit.rules.ExpectedException;
29 import org.junit.runner.RunWith;
30 import org.mockito.Mock;
31 import org.mockito.junit.MockitoJUnitRunner;
32 import org.socialsignin.spring.data.dynamodb.domain.sample.Playlist;
33 import org.socialsignin.spring.data.dynamodb.domain.sample.User;
34 import org.springframework.context.ApplicationContext;
35 import org.springframework.test.util.ReflectionTestUtils;
36
37 import java.util.ArrayList;
38 import java.util.List;
39
40 import static org.junit.Assert.assertEquals;
41 import static org.junit.Assert.assertNotNull;
42 import static org.junit.Assert.assertTrue;
43 import static org.mockito.ArgumentMatchers.anyList;
44 import static org.mockito.ArgumentMatchers.eq;
45 import static org.mockito.Mockito.mock;
46 import static org.mockito.Mockito.verify;
47
48 @RunWith(MockitoJUnitRunner.class)
49 public class DynamoDBTemplateTest {
50 @Rule
51 public ExpectedException expectedException = ExpectedException.none();
52 @Mock
53 private DynamoDBMapper dynamoDBMapper;
54 @Mock
55 private AmazonDynamoDB dynamoDB;
56 @Mock
57 private ApplicationContext applicationContext;
58 @Mock
59 private DynamoDBQueryExpression<User> countUserQuery;
60
61 private DynamoDBTemplate dynamoDBTemplate;
62
63 @Before
64 public void setUp() {
65 this.dynamoDBTemplate = new DynamoDBTemplate(dynamoDB, dynamoDBMapper);
66 this.dynamoDBTemplate.setApplicationContext(applicationContext);
67 }
68
69 @Test
70 public void testConstructorMandatory() {
71 expectedException.expect(IllegalArgumentException.class);
72 expectedException.expectMessage("must not be null!");
73 new DynamoDBTemplate(null);
74 }
75
76 @Test
77 public void testConstructorOptionalAllNull() {
78 dynamoDBTemplate = new DynamoDBTemplate(dynamoDB, null, null);
79
80
81 String userTableName = dynamoDBTemplate.getOverriddenTableName(User.class, "UserTable");
82 assertEquals("user", userTableName);
83 }
84
85 @Test
86 public void testConstructorOptionalPreconfiguredDynamoDBMapper() {
87
88 new DynamoDBTemplate(dynamoDB, dynamoDBMapper);
89
90 assertTrue("The constructor should not fail with an assert error", true);
91 }
92
93 @Test
94 public void testDelete() {
95 User user = new User();
96 dynamoDBTemplate.delete(user);
97
98 verify(dynamoDBMapper).delete(user);
99 }
100
101 @Test
102 public void testBatchDelete_CallsCorrectDynamoDBMapperMethod() {
103 List<User> users = new ArrayList<>();
104 dynamoDBTemplate.batchDelete(users);
105 verify(dynamoDBMapper).batchDelete(anyList());
106 }
107
108 @Test
109 public void testSave() {
110 User user = new User();
111 dynamoDBTemplate.save(user);
112
113 verify(dynamoDBMapper).save(user);
114 }
115
116 @Test
117 public void testBatchSave_CallsCorrectDynamoDBMapperMethod() {
118 List<User> users = new ArrayList<>();
119 dynamoDBTemplate.batchSave(users);
120
121 verify(dynamoDBMapper).batchSave(eq(users));
122 }
123
124 @Test
125 public void testCountQuery() {
126 DynamoDBQueryExpression<User> query = countUserQuery;
127 dynamoDBTemplate.count(User.class, query);
128
129 verify(dynamoDBMapper).count(User.class, query);
130 }
131
132 @Test
133 public void testCountScan() {
134 DynamoDBScanExpression scan = mock(DynamoDBScanExpression.class);
135 int actual = dynamoDBTemplate.count(User.class, scan);
136
137 assertEquals(0, actual);
138 verify(dynamoDBMapper).count(User.class, scan);
139 }
140
141 @Test
142 public void testGetOverriddenTableName_WithTableNameResolver_defaultConfig() {
143 final String overridenTableName = "someOtherTableName";
144
145 DynamoDBMapperConfig.Builder builder = DynamoDBMapperConfig.builder();
146
147 builder.setTableNameOverride(new TableNameOverride(overridenTableName));
148
149 DynamoDBMapperConfig config = new DynamoDBMapperConfig(DynamoDBMapperConfig.DEFAULT, builder.build());
150 DynamoDBTemplate tmpl = new DynamoDBTemplate(dynamoDB, config, dynamoDBMapper);
151
152 String overriddenTableName = tmpl.getOverriddenTableName(User.class, "someTableName");
153 assertEquals(overridenTableName, overriddenTableName);
154
155 DynamoDBMapperConfig effectiveConfig = (DynamoDBMapperConfig) ReflectionTestUtils.getField(tmpl,
156 "dynamoDBMapperConfig");
157 assertDynamoDBMapperConfigCompletness(tmpl);
158 }
159
160 @Test
161 public void testGetOverriddenTableName_WithTableNameResolver_defaultBuilder() {
162 final String overridenTableName = "someOtherTableName";
163
164 DynamoDBMapperConfig.Builder builder = new DynamoDBMapperConfig.Builder();
165
166 builder.setTableNameOverride(new TableNameOverride(overridenTableName));
167
168 DynamoDBTemplate tmpl = new DynamoDBTemplate(dynamoDB, builder.build(), dynamoDBMapper);
169
170 String overriddenTableName = tmpl.getOverriddenTableName(User.class, "someTableName");
171 assertEquals(overridenTableName, overriddenTableName);
172 assertDynamoDBMapperConfigCompletness(tmpl);
173 }
174
175 @Test
176 public void testGetOverriddenTableName_WithTableNameResolver_emptyBuilder() {
177 final String overridenTableName = "someOtherTableName";
178
179 DynamoDBMapperConfig.Builder builder = DynamoDBMapperConfig.builder();
180
181 builder.setTableNameOverride(new TableNameOverride(overridenTableName));
182
183 DynamoDBTemplate tmpl = new DynamoDBTemplate(dynamoDB, builder.build(), dynamoDBMapper);
184
185 String overriddenTableName = tmpl.getOverriddenTableName(User.class, "someTableName");
186 assertEquals(overridenTableName, overriddenTableName);
187 assertDynamoDBMapperConfigCompletness(tmpl);
188 }
189
190 private void assertDynamoDBMapperConfigCompletness(DynamoDBTemplate tmpl) {
191 DynamoDBMapperConfig effectiveConfig = (DynamoDBMapperConfig) ReflectionTestUtils.getField(tmpl,
192 "dynamoDBMapperConfig");
193
194 assertNotNull(effectiveConfig);
195 assertNotNull(effectiveConfig.getConversionSchema());
196 assertNotNull(effectiveConfig.getTypeConverterFactory());
197 }
198
199 @Test
200 public void testLoadByHashKey_WhenDynamoDBMapperReturnsNull() {
201 User user = dynamoDBTemplate.load(User.class, "someHashKey");
202 Assert.assertNull(user);
203 }
204
205 @Test
206 public void testLoadByHashKeyAndRangeKey_WhenDynamoDBMapperReturnsNull() {
207 Playlist playlist = dynamoDBTemplate.load(Playlist.class, "someHashKey", "someRangeKey");
208 Assert.assertNull(playlist);
209 }
210
211 }