Skip to content

Commit 5eb1bdf

Browse files
committed
feat(/series/add): add support for letters for Scott numbers.
Fix #671
1 parent 8cb62db commit 5eb1bdf

File tree

9 files changed

+54
-17
lines changed

9 files changed

+54
-17
lines changed

src/main/java/ru/mystamps/web/feature/series/AddSeriesForm.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ public class AddSeriesForm implements AddSeriesDto, HasImageOrImageUrl, Nullable
113113
@Price
114114
private BigDecimal michelPrice;
115115

116-
@CatalogNumbers
116+
// @todo #671 /series/add: add integration test to check that Scott numbers may contain letters
117+
// @todo #671 /series/add: add integration test for Scott numbers error message
118+
@CatalogNumbers(allowLetters = true)
117119
private String scottNumbers;
118120

119121
@Price

src/main/java/ru/mystamps/web/support/beanvalidation/CatalogNumbers.java

+2
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,6 @@
3737
String message() default "{ru.mystamps.web.support.beanvalidation.CatalogNumbers.message}";
3838
Class<?>[] groups() default {};
3939
Class<? extends Payload>[] payload() default {};
40+
41+
boolean allowLetters() default false;
4042
}

src/main/java/ru/mystamps/web/support/beanvalidation/CatalogNumbersValidator.java

+22-3
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,37 @@ public class CatalogNumbersValidator implements ConstraintValidator<CatalogNumbe
2929
private static final Pattern CATALOG_NUMBERS =
3030
Pattern.compile(ValidationRules.CATALOG_NUMBERS_REGEXP);
3131

32+
private static final Pattern CATALOG_NUMBERS_WITH_LETTERS =
33+
Pattern.compile(ValidationRules.CATALOG_NUMBERS_AND_LETTERS_REGEXP);
34+
35+
private boolean allowLetters;
36+
3237
@Override
3338
public void initialize(CatalogNumbers catalogNumbers) {
34-
// Intentionally empty: nothing to initialize
39+
allowLetters = catalogNumbers.allowLetters();
3540
}
3641

3742
@Override
3843
public boolean isValid(String catalogNumbers, ConstraintValidatorContext ctx) {
3944
if (catalogNumbers == null) {
4045
return true;
4146
}
42-
43-
return CATALOG_NUMBERS.matcher(catalogNumbers).matches();
47+
48+
if (!allowLetters) {
49+
return CATALOG_NUMBERS.matcher(catalogNumbers).matches();
50+
}
51+
52+
boolean matches = CATALOG_NUMBERS_WITH_LETTERS.matcher(catalogNumbers).matches();
53+
if (matches) {
54+
return true;
55+
}
56+
57+
ConstraintViolationUtils.recreate(
58+
ctx,
59+
"{ru.mystamps.web.support.beanvalidation.CatalogNumbers.Alnum.message}"
60+
);
61+
62+
return false;
4463
}
4564

4665
}

src/main/java/ru/mystamps/web/support/beanvalidation/ConstraintViolationUtils.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public static void recreate(
3939
}
4040

