Skip to content

Commit 91c9f72

Browse files
committed
test(int-aws-support): S3InboundChannelAdapterParserTest
1 parent 610a2a3 commit 91c9f72

File tree

4 files changed

+151
-0
lines changed

4 files changed

+151
-0
lines changed

int-aws-support/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ dependencies {
1010
compileOnly "io.awspring.cloud:spring-cloud-aws-sqs"
1111
compileOnly "org.springframework.integration:spring-integration-file"
1212
compileOnly "org.springframework.integration:spring-integration-http"
13+
14+
testImplementation "io.github.boolivar:mockito-inline-extension"
1315
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.springframework.integration.aws.support.config.xml.parsers;
2+
3+
import org.bool.junit.mockito.inline.MockitoInlineExtension;
4+
5+
import org.apache.commons.io.IOUtils;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.extension.ExtendWith;
8+
import org.mockito.BDDMockito;
9+
import org.mockito.junit.jupiter.MockitoExtension;
10+
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
11+
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
12+
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
13+
import org.springframework.context.expression.StandardBeanExpressionResolver;
14+
import org.springframework.core.io.ByteArrayResource;
15+
16+
import java.io.IOException;
17+
import java.io.UncheckedIOException;
18+
import java.nio.charset.StandardCharsets;
19+
20+
@ExtendWith(MockitoInlineExtension.class)
21+
@ExtendWith(MockitoExtension.class)
22+
class ParserTestBase extends BDDMockito {
23+
24+
final DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
25+
26+
@BeforeEach
27+
void configureBeanFactory() {
28+
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver());
29+
}
30+
31+
void registerBean(String name, Object bean) {
32+
registerBean(name, bean.getClass(), bean);
33+
}
34+
35+
<T> void registerBean(String name, Class<T> type, Object bean) {
36+
beanFactory.registerBeanDefinition(name, BeanDefinitionBuilder.genericBeanDefinition(type, () -> type.cast(bean)).getBeanDefinition());
37+
}
38+
39+
int parse(String content) {
40+
return new XmlBeanDefinitionReader(beanFactory)
41+
.loadBeanDefinitions(new ByteArrayResource(formatXml(content).getBytes(StandardCharsets.UTF_8)));
42+
}
43+
44+
private String formatXml(String content) {
45+
try {
46+
return IOUtils.resourceToString("/template.xml", StandardCharsets.UTF_8)
47+
.replace("<!-- template -->", content);
48+
} catch (IOException e) {
49+
throw new UncheckedIOException("Error read template.xml", e);
50+
}
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package org.springframework.integration.aws.support.config.xml.parsers;
2+
3+
import org.bool.junit.mockito.inline.ConstructionMock;
4+
5+
import org.assertj.core.api.InstanceOfAssertFactories;
6+
import org.junit.jupiter.api.Test;
7+
import org.mockito.Mock;
8+
import org.mockito.MockedConstruction.Context;
9+
import org.springframework.integration.aws.inbound.S3InboundFileSynchronizer;
10+
import org.springframework.integration.aws.inbound.S3InboundFileSynchronizingMessageSource;
11+
import org.springframework.integration.aws.support.S3SessionFactory;
12+
import org.springframework.integration.file.filters.CompositeFileListFilter;
13+
import org.springframework.integration.file.filters.FileListFilter;
14+
15+
import java.io.File;
16+
import java.util.Comparator;
17+
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
20+
@ConstructionMock({
21+
S3InboundFileSynchronizingMessageSource.class,
22+
S3InboundFileSynchronizer.class
23+
})
24+
class S3InboundChannelAdapterParserTest extends ParserTestBase {
25+
26+
@Mock
27+
private S3SessionFactory sessionFactory;
28+
29+
@Mock
30+
private Comparator<File> comparator;
31+
32+
@Mock
33+
private FileListFilter<File> localFilter;
34+
35+
private S3InboundFileSynchronizer synchronizer;
36+
37+
@Test
38+
void testAdapter() {
39+
registerBean("sf", sessionFactory);
40+
registerBean("cmp", comparator);
41+
registerBean("lf", localFilter);
42+
43+
parse("""
44+
<int-aws:s3-inbound-channel-adapter
45+
id="s3ica"
46+
channel="c"
47+
local-directory="local"
48+
session-factory="sf"
49+
auto-create-local-directory="#{true}"
50+
comparator="cmp"
51+
delete-remote-files="#{true}"
52+
filename-pattern="file*name"
53+
local-filename-generator-expression="file.name"
54+
local-filter="lf"
55+
preserve-timestamp="#{true}"
56+
remote-directory="remote"
57+
remote-file-separator=";"
58+
temporary-file-suffix=".test"
59+
/>
60+
""");
61+
62+
var messageSource = beanFactory.getBean(S3InboundFileSynchronizingMessageSource.class);
63+
64+
verify(messageSource).setLocalDirectory(new File("local"));
65+
verify(messageSource).setLocalFilter(localFilter);
66+
verify(messageSource).setAutoCreateLocalDirectory(true);
67+
68+
verify(synchronizer).setDeleteRemoteFiles(true);
69+
verify(synchronizer).setLocalFilenameGeneratorExpression(assertArg(e -> assertThat(e.getExpressionString()).isEqualTo("file.name")));
70+
verify(synchronizer).setPreserveTimestamp(true);
71+
verify(synchronizer).setRemoteDirectoryExpression(assertArg(e -> assertThat(e.getValue()).isEqualTo("remote")));
72+
verify(synchronizer).setRemoteFileSeparator(";");
73+
verify(synchronizer).setTemporaryFileSuffix(".test");
74+
verify(synchronizer).setFilter(assertArg(f -> assertThat(f).isInstanceOf(CompositeFileListFilter.class)));
75+
}
76+
77+
void testAdapter(S3InboundFileSynchronizingMessageSource mock, Context context) {
78+
assertThat(context.arguments()).asInstanceOf(InstanceOfAssertFactories.LIST)
79+
.contains(synchronizer, comparator);
80+
}
81+
82+
void testAdapter(S3InboundFileSynchronizer mock, Context context) {
83+
assertThat(context.arguments()).asInstanceOf(InstanceOfAssertFactories.LIST)
84+
.contains(sessionFactory);
85+
synchronizer = mock;
86+
}
87+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<beans xmlns="http://www.springframework.org/schema/beans"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:int-aws="http://www.springframework.org/schema/integration/aws"
5+
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
6+
http://www.springframework.org/schema/integration/aws https://www.springframework.org/schema/integration/aws/spring-integration-aws.xsd">
7+
8+
<!-- template -->
9+
10+
</beans>

0 commit comments

Comments
 (0)