Skip to content

Commit c8a16ff

Browse files
authored
Merge pull request #111 from derjust/UnitTests
More unit test coverage - 🎉 above 50% coverage 😊
2 parents 9758b93 + ed9b79c commit c8a16ff

15 files changed

+738
-28
lines changed

pom.xml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
<mockito.version>2.13.0</mockito.version>
2727

2828
<cdi.version>1.2</cdi.version>
29-
<logback.version>1.2.3</logback.version>
29+
<slf4j-test.version>1.2.0</slf4j-test.version>
3030

3131
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3232
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
@@ -79,9 +79,9 @@
7979
</dependency>
8080

8181
<dependency>
82-
<groupId>ch.qos.logback</groupId>
83-
<artifactId>logback-classic</artifactId>
84-
<version>${logback.version}</version>
82+
<groupId>uk.org.lidalia</groupId>
83+
<artifactId>slf4j-test</artifactId>
84+
<version>${slf4j-test.version}</version>
8585
</dependency>
8686

8787
<!-- AWS SDK comes with dependencies to 1.2 and 1.1.3 therefore locking down on 1.2 -->
@@ -145,8 +145,8 @@
145145
<scope>test</scope>
146146
</dependency>
147147
<dependency>
148-
<groupId>ch.qos.logback</groupId>
149-
<artifactId>logback-classic</artifactId>
148+
<groupId>uk.org.lidalia</groupId>
149+
<artifactId>slf4j-test</artifactId>
150150
<scope>test</scope>
151151
</dependency>
152152
</dependencies>

src/main/java/org/socialsignin/spring/data/dynamodb/mapping/event/AbstractDynamoDBEventListener.java

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,16 @@
1616
* limitations under the License.
1717
*/
1818

19+
import com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList;
20+
import com.amazonaws.services.dynamodbv2.datamodeling.PaginatedScanList;
1921
import org.slf4j.Logger;
2022
import org.slf4j.LoggerFactory;
2123
import org.springframework.context.ApplicationListener;
2224
import org.springframework.core.GenericTypeResolver;
2325

26+
import java.util.List;
27+
import java.util.function.Consumer;
28+
2429
/**
2530
* Base class to implement domain class specific {@link ApplicationListener}s.
2631
*
@@ -55,28 +60,46 @@ public void onApplicationEvent(DynamoDBMappingEvent<?> event) {
5560
@SuppressWarnings("unchecked")
5661
E source = (E) event.getSource();
5762

58-
// Check for matching domain type and invoke callbacks
59-
if (source != null && !domainClass.isAssignableFrom(source.getClass())) {
63+
if (source == null) {
6064
return;
6165
}
6266

63-
if (event instanceof BeforeSaveEvent) {
64-
onBeforeSave(source);
65-
} else if (event instanceof AfterSaveEvent) {
66-
onAfterSave(source);
67-
} else if (event instanceof BeforeDeleteEvent) {
68-
onBeforeDelete(source);
69-
} else if (event instanceof AfterDeleteEvent) {
70-
onAfterDelete(source);
71-
} else if (event instanceof AfterLoadEvent) {
72-
onAfterLoad(source);
73-
} else if (event instanceof AfterScanEvent) {
74-
onAfterScan(source);
67+
if (event instanceof AfterScanEvent) {
68+
if (source instanceof PaginatedScanList) {
69+
publishEachElement((PaginatedScanList<?>)source, this::onAfterScan);
70+
}
7571
} else if (event instanceof AfterQueryEvent) {
76-
onAfterQuery(source);
72+
if (source instanceof PaginatedQueryList) {
73+
publishEachElement((PaginatedQueryList<?>)source, this::onAfterQuery);
74+
}
75+
}
76+
// Check for matching domain type and invoke callbacks
77+
else if (domainClass.isAssignableFrom(source.getClass())) {
78+
if (event instanceof BeforeSaveEvent) {
79+
onBeforeSave(source);
80+
} else if (event instanceof AfterSaveEvent) {
81+
onAfterSave(source);
82+
} else if (event instanceof BeforeDeleteEvent) {
83+
onBeforeDelete(source);
84+
} else if (event instanceof AfterDeleteEvent) {
85+
onAfterDelete(source);
86+
} else if (event instanceof AfterLoadEvent) {
87+
onAfterLoad(source);
88+
} else {
89+
assert false;
90+
}
91+
} else {
92+
assert false;
7793
}
7894
}
7995

96+
private void publishEachElement(List<?> list, Consumer<E> publishMethod) {
97+
list.stream()
98+
.filter(o -> domainClass.isAssignableFrom(o.getClass()))
99+
.map(o -> (E)o)
100+
.forEach(publishMethod);
101+
}
102+
80103
public void onBeforeSave(E source) {
81104
if (LOG.isDebugEnabled()) {
82105
LOG.debug("onBeforeSave({}, {})", source);

src/main/java/org/socialsignin/spring/data/dynamodb/mapping/event/ValidatingDynamoDBEventListener.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class ValidatingDynamoDBEventListener extends AbstractDynamoDBEventListen
4646
* @param validator must not be {@literal null}.
4747
*/
4848
public ValidatingDynamoDBEventListener(Validator validator) {
49-
Assert.notNull(validator);
49+
Assert.notNull(validator, "validator must not be null!");
5050
this.validator = validator;
5151
}
5252

