View Javadoc

1   /**
2    * Copyright © 2018 spring-data-dynamodb (https://github.com/derjust/spring-data-dynamodb)
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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  		// check that the defaults are properly initialized - #108
81  		String userTableName = dynamoDBTemplate.getOverriddenTableName(User.class, "UserTable");
82  		assertEquals("user", userTableName);
83  	}
84  
85  	@Test
86  	public void testConstructorOptionalPreconfiguredDynamoDBMapper() {
87  		// Introduced constructor via #91 should not fail its assert
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 		// Inject the table name overrider bean
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 		// Inject the table name overrider bean
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 		// Inject the table name overrider bean
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 }