Skip to content

Commit f33b197

Browse files
committed
Support custom conversions for the mapped Item fields
- Added tests Closes gh-115
1 parent 79dd67f commit f33b197

File tree

8 files changed

+1360
-10
lines changed

8 files changed

+1360
-10
lines changed

src/main/java/ru/rt/restream/reindexer/convert/FieldConverterRegistryFactory.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,20 @@ public void registerGlobalConverter(FieldConverter<?, ?> converter) {
160160
}
161161
}
162162

163+
/**
164+
* For testing purposes only.
165+
*/
166+
void clearRegistry() {
167+
lock.writeLock().lock();
168+
try {
169+
converters.clear();
170+
fieldConverters.clear();
171+
globalConverters.clear();
172+
} finally {
173+
lock.writeLock().unlock();
174+
}
175+
}
176+
163177
private FieldConverter<?, ?> instantiateFieldConverter(Class<?> converterClass) {
164178
try {
165179
Constructor<?> constructor = converterClass.getDeclaredConstructor();

src/test/java/ru/rt/restream/reindexer/connector/ReindexerTest.java

Lines changed: 332 additions & 10 deletions
Large diffs are not rendered by default.
Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
/*
2+
* Copyright 2020 Restream
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 ru.rt.restream.reindexer.convert;
17+
18+
import org.apache.commons.lang3.reflect.FieldUtils;
19+
import org.junit.jupiter.api.AfterEach;
20+
import org.junit.jupiter.api.Test;
21+
import ru.rt.restream.reindexer.annotations.Convert;
22+
23+
import java.lang.reflect.Field;
24+
25+
import static org.hamcrest.MatcherAssert.assertThat;
26+
import static org.hamcrest.Matchers.instanceOf;
27+
import static org.hamcrest.Matchers.is;
28+
import static org.hamcrest.Matchers.notNullValue;
29+
import static org.hamcrest.Matchers.nullValue;
30+
import static org.hamcrest.Matchers.sameInstance;
31+
import static org.junit.jupiter.api.Assertions.assertThrows;
32+
33+
/**
34+
* Tests for {@link FieldConverterRegistryFactory}.
35+
*/
36+
public class FieldConverterRegistryFactoryTest {
37+
38+
private final FieldConverterRegistryFactory registry = FieldConverterRegistryFactory.INSTANCE;
39+
40+
@AfterEach
41+
void tearDown() {
42+
registry.clearRegistry();
43+
}
44+
45+
@Test
46+
void getFieldConverterWhenClassSpecifiedThenCreated() {
47+
FieldConverter<String, String> converter = registry
48+
.getFieldConverter(getField("stringLongConvertField"));
49+
assertThat(converter, notNullValue());
50+
assertThat(converter, instanceOf(StringLongFieldConverter.class));
51+
}
52+
53+
@Test
54+
void getFieldConverterWhenClassSpecifiedConverterConfiguredThenConfiguredConverterTakesPrecedence() {
55+
StringIntegerFieldConverter converter = new StringIntegerFieldConverter();
56+
registry.registerFieldConverter(TestPojo.class, "stringLongConvertField", converter);
57+
FieldConverter<String, String> fieldConverter = registry
58+
.getFieldConverter(getField("stringLongConvertField"));
59+
assertThat(fieldConverter, notNullValue());
60+
assertThat(fieldConverter, sameInstance(converter));
61+
}
62+
63+
@Test
64+
void getFieldConverterWhenClassSpecifiedSameGlobalConverterConfiguredThenConverterReturned() {
65+
StringLongFieldConverter converter = new StringLongFieldConverter();
66+
registry.registerGlobalConverter(converter);
67+
FieldConverter<String, String> fieldConverter = registry
68+
.getFieldConverter(getField("stringLongConvertField"));
69+
assertThat(fieldConverter, notNullValue());
70+
assertThat(fieldConverter, sameInstance(converter));
71+
}
72+
73+
@Test
74+
void getFieldConverterWhenNoConvertAnnotationFieldConverterConfiguredThenConverterReturned() {
75+
StringLongFieldConverter converter = new StringLongFieldConverter();
76+
registry.registerFieldConverter(TestPojo.class, "stringField", converter);
77+
FieldConverter<String, String> fieldConverter = registry
78+
.getFieldConverter(getField("stringField"));
79+
assertThat(fieldConverter, notNullValue());
80+
assertThat(fieldConverter, sameInstance(converter));
81+
}
82+
83+
@Test
84+
void getFieldConverterWhenNoConvertAnnotationGlobalConverterConfiguredThenConverterReturned() {
85+
StringLongFieldConverter converter = new StringLongFieldConverter();
86+
registry.registerGlobalConverter(converter);
87+
FieldConverter<String, String> fieldConverter = registry
88+
.getFieldConverter(getField("stringField"));
89+
assertThat(fieldConverter, notNullValue());
90+
assertThat(fieldConverter, sameInstance(converter));
91+
}
92+
93+
@Test
94+
void getFieldConverterWhenClassSpecifiedGlobalConverterConfiguredThenSpecifiedTakesPrecedence() {
95+
StringLongFieldConverter converter = new StringLongFieldConverter();
96+
registry.registerGlobalConverter(converter);
97+
FieldConverter<String, String> fieldConverter = registry
98+
.getFieldConverter(getField("stringIntegerConvertField"));
99+
assertThat(fieldConverter, notNullValue());
100+
assertThat(fieldConverter, instanceOf(StringIntegerFieldConverter.class));
101+
}
102+
103+
@Test
104+
void getFieldConverterWhenNoClassSpecifiedGlobalConverterConfiguredThenConverterReturned() {
105+
StringLongFieldConverter converter = new StringLongFieldConverter();
106+
registry.registerGlobalConverter(converter);
107+
FieldConverter<String, String> fieldConverter = registry
108+
.getFieldConverter(getField("stringConvertNoClassField"));
109+
assertThat(fieldConverter, notNullValue());
110+
assertThat(fieldConverter, sameInstance(converter));
111+
}
112+
113+
@Test
114+
void getFieldConverterWhenNoConvertAnnotationThenNull() {
115+
FieldConverter<String, String> fieldConverter = registry
116+
.getFieldConverter(getField("stringField"));
117+
assertThat(fieldConverter, nullValue());
118+
}
119+
120+
@Test
121+
void getFieldConverterWhenDisableConversionAndGlobalConverterConfiguredThenNull() {
122+
StringLongFieldConverter converter = new StringLongFieldConverter();
123+
registry.registerGlobalConverter(converter);
124+
FieldConverter<String, String> fieldConverter = registry
125+
.getFieldConverter(getField("stringConvertDisableField"));
126+
assertThat(fieldConverter, nullValue());
127+
}
128+
129+
@Test
130+
void getFieldConverterWhenDisableConversionAndFieldConverterConfiguredThenNull() {
131+
StringLongFieldConverter converter = new StringLongFieldConverter();
132+
registry.registerFieldConverter(TestPojo.class, "stringConvertDisableConversionField", converter);
133+
FieldConverter<String, String> fieldConverter = registry
134+
.getFieldConverter(getField("stringConvertDisableField"));
135+
assertThat(fieldConverter, nullValue());
136+
}
137+
138+
@Test
139+
void getFieldConverterWhenDisableConversionAndClassSpecifiedThenNull() {
140+
StringLongFieldConverter converter = new StringLongFieldConverter();
141+
registry.registerFieldConverter(TestPojo.class, "stringConvertDisableConversionClassSpecifiedField", converter);
142+
FieldConverter<String, String> fieldConverter = registry
143+
.getFieldConverter(getField("stringConvertDisableClassSpecifiedField"));
144+
assertThat(fieldConverter, nullValue());
145+
}
146+
147+
@Test
148+
void registerFieldConverterWhenRegisteredThenOverrides() {
149+
FieldConverter<String, Long> stringLongFieldConverter = new StringLongFieldConverter();
150+
registry.registerFieldConverter(TestPojo.class, "stringField", stringLongFieldConverter);
151+
Field field = getField("stringField");
152+
FieldConverter<String, String> fieldConverter = registry.getFieldConverter(field);
153+
assertThat(fieldConverter, notNullValue());
154+
assertThat(fieldConverter, sameInstance(stringLongFieldConverter));
155+
StringIntegerFieldConverter stringIntegerFieldConverter = new StringIntegerFieldConverter();
156+
registry.registerFieldConverter(TestPojo.class, "stringField", stringIntegerFieldConverter);
157+
fieldConverter = registry.getFieldConverter(field);
158+
assertThat(fieldConverter, notNullValue());
159+
assertThat(fieldConverter, sameInstance(stringIntegerFieldConverter));
160+
}
161+
162+
@Test
163+
void registerGlobalConverterWhenRegisteredThenOverrides() {
164+
FieldConverter<String, Long> stringLongFieldConverter = new StringLongFieldConverter();
165+
registry.registerGlobalConverter(stringLongFieldConverter);
166+
Field field = getField("stringField");
167+
FieldConverter<String, String> fieldConverter = registry
168+
.getFieldConverter(field);
169+
assertThat(fieldConverter, notNullValue());
170+
assertThat(fieldConverter, sameInstance(stringLongFieldConverter));
171+
StringIntegerFieldConverter stringIntegerFieldConverter = new StringIntegerFieldConverter();
172+
registry.registerGlobalConverter(stringIntegerFieldConverter);
173+
fieldConverter = registry.getFieldConverter(field);
174+
assertThat(fieldConverter, notNullValue());
175+
assertThat(fieldConverter, sameInstance(stringIntegerFieldConverter));
176+
}
177+
178+
@Test
179+
void getFieldConverterWhenFieldNullThenException() {
180+
NullPointerException exception = assertThrows(NullPointerException.class, () -> registry.getFieldConverter(null));
181+
assertThat(exception.getMessage(), is("field must not be null"));
182+
}
183+
184+
@Test
185+
void registerFieldConverterWhenItemClassNullThenException() {
186+
NullPointerException exception = assertThrows(NullPointerException.class, () -> registry
187+
.registerFieldConverter(null, "stringField", new StringLongFieldConverter()));
188+
assertThat(exception.getMessage(), is("itemClass must not be null"));
189+
}
190+
191+
@Test
192+
void registerFieldConverterWhenFieldNameNullThenException() {
193+
NullPointerException exception = assertThrows(NullPointerException.class, () -> registry
194+
.registerFieldConverter(TestPojo.class, null, new StringLongFieldConverter()));
195+
assertThat(exception.getMessage(), is("fieldName must not be null"));
196+
}
197+
198+
@Test
199+
void registerFieldConverterWhenConverterNullThenException() {
200+
NullPointerException exception = assertThrows(NullPointerException.class, () -> registry
201+
.registerFieldConverter(TestPojo.class, "stringField", null));
202+
assertThat(exception.getMessage(), is("fieldConverter must not be null"));
203+
}
204+
205+
@Test
206+
void registerGlobalConverterWhenConverterNullThenException() {
207+
NullPointerException exception = assertThrows(NullPointerException.class, () -> registry
208+
.registerGlobalConverter(null));
209+
assertThat(exception.getMessage(), is("converter must not be null"));
210+
}
211+
212+
private static Field getField(String name) {
213+
return FieldUtils.getDeclaredField(TestPojo.class, name, true);
214+
}
215+
216+
static class TestPojo {
217+
@Convert(converterClass = StringLongFieldConverter.class)
218+
String stringLongConvertField;
219+
@Convert(converterClass = StringIntegerFieldConverter.class)
220+
String stringIntegerConvertField;
221+
@Convert
222+
String stringConvertNoClassField;
223+
@Convert(disableConversion = true)
224+
String stringConvertDisableField;
225+
@Convert(disableConversion = true, converterClass = StringLongFieldConverter.class)
226+
String stringConvertDisableClassSpecifiedField;
227+
String stringField;
228+
}
229+
230+
static class StringLongFieldConverter implements FieldConverter<String, Long> {
231+
232+
@Override
233+
public String convertToFieldType(Long dbData) {
234+
return "";
235+
}
236+
237+
@Override
238+
public Long convertToDatabaseType(String field) {
239+
return 0L;
240+
}
241+
}
242+
243+
static class StringIntegerFieldConverter implements FieldConverter<String, Integer> {
244+
245+
@Override
246+
public String convertToFieldType(Integer dbData) {
247+
return "";
248+
}
249+
250+
@Override
251+
public Integer convertToDatabaseType(String field) {
252+
return 0;
253+
}
254+
}
255+
}

0 commit comments

Comments
 (0)