4141
/**
42-
* Bind error {@code msgTemplate} to whole form.
42+
* Bind error {@code msgTemplate} to a currently validated object.
4343
*/
4444
public static void recreate(ConstraintValidatorContext ctx, String msgTemplate) {
4545
ctx.disableDefaultConstraintViolation();

src/main/java/ru/mystamps/web/validation/ValidationRules.java

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
import ru.mystamps.web.Db;
2121

22+
// it complains on "PMD.LongVariable"
23+
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
2224
public final class ValidationRules {
2325

2426
public static final int LOGIN_MIN_LENGTH = 2;
@@ -62,6 +64,8 @@ public final class ValidationRules {
6264
public static final int MIN_RELEASE_YEAR = 1840;
6365
public static final int MAX_SERIES_COMMENT_LENGTH = Db.Series.COMMENT_LENGTH;
6466
public static final String CATALOG_NUMBERS_REGEXP = "[1-9][0-9]{0,3}(,[1-9][0-9]{0,3})*";
67+
@SuppressWarnings({ "PMD.LongVariable", "checkstyle:linelength" })
68+
public static final String CATALOG_NUMBERS_AND_LETTERS_REGEXP = "[1-9][0-9]{0,3}[a-z]?(,[1-9][0-9]{0,3}[a-z]?)*";
6569

6670
public static final int PARTICIPANT_NAME_MIN_LENGTH = 3;
6771
public static final int PARTICIPANT_NAME_MAX_LENGTH = Db.TransactionParticipant.NAME_LENGTH;

src/main/resources/ru/mystamps/i18n/ValidationMessages.properties

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ ru.mystamps.web.support.beanvalidation.Email.message = Invalid e-mail address
1212
ru.mystamps.web.support.beanvalidation.NotEmptyFilename.message = Value must not be empty
1313
ru.mystamps.web.support.beanvalidation.NotEmptyFile.message = File must not be empty
1414
ru.mystamps.web.support.beanvalidation.CatalogNumbers.message = Value must be comma delimited numbers
15+
ru.mystamps.web.support.beanvalidation.CatalogNumbers.Alnum.message = Value must be a list of numbers separated by comma. Any number may end with a latin letter in lower case
1516
ru.mystamps.web.support.beanvalidation.NotNullIfFirstField.message = Field '{second}' must not be empty
1617
ru.mystamps.web.support.beanvalidation.Price.message = Invalid value
1718
ru.mystamps.web.support.beanvalidation.ImageFile.message = Cannot detect file type. Must be image in JPEG or PNG format

src/main/resources/ru/mystamps/i18n/ValidationMessages_ru.properties

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ ru.mystamps.web.support.beanvalidation.Email.message = Неправильный
1212
ru.mystamps.web.support.beanvalidation.NotEmptyFilename.message = Поле обязательно для заполнения
1313
ru.mystamps.web.support.beanvalidation.NotEmptyFile.message = Файл не должен быть пустым
1414
ru.mystamps.web.support.beanvalidation.CatalogNumbers.message = Значение должно быть списком чисел через запятую
15+
ru.mystamps.web.support.beanvalidation.CatalogNumbers.Alnum.message = Значение должно быть списком чисел через запятую. Каждое число может оканчиваться латинской буквой в нижнем регистре
1516
ru.mystamps.web.support.beanvalidation.NotNullIfFirstField.message = Поле '{second}' обязательно для заполнения
1617
ru.mystamps.web.support.beanvalidation.Price.message = Некорректное значение
1718
ru.mystamps.web.support.beanvalidation.ImageFile.message = Не удалось определить тип файла. Должен быть изображением в формате JPEG или PNG

src/test/java/ru/mystamps/web/tests/cases/WhenUserAddSeries.java

+19-11
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,12 @@ public void quantityShouldNotBeGreaterThanLimit() {
181181
}
182182

183183
@Test(groups = "invalid", dependsOnGroups = "std", dataProvider = "invalidCatalogNumbers")
184-
public void catalogNumbersShouldRejectInvalidValues(String numbers, String msg) {
184+
public void catalogNumbersShouldRejectInvalidValues(
185+
String numbers,
186+
String msg,
187+
String alnumMsg
188+
) {
189+
185190
page.showCatalogNumbers();
186191

187192
page.fillMichelNumbers(numbers);
@@ -194,7 +199,7 @@ public void catalogNumbersShouldRejectInvalidValues(String numbers, String msg)
194199
page.submit();
195200

196201
assertThat(page).field("michelNumbers").hasError(msg);
197-
assertThat(page).field("scottNumbers").hasError(msg);
202+
assertThat(page).field("scottNumbers").hasError(alnumMsg);
198203
assertThat(page).field("yvertNumbers").hasError(msg);
199204
assertThat(page).field("gibbonsNumbers").hasError(msg);
200205
assertThat(page).field("solovyovNumbers").hasError(msg);
@@ -424,16 +429,19 @@ public Object[][] getInvalidCatalogNumbers() {
424429
String expectedErrorMessage =
425430
tr("ru.mystamps.web.support.beanvalidation.CatalogNumbers.message");
426431

432+
String expectedAlnumErrorMessage =
433+
tr("ru.mystamps.web.support.beanvalidation.CatalogNumbers.Alnum.message");
434+
427435
return new Object[][] {
428-
{"t", expectedErrorMessage},
429-
{"t,t", expectedErrorMessage},
430-
{",1", expectedErrorMessage},
431-
{"1,", expectedErrorMessage},
432-
{"1,,2", expectedErrorMessage},
433-
{"0", expectedErrorMessage},
434-
{"05", expectedErrorMessage},
435-
{"1,09", expectedErrorMessage},
436-
{"10000", expectedErrorMessage}
436+
{"t", expectedErrorMessage, expectedAlnumErrorMessage},
437+
{"t,t", expectedErrorMessage, expectedAlnumErrorMessage},
438+
{",1", expectedErrorMessage, expectedAlnumErrorMessage},
439+
{"1,", expectedErrorMessage, expectedAlnumErrorMessage},
440+
{"1,,2", expectedErrorMessage, expectedAlnumErrorMessage},
441+
{"0", expectedErrorMessage, expectedAlnumErrorMessage},
442+
{"05", expectedErrorMessage, expectedAlnumErrorMessage},
443+
{"1,09", expectedErrorMessage, expectedAlnumErrorMessage},
444+
{"10000", expectedErrorMessage, expectedAlnumErrorMessage}
437445
};
438446
}
439447

src/test/robotframework/series/creation/validation-admin.robot

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ Invalid Catalog Numbers Should Be Rejected
128128
Input Text id=gibbonsNumbers ${catalogNumbers}
129129
Submit Form id=add-series-form
130130
Element Text Should Be id=michelNumbers.errors Value must be comma delimited numbers
131-
Element Text Should Be id=scottNumbers.errors Value must be comma delimited numbers
131+
Element Text Should Be id=scottNumbers.errors Value must be a list of numbers separated by comma. Any number may end with a latin letter in lower case
132132
Element Text Should Be id=yvertNumbers.errors Value must be comma delimited numbers
133133
Element Text Should Be id=gibbonsNumbers.errors Value must be comma delimited numbers
134134

0 commit comments

Comments
 (0)