@@ -59,16 +59,16 @@ public void onBeforeSave(Object source) {
5959

6060
LOG.debug("Validating object: {}", source);
6161

62-
List<String> messages = new ArrayList<String>();
62+
List<String> messages = new ArrayList<>();
6363
Set<ConstraintViolation<Object>> violations = validator.validate(source);
64-
Set<ConstraintViolation<?>> genericViolationSet = new HashSet<ConstraintViolation<?>>();
6564
if (!violations.isEmpty()) {
65+
Set<ConstraintViolation<?>> genericViolationSet = new HashSet<>();
6666
for (ConstraintViolation<?> v : violations) {
6767
genericViolationSet.add(v);
6868
messages.add(v.toString());
6969
}
7070
LOG.info("During object: {} validation violations found: {}", source, violations);
71-
throw new ConstraintViolationException(messages.toString(),genericViolationSet);
71+
throw new ConstraintViolationException(messages.toString(), genericViolationSet);
7272
}
7373
}
7474
}

src/main/java/org/socialsignin/spring/data/dynamodb/query/AbstractQuery.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
*/
2525
public abstract class AbstractQuery<T> implements Query<T> {
2626

27-
//protected DynamoDBMapper dynamoDBMapper;
2827
protected DynamoDBOperations dynamoDBOperations;
2928
protected Class<T> clazz;
3029
protected boolean scanEnabled = false;
@@ -51,7 +50,6 @@ public boolean isScanEnabled() {
5150
}
5251

5352
public AbstractQuery(DynamoDBOperations dynamoDBOperations, Class<T> clazz) {
54-
//this.dynamoDBMapper = dynamoDBMapper;
5553
this.dynamoDBOperations = dynamoDBOperations;
5654
this.clazz = clazz;
5755
}

src/main/java/org/socialsignin/spring/data/dynamodb/repository/cdi/DynamoDBRepositoryBean.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ class DynamoDBRepositoryBean<T> extends CdiRepositoryBean<T> {
5757
* must not be {@literal null}.
5858
*/
5959
DynamoDBRepositoryBean(BeanManager beanManager, Bean<AmazonDynamoDB> amazonDynamoDBBean,
60-
Bean<DynamoDBMapperConfig> dynamoDBMapperConfigBean,Bean<DynamoDBOperations> dynamoDBOperationsBean, Set<Annotation> qualifiers, Class<T> repositoryType) {
60+
Bean<DynamoDBMapperConfig> dynamoDBMapperConfigBean, Bean<DynamoDBOperations> dynamoDBOperationsBean,
61+
Set<Annotation> qualifiers, Class<T> repositoryType) {
6162

6263
super(qualifiers, repositoryType, beanManager);
6364
if (dynamoDBOperationsBean == null)
@@ -103,4 +104,5 @@ public T create(CreationalContext<T> creationalContext, Class<T> repositoryType)
103104
DynamoDBRepositoryFactory factory = new DynamoDBRepositoryFactory(dynamoDBOperations);
104105
return factory.getRepository(repositoryType);
105106
}
107+
106108
}
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package org.socialsignin.spring.data.dynamodb.mapping.event;
2+
3+
import com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList;
4+
import com.amazonaws.services.dynamodbv2.datamodeling.PaginatedScanList;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
import org.mockito.Mock;
9+
import org.mockito.Mockito;
10+
import org.mockito.junit.MockitoJUnitRunner;
11+
import org.socialsignin.spring.data.dynamodb.domain.sample.User;
12+
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
16+
import static org.mockito.Mockito.any;
17+
import static org.mockito.Mockito.never;
18+
import static org.mockito.Mockito.verify;
19+
import static org.mockito.Mockito.when;
20+
21+
@RunWith(MockitoJUnitRunner.class)
22+
public class AbstractDynamoDBEventListenerTest {
23+
24+
private User sampleEntity = new User();
25+
@Mock
26+
private PaginatedQueryList<User> sampleQueryList;
27+
@Mock
28+
private PaginatedScanList<User> sampleScanList;
29+
30+
private AbstractDynamoDBEventListener underTest;
31+
32+
@Before
33+
public void setUp() {
34+
underTest = Mockito.spy(new AbstractDynamoDBEventListener<User>() {
35+
});
36+
37+
List<User> queryList = new ArrayList<>();
38+
queryList.add(sampleEntity);
39+
when(sampleQueryList.stream()).thenReturn(queryList.stream());
40+
when(sampleScanList.stream()).thenReturn(queryList.stream());
41+
}
42+
43+
@Test
44+
public void testAfterDelete() {
45+
underTest.onApplicationEvent(new AfterDeleteEvent(sampleEntity));
46+
47+
verify(underTest).onAfterDelete(sampleEntity);
48+
verify(underTest, never()).onAfterLoad(any());
49+
verify(underTest, never()).onAfterQuery(any());
50+
verify(underTest, never()).onAfterSave(any());
51+
verify(underTest, never()).onAfterScan(any());
52+
verify(underTest, never()).onBeforeDelete(any());
53+
verify(underTest, never()).onBeforeSave(any());
54+
}
55+
56+
@Test
57+
public void testAfterLoad() {
58+
underTest.onApplicationEvent(new AfterLoadEvent(sampleEntity));
59+
60+
verify(underTest, never()).onAfterDelete(any());
61+
verify(underTest).onAfterLoad(sampleEntity);
62+
verify(underTest, never()).onAfterQuery(any());
63+
verify(underTest, never()).onAfterSave(any());
64+
verify(underTest, never()).onAfterScan(any());
65+
verify(underTest, never()).onBeforeDelete(any());
66+
verify(underTest, never()).onBeforeSave(any());
67+
}
68+
69+
@Test
70+
public void testAfterQuery() {
71+
underTest.onApplicationEvent(new AfterQueryEvent(sampleQueryList));
72+
73+
verify(underTest, never()).onAfterDelete(any());
74+
verify(underTest, never()).onAfterLoad(any());
75+
verify(underTest).onAfterQuery(sampleEntity);
76+
verify(underTest, never()).onAfterSave(any());
77+
verify(underTest, never()).onAfterScan(any());
78+
verify(underTest, never()).onBeforeDelete(any());
79+
verify(underTest, never()).onBeforeSave(any());
80+
}
81+
82+
@Test
83+
public void testAfterSave() {
84+
underTest.onApplicationEvent(new AfterSaveEvent(sampleEntity));
85+
86+
verify(underTest, never()).onAfterDelete(any());
87+
verify(underTest, never()).onAfterLoad(any());
88+
verify(underTest, never()).onAfterQuery(any());
89+
verify(underTest).onAfterSave(sampleEntity);
90+
verify(underTest, never()).onAfterScan(any());
91+
verify(underTest, never()).onBeforeDelete(any());
92+
verify(underTest, never()).onBeforeSave(any());
93+
}
94+
95+
@Test
96+
public void testAfterScan() {
97+
underTest.onApplicationEvent(new AfterScanEvent(sampleScanList));
98+
99+
verify(underTest, never()).onAfterDelete(any());
100+
verify(underTest, never()).onAfterLoad(any());
101+
verify(underTest, never()).onAfterQuery(any());
102+
verify(underTest, never()).onAfterSave(any());
103+
verify(underTest).onAfterScan(sampleEntity);
104+
verify(underTest, never()).onBeforeDelete(any());
105+
verify(underTest, never()).onBeforeSave(any());
106+
}
107+
108+
@Test
109+
public void testBeforeDelete() {
110+
underTest.onApplicationEvent(new BeforeDeleteEvent(sampleEntity));
111+
112+
verify(underTest, never()).onAfterDelete(any());
113+
verify(underTest, never()).onAfterLoad(any());
114+
verify(underTest, never()).onAfterQuery(any());
115+
verify(underTest, never()).onAfterSave(any());
116+
verify(underTest, never()).onAfterScan(any());
117+
verify(underTest).onBeforeDelete(sampleEntity);
118+
verify(underTest, never()).onBeforeSave(any());
119+
}
120+
121+
@Test
122+
public void testBeforeSave() {
123+
underTest.onApplicationEvent(new BeforeSaveEvent(sampleEntity));
124+
125+
verify(underTest, never()).onAfterDelete(any());
126+
verify(underTest, never()).onAfterLoad(any());
127+
verify(underTest, never()).onAfterQuery(any());
128+
verify(underTest, never()).onAfterSave(any());
129+
verify(underTest, never()).onAfterScan(any());
130+
verify(underTest, never()).onBeforeDelete(any());
131+
verify(underTest).onBeforeSave(sampleEntity);
132+
}
133+
134+
135+
136+
137+
}

0 commit comments

Comments
 (0)