From a433132cfc31e2abfec45571e5c0ef848a944ab7 Mon Sep 17 00:00:00 2001 From: Tomasz Date: Sat, 9 Jul 2022 19:45:31 +0100 Subject: [PATCH 1/6] 1532 Do not allow words that are digits --- .../content/word/WordCreateController.java | 25 +++++++++++++------ .../webapp/WEB-INF/i18n/errors_en.properties | 1 + 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/ai/elimu/web/content/word/WordCreateController.java b/src/main/java/ai/elimu/web/content/word/WordCreateController.java index 667d757f6..92af84e08 100644 --- a/src/main/java/ai/elimu/web/content/word/WordCreateController.java +++ b/src/main/java/ai/elimu/web/content/word/WordCreateController.java @@ -113,14 +113,7 @@ public String handleSubmit( Model model) { logger.info("handleSubmit"); - Word existingWord = wordDao.readByText(word.getText()); - if (existingWord != null) { - result.rejectValue("text", "NonUnique"); - } - - if (StringUtils.containsAny(word.getText(), " ")) { - result.rejectValue("text", "WordSpace"); - } + validWord(word, result); if (result.hasErrors()) { model.addAttribute("word", word); @@ -272,4 +265,20 @@ private void autoSelectLetterSoundCorrespondences(Word word) { word.setLetterSoundCorrespondences(letterSoundCorrespondences); } + + private void validWord(Word word, BindingResult result) { + Word existingWord = wordDao.readByText(word.getText()); + + if (existingWord != null) { + result.rejectValue("text", "NonUnique"); + } + + if (StringUtils.containsAny(word.getText(), " ")) { + result.rejectValue("text", "WordSpace"); + } + + if (word.getText().matches(".*[0-9].*")) { + result.rejectValue("text", "WordContainsNumber"); + } + } } diff --git a/src/main/webapp/WEB-INF/i18n/errors_en.properties b/src/main/webapp/WEB-INF/i18n/errors_en.properties index 63b76e5be..9c073204d 100644 --- a/src/main/webapp/WEB-INF/i18n/errors_en.properties +++ b/src/main/webapp/WEB-INF/i18n/errors_en.properties @@ -32,3 +32,4 @@ formatHint.Integer=Number (e.g. "5000") image.too.small=The image width must be at least 640px emoji.unicode.version=Only emojis up to Unicode version 9 WordSpace=Spaces are not allowed +WordContainsNumber=Word contain number From fcd512d1cdcfbee3b7b759b44ada01c3ff5d051c Mon Sep 17 00:00:00 2001 From: Tomasz Date: Thu, 21 Jul 2022 15:26:03 +0100 Subject: [PATCH 2/6] 1532 Do not allow words that are digits --- .../ai/elimu/web/content/word/WordCreateController.java | 6 +++--- src/main/webapp/WEB-INF/i18n/errors_en.properties | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/ai/elimu/web/content/word/WordCreateController.java b/src/main/java/ai/elimu/web/content/word/WordCreateController.java index 92af84e08..c4411fd3a 100644 --- a/src/main/java/ai/elimu/web/content/word/WordCreateController.java +++ b/src/main/java/ai/elimu/web/content/word/WordCreateController.java @@ -113,7 +113,7 @@ public String handleSubmit( Model model) { logger.info("handleSubmit"); - validWord(word, result); + validateWord(word, result); if (result.hasErrors()) { model.addAttribute("word", word); @@ -266,7 +266,7 @@ private void autoSelectLetterSoundCorrespondences(Word word) { word.setLetterSoundCorrespondences(letterSoundCorrespondences); } - private void validWord(Word word, BindingResult result) { + private void validateWord(Word word, BindingResult result) { Word existingWord = wordDao.readByText(word.getText()); if (existingWord != null) { @@ -278,7 +278,7 @@ private void validWord(Word word, BindingResult result) { } if (word.getText().matches(".*[0-9].*")) { - result.rejectValue("text", "WordContainsNumber"); + result.rejectValue("text", "WordNumbers"); } } } diff --git a/src/main/webapp/WEB-INF/i18n/errors_en.properties b/src/main/webapp/WEB-INF/i18n/errors_en.properties index 9c073204d..cea81831c 100644 --- a/src/main/webapp/WEB-INF/i18n/errors_en.properties +++ b/src/main/webapp/WEB-INF/i18n/errors_en.properties @@ -32,4 +32,4 @@ formatHint.Integer=Number (e.g. "5000") image.too.small=The image width must be at least 640px emoji.unicode.version=Only emojis up to Unicode version 9 WordSpace=Spaces are not allowed -WordContainsNumber=Word contain number +WordNumbers=A word cannot consist of numbers From 941896293503a1b0132996eee1598f8952343abb Mon Sep 17 00:00:00 2001 From: Tomasz Date: Fri, 22 Jul 2022 17:51:11 +0100 Subject: [PATCH 3/6] 1532 Do not allow words that are digits --- .../content/word/WordCreateController.java | 2 +- .../word/WordCreateControllerTest.java | 49 ++++++++++++++++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/main/java/ai/elimu/web/content/word/WordCreateController.java b/src/main/java/ai/elimu/web/content/word/WordCreateController.java index c4411fd3a..2383425f8 100644 --- a/src/main/java/ai/elimu/web/content/word/WordCreateController.java +++ b/src/main/java/ai/elimu/web/content/word/WordCreateController.java @@ -277,7 +277,7 @@ private void validateWord(Word word, BindingResult result) { result.rejectValue("text", "WordSpace"); } - if (word.getText().matches(".*[0-9].*")) { + if (word.getText() != null && word.getText().matches(".*[0-9].*")) { result.rejectValue("text", "WordNumbers"); } } diff --git a/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java b/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java index 7d3466019..ac0f5b181 100644 --- a/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java +++ b/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java @@ -1,7 +1,5 @@ package ai.elimu.web.content.word; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -15,6 +13,12 @@ import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; + +import java.util.List; + +import static org.junit.Assert.*; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={ @@ -54,4 +58,45 @@ public void testHandleSubmit_emptyText() throws Exception { // assertEquals(HttpStatus.BAD_REQUEST.value(), mvcResult.getResponse().getStatus()); // assertEquals("content/word/create", mvcResult.getModelAndView().getViewName()); } + + @Test + public void testValidateDigitsInWord() throws Exception { + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("10")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("'10'")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("\\\"10\\\"")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("Test10Test")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("Test 10 Test")).getAllErrors(), "WordNumbers")); + } + + @Test + public void testValidateSpacesInWord() throws Exception { + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("Test Test")).getAllErrors(), "WordSpace")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText(" Test")).getAllErrors(), "WordSpace")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("Test ")).getAllErrors(), "WordSpace")); + } + + private RequestBuilder getRequestWithSpecificText(String text) { + return MockMvcRequestBuilders + .post("/content/word/create") + .param("timeStart", String.valueOf(System.currentTimeMillis())) + .param("text", text) + .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE); + } + + private BindingResult getBindingResult(RequestBuilder requestBuilder) throws Exception { + MvcResult mvcResult = mockMvc.perform(requestBuilder).andReturn(); + return (BindingResult) mvcResult.getModelAndView().getModel().get("org.springframework.validation.BindingResult.word"); + } + + private boolean containGivenErrorCode(List objectErrorList, String error) { + for (ObjectError objectError : objectErrorList) { + for (String errorCode : objectError.getCodes()) { + if (errorCode.equals(error)) { + return true; + } + } + } + return false; + } + } From 8357c9d64c38ea8bd10725770a1edf2bbb9860d3 Mon Sep 17 00:00:00 2001 From: Tomasz Date: Sun, 24 Jul 2022 23:05:13 +0100 Subject: [PATCH 4/6] 1532 Do not allow words that are digits --- .../web/content/word/WordCreateController.java | 2 +- .../content/word/WordCreateControllerTest.java | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/ai/elimu/web/content/word/WordCreateController.java b/src/main/java/ai/elimu/web/content/word/WordCreateController.java index 2383425f8..f627cfb9b 100644 --- a/src/main/java/ai/elimu/web/content/word/WordCreateController.java +++ b/src/main/java/ai/elimu/web/content/word/WordCreateController.java @@ -277,7 +277,7 @@ private void validateWord(Word word, BindingResult result) { result.rejectValue("text", "WordSpace"); } - if (word.getText() != null && word.getText().matches(".*[0-9].*")) { + if (word.getText() != null && word.getText().matches("[0-9\\W_]*")) { result.rejectValue("text", "WordNumbers"); } } diff --git a/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java b/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java index ac0f5b181..bcaa7c4b7 100644 --- a/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java +++ b/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java @@ -63,9 +63,20 @@ public void testHandleSubmit_emptyText() throws Exception { public void testValidateDigitsInWord() throws Exception { assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("10")).getAllErrors(), "WordNumbers")); assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("'10'")).getAllErrors(), "WordNumbers")); - assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("\\\"10\\\"")).getAllErrors(), "WordNumbers")); - assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("Test10Test")).getAllErrors(), "WordNumbers")); - assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("Test 10 Test")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("\"10\"")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("[10]")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1'0")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1-0")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1*0")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1/0")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1!0")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1#0")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1%0")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1()0")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1_0")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1+0")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1{}0")).getAllErrors(), "WordNumbers")); + assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1|?><.,0")).getAllErrors(), "WordNumbers")); } @Test From 9e81b606d845832249f4f97c51e6841bb71a46ed Mon Sep 17 00:00:00 2001 From: Tomasz Date: Mon, 25 Jul 2022 17:05:40 +0100 Subject: [PATCH 5/6] 1532 Do not allow words that are digits --- .../ai/elimu/web/content/word/WordCreateControllerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java b/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java index bcaa7c4b7..e47050537 100644 --- a/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java +++ b/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java @@ -29,7 +29,7 @@ public class WordCreateControllerTest { @Autowired private WordCreateController wordCreateController; - + private MockMvc mockMvc; @Before @@ -96,7 +96,7 @@ private RequestBuilder getRequestWithSpecificText(String text) { private BindingResult getBindingResult(RequestBuilder requestBuilder) throws Exception { MvcResult mvcResult = mockMvc.perform(requestBuilder).andReturn(); - return (BindingResult) mvcResult.getModelAndView().getModel().get("org.springframework.validation.BindingResult.word"); + return (BindingResult) mvcResult.getModelAndView().getModel().get("org.springframework.validation.BindingResult.word"); } private boolean containGivenErrorCode(List objectErrorList, String error) { From e5c5774c6a5166cd437232566b77cf76aadbf955 Mon Sep 17 00:00:00 2001 From: Tomasz Date: Fri, 26 Aug 2022 18:06:26 +0100 Subject: [PATCH 6/6] 1532 Do not allow words that are digits --- .../java/ai/elimu/web/content/word/WordCreateController.java | 2 +- .../ai/elimu/web/content/word/WordCreateControllerTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ai/elimu/web/content/word/WordCreateController.java b/src/main/java/ai/elimu/web/content/word/WordCreateController.java index ac9528ad7..83119bd5e 100644 --- a/src/main/java/ai/elimu/web/content/word/WordCreateController.java +++ b/src/main/java/ai/elimu/web/content/word/WordCreateController.java @@ -279,7 +279,7 @@ private void autoSelectLetterSoundCorrespondences(Word word) { } private void validateWord(Word word, BindingResult result) { - Word existingWord = wordDao.readByTextAndType(word.getText()); + Word existingWord = wordDao.readByTextAndType(word.getText(), word.getWordType()); if (existingWord != null) { result.rejectValue("text", "NonUnique"); diff --git a/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java b/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java index 0ad315dc7..6b621df53 100644 --- a/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java +++ b/src/test/java/ai/elimu/web/content/word/WordCreateControllerTest.java @@ -111,6 +111,7 @@ public void testValidateDigitsInWord() throws Exception { assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1+0")).getAllErrors(), "WordNumbers")); assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1{}0")).getAllErrors(), "WordNumbers")); assertTrue(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("1|?><.,0")).getAllErrors(), "WordNumbers")); + assertFalse(containGivenErrorCode(getBindingResult(getRequestWithSpecificText("10th")).getAllErrors(), "WordNumbers")); } @Test