Skip to content

Commit fc01b84

Browse files
MKaramathhemantt
authored andcommitted
RDM-3325: White space validation rules applied on text fields (#284)
* RDM-3325: CCD does not apply validation rules to text fields containing only whitespace characters * RDM-3325: Added TextSanitiser * RDM-3325: Added unit test cases * RDM-3325: IsNull condition refined * RDM-3325: Typo space correction * RDM-3325: Fixed the code quality issues * RDM-3325: Removed unused imports * RDM-3325: Improved the code quality
1 parent bcd4a51 commit fc01b84

File tree

6 files changed

+112
-3
lines changed

6 files changed

+112
-3
lines changed

src/main/java/uk/gov/hmcts/ccd/domain/model/definition/FieldType.java

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class FieldType implements Serializable {
1818
public static final String LABEL = "Label";
1919
public static final String CASE_PAYMENT_HISTORY_VIEWER = "CasePaymentHistoryViewer";
2020
public static final String CASE_HISTORY_VIEWER = "CaseHistoryViewer";
21+
public static final String TEXT = "Text";
2122

2223
private String id = null;
2324
private String type = null;

src/main/java/uk/gov/hmcts/ccd/domain/types/BaseTypeValidator.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ List<ValidationResult> validate(final String dataFieldId,
1919
default Boolean isNullOrEmpty(final JsonNode dataValue) {
2020
return dataValue == null
2121
|| dataValue.isNull()
22-
|| (dataValue.isTextual() && (null == dataValue.asText() || dataValue.asText().trim().length() == 0))
22+
|| (dataValue.isTextual() && (null == dataValue.asText() || dataValue.asText().length() == 0))
2323
|| (dataValue.isObject() && dataValue.toString().equals("{}"));
2424
}
25+
26+
default Boolean isNull(final JsonNode dataValue) {
27+
return dataValue == null
28+
|| dataValue.isNull()
29+
|| (dataValue.isTextual() && (null == dataValue.asText()));
30+
}
2531
}

src/main/java/uk/gov/hmcts/ccd/domain/types/TextValidator.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public List<ValidationResult> validate(final String dataFieldId,
2525
final CaseField caseFieldDefinition) {
2626

2727
// Empty text should still check against MIN - MIN may or may not be 0
28-
if (isNullOrEmpty(dataValue)) {
28+
if (isNull(dataValue)) {
2929
return Collections.emptyList();
3030
}
3131

@@ -34,7 +34,7 @@ public List<ValidationResult> validate(final String dataFieldId,
3434
return Collections.singletonList(new ValidationResult(nodeType + " is not a string", dataFieldId));
3535
}
3636

37-
final String value = dataValue.textValue();
37+
final String value = dataValue.textValue().trim();
3838

3939
if (!checkMax(caseFieldDefinition.getFieldType().getMax(), value)) {
4040
return Collections.singletonList(new ValidationResult(value + " exceed maximum length " + caseFieldDefinition.getFieldType().getMax(), dataFieldId));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package uk.gov.hmcts.ccd.domain.types.sanitiser;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
5+
import uk.gov.hmcts.ccd.domain.model.definition.FieldType;
6+
import static uk.gov.hmcts.ccd.domain.model.definition.FieldType.TEXT;
7+
8+
import javax.inject.Named;
9+
import javax.inject.Singleton;
10+
11+
@Named
12+
@Singleton
13+
public class TextSanitiser implements Sanitiser {
14+
15+
private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false);
16+
17+
@Override
18+
public String getType() {
19+
return TEXT;
20+
}
21+
22+
public JsonNode sanitise(FieldType fieldType, JsonNode fieldData) {
23+
if (fieldData.isTextual()) {
24+
return JSON_NODE_FACTORY.textNode(fieldData.asText().trim());
25+
}
26+
return fieldData;
27+
}
28+
}

src/test/java/uk/gov/hmcts/ccd/domain/types/TextValidatorTest.java

+12
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,18 @@ void nullTextValue() {
151151
assertThat(validationResult, hasSize(0));
152152
}
153153

154+
@Test
155+
@DisplayName("should NOT be valid with only white spaces or leading trailing white spaces")
156+
void checkWhitespaces() {
157+
final JsonNode whitespaceValue = NODE_FACTORY.textNode(" ");
158+
final List<ValidationResult> whitespaceValueResult = validator.validate(FIELD_ID, whitespaceValue, caseField);
159+
assertThat(whitespaceValueResult, hasSize(1));
160+
161+
final JsonNode trailingwhitespaces = NODE_FACTORY.textNode(" Testing ");
162+
final List<ValidationResult> trailingwhitespacesResult = validator.validate(FIELD_ID, trailingwhitespaces, caseField);
163+
assertThat(trailingwhitespacesResult, hasSize(0));
164+
}
165+
154166
private CaseFieldBuilder caseField() {
155167
return new CaseFieldBuilder(FIELD_ID).withType(TextValidator.TYPE_ID);
156168
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package uk.gov.hmcts.ccd.domain.types.sanitiser;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.mockito.InjectMocks;
8+
import org.mockito.MockitoAnnotations;
9+
import uk.gov.hmcts.ccd.domain.model.definition.CaseField;
10+
import uk.gov.hmcts.ccd.domain.model.definition.CaseType;
11+
import uk.gov.hmcts.ccd.domain.model.definition.FieldType;
12+
13+
import java.util.Collections;
14+
15+
import static org.hamcrest.Matchers.is;
16+
import static org.junit.Assert.assertThat;
17+
18+
class TextSanitiserTest {
19+
20+
private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false);
21+
private static final CaseType CASE_TYPE = new CaseType();
22+
private static final String TYPE_TEXT = "Text";
23+
private static final FieldType TEXT_FIELD_TYPE = new FieldType();
24+
private static final String TEXT_FIELD_ID = "TestText";
25+
private static final CaseField TEXT_FIELD = new CaseField();
26+
27+
static {
28+
TEXT_FIELD_TYPE.setId(TYPE_TEXT);
29+
TEXT_FIELD_TYPE.setType(TYPE_TEXT);
30+
TEXT_FIELD.setId(TEXT_FIELD_ID);
31+
TEXT_FIELD.setFieldType(TEXT_FIELD_TYPE);
32+
33+
CASE_TYPE.setCaseFields(Collections.singletonList(TEXT_FIELD));
34+
}
35+
36+
@InjectMocks
37+
private TextSanitiser textSanitiser;
38+
39+
@Before
40+
public void setUp() {
41+
MockitoAnnotations.initMocks(this);
42+
textSanitiser = new TextSanitiser();
43+
}
44+
45+
@Test
46+
public void shouldSanitizeValidText() {
47+
JsonNode data = JSON_NODE_FACTORY.textNode(" Mr Tester ");
48+
JsonNode result = JSON_NODE_FACTORY.textNode("Mr Tester");
49+
JsonNode sanitisedText = textSanitiser.sanitise(TEXT_FIELD_TYPE, data);
50+
51+
assertThat(sanitisedText, is(result));
52+
}
53+
54+
@Test
55+
public void shouldSanitizeOnlyWhitespace() {
56+
JsonNode data = JSON_NODE_FACTORY.textNode(" ");
57+
JsonNode result = JSON_NODE_FACTORY.textNode("");
58+
JsonNode sanitisedText = textSanitiser.sanitise(TEXT_FIELD_TYPE, data);
59+
60+
assertThat(sanitisedText, is(result));
61+
}
62+
}

0 commit comments

Comments
 (0)