View Javadoc
1   package com.opencsv;
2   
3   import com.opencsv.exceptions.CsvException;
4   import com.opencsv.exceptions.CsvValidationException;
5   import com.opencsv.validators.LineDoesNotHaveForbiddenString;
6   import com.opencsv.validators.RowFunctionValidator;
7   import com.opencsv.validators.RowValidator;
8   import org.junit.jupiter.api.BeforeEach;
9   import org.junit.jupiter.api.DisplayName;
10  import org.junit.jupiter.api.Test;
11  
12  import java.io.IOException;
13  import java.io.StringReader;
14  import java.util.List;
15  import java.util.function.Function;
16  
17  import static org.junit.jupiter.api.Assertions.*;
18  
19  public class CSVReaderWithValidatorsTest {
20      private static final String BAD = "bad";
21      private static final String AWFUL = "awful";
22      private LineDoesNotHaveForbiddenString lineDoesNotHaveBadString;
23      private LineDoesNotHaveForbiddenString lineDoesNotHaveAwfulString;
24  
25      private static final Function<String[], Boolean> ROW_MUST_HAVE_THREE_COLUMNS = (x) -> x.length == 3;
26      private static final RowValidator THREE_COLUMNS_ROW_VALIDATOR = new RowFunctionValidator(ROW_MUST_HAVE_THREE_COLUMNS, "Row must have three columns!");
27  
28      @BeforeEach
29      public void setup() {
30          lineDoesNotHaveBadString = new LineDoesNotHaveForbiddenString(BAD);
31          lineDoesNotHaveAwfulString = new LineDoesNotHaveForbiddenString(AWFUL);
32      }
33  
34      @DisplayName("CSVReader with LineValidator with good string")
35      @Test
36      public void readerWithLineValidatorWithValidString() throws IOException, CsvException {
37          String lines = "a,b,c\nd,e,f\n";
38          StringReader stringReader = new StringReader(lines);
39          CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
40  
41          CSVReader csvReader = builder
42                  .withLineValidator(lineDoesNotHaveAwfulString)
43                  .withLineValidator(lineDoesNotHaveBadString)
44                  .withRowValidator(THREE_COLUMNS_ROW_VALIDATOR)
45                  .build();
46  
47          List<String[]> rows = csvReader.readAll();
48          assertEquals(2, rows.size());
49      }
50  
51      @DisplayName("CSVReader with LineValidator with bad string")
52      @Test
53      public void readerWithLineValidatorWithBadString() {
54          String lines = "a,b,c\nd,bad,f\n";
55          StringReader stringReader = new StringReader(lines);
56          CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
57  
58          CSVReader csvReader = builder
59                  .withLineValidator(lineDoesNotHaveAwfulString)
60                  .withLineValidator(lineDoesNotHaveBadString)
61                  .build();
62  
63          assertThrows(CsvValidationException.class, csvReader::readAll);
64      }
65  
66      @DisplayName("CSVReader with LineValidator with bad first string")
67      @Test
68      public void readerWithLineValidatorWithBadFirstString() {
69          String lines = "d,bad,f\na,b,c\n";
70          StringReader stringReader = new StringReader(lines);
71          CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
72  
73          CSVReader csvReader = builder
74                  .withLineValidator(lineDoesNotHaveAwfulString)
75                  .withLineValidator(lineDoesNotHaveBadString)
76                  .build();
77  
78          try {
79              csvReader.readAll();
80              fail("Expected a CsvValidationException to be thrown!");
81          } catch (CsvValidationException cve) {
82              assertEquals(1, cve.getLineNumber());
83          } catch (Exception e) {
84              fail("Caught an exception other than CsvValidationException!", e);
85          }
86      }
87  
88      @DisplayName("CSVReader populates line number of exception thrown by LineValidatorAggregator")
89      @Test
90      public void readerWithLineValidatorExceptionContainsLineNumber() {
91          String lines = "a,b,c\nd,bad,f\n";
92          StringReader stringReader = new StringReader(lines);
93          CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
94  
95          CSVReader csvReader = builder
96                  .withLineValidator(lineDoesNotHaveAwfulString)
97                  .withLineValidator(lineDoesNotHaveBadString)
98                  .build();
99  
100         try {
101             csvReader.readAll();
102             fail("Expected a CsvValidationException to be thrown!");
103         } catch (CsvValidationException cve) {
104             assertEquals(2, cve.getLineNumber());
105         } catch (Exception e) {
106             fail("Caught an exception other than CsvValidationException!", e);
107         }
108     }
109 
110     @DisplayName("CSVReader with RowValidator with bad row")
111     @Test
112     public void readerWithRowValidatorWithBadRow() {
113         String lines = "a,b,c\nd,f\n";
114         StringReader stringReader = new StringReader(lines);
115         CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
116 
117         CSVReader csvReader = builder
118                 .withRowValidator(THREE_COLUMNS_ROW_VALIDATOR)
119                 .build();
120 
121         assertThrows(CsvValidationException.class, csvReader::readAll);
122     }
123 
124     @DisplayName("CSVReader populates line number of exception thrown by RowValidatorAggregator")
125     @Test
126     public void readerWithRowValidatorExceptionContainsLineNumber() {
127         String lines = "a,b,c\nd,f\n";
128         StringReader stringReader = new StringReader(lines);
129         CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
130 
131         CSVReader csvReader = builder
132                 .withRowValidator(THREE_COLUMNS_ROW_VALIDATOR)
133                 .build();
134 
135         try {
136             csvReader.readAll();
137             fail("Expected a CsvValidationException to be thrown!");
138         } catch (CsvValidationException cve) {
139             assertEquals(2, cve.getLineNumber());
140         } catch (Exception e) {
141             fail("Caught an exception other than CsvValidationException!", e);
142         }
143     }
144 }