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 }