View Javadoc
1   package com.opencsv.bean.validators;
2   
3   import com.opencsv.bean.CsvToBean;
4   import com.opencsv.bean.CsvToBeanBuilder;
5   import com.opencsv.exceptions.CsvValidationException;
6   import org.junit.jupiter.api.Assertions;
7   import org.junit.jupiter.api.DisplayName;
8   import org.junit.jupiter.api.Test;
9   import org.junit.jupiter.params.ParameterizedTest;
10  import org.junit.jupiter.params.provider.Arguments;
11  import org.junit.jupiter.params.provider.MethodSource;
12  
13  import java.io.Reader;
14  import java.io.StringReader;
15  import java.util.List;
16  import java.util.stream.Stream;
17  
18  public class BeanFieldValidatorTest {
19      private static final String GOOD_NAME = "A good name";
20      private static final String GOOD_ID_STRING = "256";
21      private static final int GOOD_ID_INT = 256;
22      private static final String GOOD_BIG_NUMBER_STRING = "some value: 987654321";
23      private static final long GOOD_BIG_NUMBER_LONG = 987654321;
24      public static String HEADER = "name,id,big number\n";
25  
26  
27      private CsvToBean<ValidatorTestBean> createBuilderForString(String csvStrings) {
28          Reader stringReader = new StringReader(csvStrings);
29  
30          CsvToBeanBuilder<ValidatorTestBean> builder = new CsvToBeanBuilder<>(stringReader);
31  
32          return builder.withType(ValidatorTestBean.class).build();
33      }
34  
35      private String createTestString(String name, String id, String bigNumber) {
36          StringBuilder builder = new StringBuilder(128);
37          builder.append(HEADER);
38          builder.append(name);
39          builder.append(',');
40          builder.append(id);
41          builder.append(',');
42          builder.append(bigNumber);
43          builder.append("\n");
44          return builder.toString();
45      }
46  
47      @Test
48      @DisplayName("Simple test to show defaults work the way I think they do.")
49      public void testGoodString() {
50          String testString = createTestString(GOOD_NAME, GOOD_ID_STRING, GOOD_BIG_NUMBER_STRING);
51  
52          CsvToBean<ValidatorTestBean> builder = createBuilderForString(testString);
53  
54          List<ValidatorTestBean> beans = builder.parse();
55  
56          Assertions.assertEquals(1, beans.size());
57  
58          ValidatorTestBean bean = beans.get(0);
59          Assertions.assertEquals(GOOD_NAME, bean.getBeanName());
60          Assertions.assertEquals(GOOD_ID_INT, bean.getBeanId());
61      }
62  
63      @Test
64      @DisplayName("Will fail because of name")
65      public void badName() {
66          String testString = createTestString("1 is the start of a bad name", GOOD_ID_STRING, GOOD_BIG_NUMBER_STRING);
67  
68          CsvToBean<ValidatorTestBean> csvToBean = createBuilderForString(testString);
69  
70          try {
71              csvToBean.parse();
72              Assertions.fail("Was expecting a CsvValidationException.");
73          } catch (RuntimeException rte) {
74              Throwable cause = rte.getCause();
75              if (!(cause instanceof CsvValidationException)) {
76                  Assertions.fail(String.format("Was expecting to catch a CsvValidationException but got an %s instead", cause.getClass().getName()));
77              }
78          }
79      }
80  
81      private static Stream<Arguments> createIsValidArguments() {
82          return Stream.of(
83                  Arguments.of("1", false),
84                  Arguments.of(null, false),
85                  Arguments.of("", false),
86                  Arguments.of("12", false),
87                  Arguments.of("123", true),
88                  Arguments.of("1234", true),
89                  Arguments.of("12345", true),
90                  Arguments.of("123456", true),
91                  Arguments.of("1234567", false),
92                  Arguments.of("1234 ", false),
93                  Arguments.of(" 1234", false),
94                  Arguments.of("\t12345", false)
95          );
96      }
97  
98      @DisplayName("RowValidatorAggregator isValid")
99      @ParameterizedTest
100     @MethodSource("createIsValidArguments")
101     public void testValidatorWithParameter(String idString, boolean valid) {
102         String testString = createTestString(GOOD_NAME, idString, GOOD_BIG_NUMBER_STRING);
103 
104         CsvToBean<ValidatorTestBean> csvToBean = createBuilderForString(testString);
105 
106         try {
107             List<ValidatorTestBean> beans = csvToBean.parse();
108             if (!valid) {
109                 Assertions.fail(String.format("Was expecting id with value of \"%s\" to fail but it did not.", idString));
110             }
111             Assertions.assertEquals(1, beans.size());
112             ValidatorTestBean bean = beans.get(0);
113             Assertions.assertEquals(Integer.valueOf(idString), bean.getBeanId());
114             Assertions.assertEquals(GOOD_BIG_NUMBER_LONG, bean.getBigNumber());
115         } catch (RuntimeException rte) {
116             if (valid) {
117                 Assertions.fail(String.format("Was expecting id with value of \"%s\" to pass but an exception was thrown.", idString));
118             }
119             Throwable cause = rte.getCause();
120             if (!(cause instanceof CsvValidationException)) {
121                 Assertions.fail(String.format("Was expecting to catch a CsvValidationException but got an %s instead", cause.getClass().getName()));
122             }
123         }
124     }
125 
126 
127 }