package io.konik.csv.mapper;
import com.neovisionaries.i18n.CountryCode;
import com.neovisionaries.i18n.CurrencyCode;
import io.konik.csv.Rows;
import io.konik.csv.model.Row;
import io.konik.csv.processor.DateProcessor;
import io.konik.csv.processor.ReferenceProcessor;
import io.konik.csv.processor.UnitOfMeasurementProcessor;
import io.konik.zugferd.unece.codes.Reference;
import io.konik.zugferd.unece.codes.UnitOfMeasurement;
import org.dozer.DozerBeanMapper;
import org.junit.Test;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.dozer.CsvDozerBeanReader;
import org.supercsv.io.dozer.CsvDozerBeanWriter;
import org.supercsv.prefs.CsvPreference;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.UUID;
import static io.konik.csv.mapper.CsvMapperBuilder.column;
import static org.assertj.core.api.Assertions.assertThat;
public class CsvMapperBuilderTest {
@Test
public void shouldWriteAndReadRowEntryUsingCsvMapper() throws IOException {
//given:
File file = File.createTempFile(UUID.randomUUID().toString(), ".csv");
DozerBeanMapper mapper = getBuilder().buildBeanMapper(Row.class);
CellProcessor[] processors = getBuilder().getCellProcessors();
String[] headers = getBuilder().getColumnNames();
//when:
CsvDozerBeanWriter writer = new CsvDozerBeanWriter(new FileWriter(file), CsvPreference.STANDARD_PREFERENCE, mapper);
writer.writeHeader(headers);
writer.write(Rows.row1, processors);
writer.write(Rows.row2, processors);
writer.flush();
writer.close();
//then:
assertThat(file.length()).isGreaterThan(0l);
//when:
CsvDozerBeanReader reader = new CsvDozerBeanReader(new FileReader(file), CsvPreference.STANDARD_PREFERENCE, mapper);
System.out.println(Arrays.toString(reader.getHeader(true)));
Row row1 = reader.read(Row.class, processors);
Row row2 = reader.read(Row.class, processors);
reader.close();
//then:
assertThat(row1).isEqualTo(Rows.row1);
assertThat(row2).isEqualTo(Rows.row2);
}
@Test
public void shouldReadRowsFromExistingCsvFileUsingCsvMpperHeaderColumnConfigurer() throws IOException {
//given:
File csvFile = new File("src/test/resources/csv/example.csv");
CsvMapperBuilder mapperBuilder = CsvMapperBuilder.withHeadersFromCsvFile(csvFile, new CsvMapperHeaderColumnsConfigurer());
CellProcessor[] processors = mapperBuilder.getCellProcessors();
CsvDozerBeanReader reader = mapperBuilder.getBeanReader(csvFile, Row.class);
//when:
Row row1 = reader.read(Row.class, processors);
Row row2 = reader.read(Row.class, processors);
reader.close();
//then:
assertThat(row1).isEqualTo(Rows.row1);
assertThat(row2).isEqualTo(Rows.row2);
}
private CsvMapperBuilder getBuilder() {
return new CsvMapperBuilder(CsvPreference.STANDARD_PREFERENCE)
.add(column("header.invoiceNumber"))
.add(column("header.type"))
.add(column("header.issued")
.type(Date.class)
.processor(new DateProcessor())
)
.add(column("header.dueDate")
.type(Date.class)
.processor(new DateProcessor())
)
.add(column("header.reference"))
.add(column("header.customerNumber"))
.add(column("header.currency").type(CurrencyCode.class))
.add(column("header.note"))
.add(column("recipient.name"))
.add(column("recipient.contactName"))
.add(column("recipient.addressLine1"))
.add(column("recipient.addressLine2"))
.add(column("recipient.city"))
.add(column("recipient.postcode"))
.add(column("recipient.countryCode").type(CountryCode.class))
.add(column("recipient.email"))
.add(column("recipient.taxes[0].number"))
.add(column("recipient.taxes[0].type")
.type(Reference.class)
.processor(new ReferenceProcessor())
)
.add(column("recipient.taxes[1].number"))
.add(column("recipient.taxes[1].type")
.type(Reference.class)
.processor(new ReferenceProcessor())
)
.add(column("recipient.bankInfo.bankName"))
.add(column("recipient.bankInfo.bic"))
.add(column("recipient.bankInfo.iban"))
.add(column("issuer.name"))
.add(column("issuer.contactName"))
.add(column("issuer.addressLine1"))
.add(column("issuer.addressLine2"))
.add(column("issuer.city"))
.add(column("issuer.postcode"))
.add(column("issuer.countryCode").type(CountryCode.class))
.add(column("issuer.email"))
.add(column("issuer.taxes[0].number"))
.add(column("issuer.taxes[0].type")
.type(Reference.class)
.processor(new ReferenceProcessor())
)
.add(column("issuer.bankInfo.bankName"))
.add(column("issuer.bankInfo.bic"))
.add(column("issuer.bankInfo.iban"))
.add(column("items[0].name"))
.add(column("items[0].quantity").type(BigDecimal.class))
.add(column("items[0].unit")
.type(UnitOfMeasurement.class)
.processor(new UnitOfMeasurementProcessor())
)
.add(column("items[0].unitPrice").type(BigDecimal.class))
.add(column("items[0].taxPercent").type(BigDecimal.class))
.add(column("items[1].name"))
.add(column("items[1].quantity").type(BigDecimal.class))
.add(column("items[1].unit")
.type(UnitOfMeasurement.class)
.processor(new UnitOfMeasurementProcessor())
)
.add(column("items[1].unitPrice").type(BigDecimal.class))
.add(column("items[1].taxPercent").type(BigDecimal.class));
}
}