Skip to content

Commit 3901f45

Browse files
committed
refactor(SeriesInfoExtractorServiceImplTest): make extractReleaseYear() more generic and rename it.
Part of #1287
1 parent 326f3a4 commit 3901f45

File tree

2 files changed

+45
-43
lines changed

2 files changed

+45
-43
lines changed

src/main/java/ru/mystamps/web/feature/series/importing/SeriesInfoExtractorServiceImpl.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.Collections;
3737
import java.util.LinkedHashSet;
3838
import java.util.List;
39+
import java.util.Map;
3940
import java.util.Set;
4041
import java.util.regex.Matcher;
4142
import java.util.regex.Pattern;
@@ -47,12 +48,13 @@
4748
@SuppressWarnings({ "PMD.TooManyMethods", "PMD.GodClass" })
4849
public class SeriesInfoExtractorServiceImpl implements SeriesInfoExtractorService {
4950

50-
// Related to RELEASE_YEAR_REGEXP and used in unit tests.
51+
// Related to RELEASE_DATE_REGEXP and used in unit tests.
5152
protected static final int MAX_SUPPORTED_RELEASE_YEAR = 2099;
5253

53-
// Regular expression matches release year of the stamps (from 1840 till 2099).
54+
// Regular expression matches release date of the stamps.
55+
// Year should be in range within 1840 and 2099 inclusive.
5456
// CheckStyle: ignore LineLength for next 2 lines
55-
private static final Pattern RELEASE_YEAR_REGEXP =
57+
private static final Pattern RELEASE_DATE_REGEXP =
5658
Pattern.compile("([0-9]{2}\\.[0-9]{2}\\.)?(?<year>18[4-9][0-9]|19[0-9]{2}|20[0-9]{2})(г(од|\\.)?)?");
5759

5860
// Regular expression matches number of the stamps in a series (from 1 to 999).
@@ -101,7 +103,7 @@ public class SeriesInfoExtractorServiceImpl implements SeriesInfoExtractorServic
101103
public SeriesExtractedInfo extract(String pageUrl, RawParsedDataDto data) {
102104
List<Integer> categoryIds = extractCategory(data.getCategoryName());
103105
List<Integer> countryIds = extractCountry(data.getCountryName());
104-
Integer releaseYear = extractReleaseYear(data.getIssueDate());
106+
Map<String, Integer> releaseDate = extractIssueDate(data.getIssueDate());
105107
Integer quantity = extractQuantity(data.getQuantity());
106108
Boolean perforated = extractPerforated(data.getPerforated());
107109
Set<String> michelNumbers = extractMichelNumbers(data.getMichelNumbers());
@@ -117,7 +119,7 @@ public SeriesExtractedInfo extract(String pageUrl, RawParsedDataDto data) {
117119
return new SeriesExtractedInfo(
118120
categoryIds,
119121
countryIds,
120-
releaseYear,
122+
releaseDate.get("year"),
121123
quantity,
122124
perforated,
123125
michelNumbers,
@@ -214,33 +216,33 @@ public SeriesExtractedInfo extract(String pageUrl, RawParsedDataDto data) {
214216
return Collections.emptyList();
215217
}
216218

217-
/* default */ Integer extractReleaseYear(String fragment) {
219+
/* default */ Map<String, Integer> extractIssueDate(String fragment) {
218220
if (StringUtils.isBlank(fragment)) {
219-
return null;
221+
return Collections.emptyMap();
220222
}
221223

222-
log.debug("Determine release year from '{}'", fragment);
224+
log.debug("Determine release date from '{}'", fragment);
223225

224226
String[] candidates = StringUtils.split(fragment, " \t,");
225227
for (String candidate : candidates) {
226-
Matcher matcher = RELEASE_YEAR_REGEXP.matcher(candidate);
228+
Matcher matcher = RELEASE_DATE_REGEXP.matcher(candidate);
227229
if (!matcher.matches()) {
228230
continue;
229231
}
230232

231233
try {
232234
Integer year = Integer.valueOf(matcher.group("year"));
233235
log.debug("Release year is {}", year);
234-
return year;
236+
return Collections.singletonMap("year", year);
235237

236238
} catch (NumberFormatException ignored) { // NOPMD: EmptyCatchBlock
237239
// continue with the next element
238240
}
239241
}
240242

241-
log.debug("Could not extract release year from a fragment");
243+
log.debug("Could not extract release date from a fragment");
242244

243-
return null;
245+
return Collections.emptyMap();
244246
}
245247

246248
/* default */ Integer extractQuantity(String fragment) {

src/test/groovy/ru/mystamps/web/feature/series/importing/SeriesInfoExtractorServiceImplTest.groovy

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -230,59 +230,59 @@ class SeriesInfoExtractorServiceImplTest extends Specification {
230230
}
231231

232232
//
233-
// Tests for extractReleaseYear()
233+
// Tests for extractIssueDate()
234234
//
235235

236-
def 'extractReleaseYear() should return null when fragment is null, empty or blank'() {
236+
def 'extractIssueDate() should return empty map when fragment is null, empty or blank'() {
237237
given:
238238
String fragment = nullOrBlank()
239239
when:
240-
Integer year = service.extractReleaseYear(fragment)
240+
Map<String, Integer> date = service.extractIssueDate(fragment)
241241
then:
242-
year == null
242+
date.isEmpty()
243243
}
244244

245-
def 'extractReleaseYear() should extract year from XIX century'() {
245+
def 'extractIssueDate() should extract year from XIX century'() {
246246
given:
247247
Integer expectedYear = between(SeriesValidation.MIN_RELEASE_YEAR, 1899).integer()
248248
and:
249249
String fragment = String.valueOf(expectedYear)
250250
when:
251-
Integer year = service.extractReleaseYear(fragment)
251+
Map<String, Integer> date = service.extractIssueDate(fragment)
252252
then:
253-
year == expectedYear
253+
date.get('year') == expectedYear
254254
}
255255

256-
def 'extractReleaseYear() should extract year from XX century'() {
256+
def 'extractIssueDate() should extract year from XX century'() {
257257
given:
258258
Integer expectedYear = between(1900, 1999).integer()
259259
and:
260260
String fragment = String.valueOf(expectedYear)
261261
when:
262-
Integer year = service.extractReleaseYear(fragment)
262+
Map<String, Integer> date = service.extractIssueDate(fragment)
263263
then:
264-
year == expectedYear
264+
date.get('year') == expectedYear
265265
}
266266

267-
def 'extractReleaseYear() should extract year from XXI century'() {
267+
def 'extractIssueDate() should extract year from XXI century'() {
268268
given:
269269
Integer expectedYear = between(2000, MAX_SUPPORTED_RELEASE_YEAR).integer()
270270
and:
271271
String fragment = String.valueOf(expectedYear)
272272
when:
273-
Integer year = service.extractReleaseYear(fragment)
273+
Map<String, Integer> date = service.extractIssueDate(fragment)
274274
then:
275-
year == expectedYear
275+
date.get('year') == expectedYear
276276
}
277277

278278
@Unroll
279-
def 'extractReleaseYear() should extract date from "#fragment"'(String fragment) {
279+
def 'extractIssueDate() should extract date from "#fragment"'(String fragment) {
280280
given:
281281
Integer expectedYear = 2010 // should be in sync with examples below
282282
when:
283-
Integer year = service.extractReleaseYear(fragment)
283+
Map<String, Integer> date = service.extractIssueDate(fragment)
284284
then:
285-
year == expectedYear
285+
date.get('year') == expectedYear
286286
where:
287287
fragment | _
288288
'italy 2010' | _
@@ -299,7 +299,7 @@ class SeriesInfoExtractorServiceImplTest extends Specification {
299299
}
300300

301301
@SuppressWarnings('UnnecessaryGetter')
302-
def 'extractReleaseYear() should return the first year if there are many'() {
302+
def 'extractIssueDate() should return the first year if there are many'() {
303303
given:
304304
Integer currentYear = Year.now().getValue()
305305
Integer expectedYear = between(SeriesValidation.MIN_RELEASE_YEAR, currentYear).integer()
@@ -308,13 +308,13 @@ class SeriesInfoExtractorServiceImplTest extends Specification {
308308
and:
309309
String fragment = String.format('%d %d', expectedYear, anotherYear)
310310
when:
311-
Integer year = service.extractReleaseYear(fragment)
311+
Map<String, Integer> date = service.extractIssueDate(fragment)
312312
then:
313-
year == expectedYear
313+
date.get('year') == expectedYear
314314
}
315315

316316
@SuppressWarnings('UnnecessaryGetter')
317-
def 'extractReleaseYear() should skip invalid date'() {
317+
def 'extractIssueDate() should skip invalid date'() {
318318
given:
319319
Integer unsupportedYearInPast = between(0, SeriesValidation.MIN_RELEASE_YEAR - 1).integer()
320320
Integer unsupportedYearInFuture = between(MAX_SUPPORTED_RELEASE_YEAR + 1, Integer.MAX_VALUE).integer()
@@ -325,37 +325,37 @@ class SeriesInfoExtractorServiceImplTest extends Specification {
325325
and:
326326
String fragment = String.format('%d %d', unsupportedYear, expectedYear)
327327
when:
328-
Integer year = service.extractReleaseYear(fragment)
328+
Map<String, Integer> date = service.extractIssueDate(fragment)
329329
then:
330-
year == expectedYear
330+
date.get('year') == expectedYear
331331
}
332332

333-
def 'extractReleaseYear() shouldn\'t extract dates before 1840'() {
333+
def 'extractIssueDate() shouldn\'t extract dates before 1840'() {
334334
given:
335335
Integer unsupportedYear = between(0, SeriesValidation.MIN_RELEASE_YEAR - 1).integer()
336336
String fragment = String.valueOf(unsupportedYear)
337337
when:
338-
Integer year = service.extractReleaseYear(fragment)
338+
Map<String, Integer> date = service.extractIssueDate(fragment)
339339
then:
340-
year == null
340+
date.isEmpty()
341341
}
342342

343-
def 'extractReleaseYear() shouldn\'t extract dates after 2099'() {
343+
def 'extractIssueDate() shouldn\'t extract dates after 2099'() {
344344
given:
345345
Integer unsupportedYear = between(MAX_SUPPORTED_RELEASE_YEAR + 1, Integer.MAX_VALUE).integer()
346346
String fragment = String.valueOf(unsupportedYear)
347347
when:
348-
Integer year = service.extractReleaseYear(fragment)
348+
Map<String, Integer> date = service.extractIssueDate(fragment)
349349
then:
350-
year == null
350+
date.isEmpty()
351351
}
352352

353353
@Unroll
354-
def 'extractReleaseYear() shouldn\'t extract date from "#fragment"'(String fragment) {
354+
def 'extractIssueDate() shouldn\'t extract date from "#fragment"'(String fragment) {
355355
when:
356-
Integer year = service.extractReleaseYear(fragment)
356+
Map<String, Integer> date = service.extractIssueDate(fragment)
357357
then:
358-
year == null
358+
date.isEmpty()
359359
where:
360360
fragment | _
361361
'-2000' | _

0 commit comments

Comments
 (0)