View Javadoc
1   package integrationTest.SR113;
2   
3   import com.opencsv.CSVReader;
4   import com.opencsv.bean.*;
5   import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
6   import org.junit.jupiter.api.Assertions;
7   import org.junit.jupiter.api.DisplayName;
8   import org.junit.jupiter.api.Test;
9   
10  import java.io.StringReader;
11  import java.io.StringWriter;
12  import java.util.*;
13  
14  import static org.junit.jupiter.api.Assertions.*;
15  
16  public class SR113Test {
17  
18      private static final String TEST_STRING =
19              "FEATURE_NAME,STATE,USER_COUNT\n" +
20                      "hello world,production,3228\n" +
21                      "calc age,beta,74\n" +
22                      "wash dishes,alpha,3";
23  
24      private static final String TEST_EMPTY_STRING =
25              "FEATURE_NAME,STATE,USER_COUNT\n" +
26                      "hello world,    ,3228\n" +
27                      "calc age,,74\n" +
28                      "wash dishes,    ,3";
29  
30      private static final String TEST_EMPTY_STRING_NO_STATE =
31              "FEATURE_NAME,USER_COUNT\n" +
32                      "hello world,3228\n" +
33                      "calc age,74\n" +
34                      "wash dishes,3";
35  
36      private CSVReader createReader() {
37          StringReader reader = new StringReader(TEST_STRING);
38          return new CSVReader(reader);
39      }
40  
41      private MappingStrategy<Feature> createMappingStrategy() {
42          MappingStrategy<Feature> strategy = new HeaderColumnNameMappingStrategy<>();
43          strategy.setType(Feature.class);
44          return strategy;
45      }
46  
47      private MappingStrategy<Feature> createTranslateMappingStrategy() {
48          HeaderColumnNameTranslateMappingStrategy<Feature> strategy = new HeaderColumnNameTranslateMappingStrategy<>();
49          Map<String, String> columnMap = new HashMap<>();
50          columnMap.put("FEATURE_NAME", "name");
51          columnMap.put("STATE", "state");
52          strategy.setColumnMapping(columnMap);
53          strategy.setType(Feature.class);
54          return strategy;
55      }
56  
57      public static class Feature {
58  
59          @CsvBindByName(column = "FEATURE_NAME")
60          private String name;
61  
62          @CsvBindByName(required = true)
63          private String state;
64  
65          public void setName(String name) {
66              this.name = name;
67          }
68  
69          public void setState(String state) {
70              this.state = state;
71          }
72  
73          public String getName() {
74              return name;
75          }
76  
77          public String getState() {
78              return state;
79          }
80      }
81  
82      @Test
83      @DisplayName("Using HeaderColumnNameMappingStrategy null field should throw expection")
84      public void testWithNullStringNoState() {
85          CsvToBean<Feature> csvToBean = new CsvToBeanBuilder<Feature>(new StringReader(TEST_EMPTY_STRING_NO_STATE))
86                  .withMappingStrategy(createMappingStrategy())
87                  .build();
88          Assertions.assertThrows(RuntimeException.class, () -> csvToBean.parse());
89      }
90  
91      @Test
92      @DisplayName("Using translate strategy null field should throw expection")
93      public void testWithNullStringNoStateTranslate() {
94          CsvToBean<Feature> csvToBean = new CsvToBeanBuilder<Feature>(new StringReader(TEST_EMPTY_STRING_NO_STATE))
95                  .withMappingStrategy(createTranslateMappingStrategy())
96                  .build();
97          List<Feature> list = csvToBean.parse();
98          assertNull(list.get(0).getState());
99          assertNull(list.get(1).getState());
100         assertNull(list.get(2).getState());
101     }
102 
103     @Test
104     @DisplayName("Using mapping strategy to enforce a header missing state")
105     public void enforceColumns() throws CsvRequiredFieldEmptyException {
106         MappingStrategy<Feature> strategy = createTranslateMappingStrategy();
107         CsvToBean<Feature> csvToBean = new CsvToBeanBuilder<Feature>(new StringReader(TEST_EMPTY_STRING_NO_STATE))
108                 .withMappingStrategy(strategy)
109                 .build();
110         List<Feature> list = csvToBean.parse();
111         String[] header = strategy.generateHeader(list.get(0));
112         assertFalse(Arrays.asList(header).contains("STATE"));
113     }
114 
115     @Test
116     @DisplayName("Using mapping strategy to enforce a header with state")
117     public void enforceColumnsWithColumn() throws CsvRequiredFieldEmptyException {
118         MappingStrategy<Feature> strategy = createTranslateMappingStrategy();
119         CsvToBean<Feature> csvToBean = new CsvToBeanBuilder<Feature>(new StringReader(TEST_EMPTY_STRING))
120                 .withMappingStrategy(strategy)
121                 .build();
122         List<Feature> list = csvToBean.parse();
123         String[] header = strategy.generateHeader(list.get(0));
124         assertTrue(Arrays.asList(header).contains("STATE"));
125     }
126 
127     @Test
128     @DisplayName("write bean with null value")
129     public void writeWithNullField() {
130         Feature feature = new Feature();
131         feature.setName("test name");
132         feature.setState(null);
133 
134         StringWriter writer = new StringWriter();
135         StatefulBeanToCsvBuilder<Feature> builder = new StatefulBeanToCsvBuilder<>(writer);
136         StatefulBeanToCsv<Feature> beanToCsv = builder.build();
137         Assertions.assertThrows(CsvRequiredFieldEmptyException.class, () -> beanToCsv.write(feature));
138     }
139 }