package com.github.mygreen.supercsv.builder; import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import java.io.StringReader; import java.io.StringWriter; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.supercsv.prefs.CsvPreference; import com.github.mygreen.supercsv.builder.spring.UserCsv; import com.github.mygreen.supercsv.io.CsvAnnotationBeanReader; import com.github.mygreen.supercsv.io.CsvAnnotationBeanWriter; import com.github.mygreen.supercsv.localization.SpringMessageResolver; import com.github.mygreen.supercsv.validation.CsvExceptionConverter; /** * {@link SpringBeanFactory}のテスタ * * @since 2.0 * @author T.TSUCHIE * */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:/TestContext.xml") //@ContextConfiguration(classes=SpringTestConfig.class) public class SpringBeanFactoryTest { @Autowired private SpringBeanFactory beanFactory; @Autowired private SpringMessageResolver messageResolver; private BeanMappingFactory beanMappingFactory; private CsvExceptionConverter exceptionConverter; @Before public void setUp() throws Exception { this.beanMappingFactory = new BeanMappingFactory(); beanMappingFactory.getConfiguration().setBeanFactory(beanFactory); this.exceptionConverter = new CsvExceptionConverter(); exceptionConverter.setMessageResolver(messageResolver); } @Test public void testRead() throws Exception { BeanMapping<UserCsv> beanMapping = beanMappingFactory.create(UserCsv.class); String csv = "id,名前,ホームページ,ホームページ(予備),E-mail" + "\r\n" + "001,admin,http://mysite.com/admin.html,https://localhost/sub.html,admin@mysite.com" + "\r\n" + "002,sample,http://mysite.com/sample.html,https://localhost/sub.html,sample@mysite.com" + "\r\n" + "003,test,ftp://mysite.com/test.html,https://localhost/sub.html,test@mysite.com" + "\r\n" + "004,test,http://mysite.com/test.html,abc,test@mysite.com" + "\r\n" + "005,admin,http://mysite.com/admin.html,https://localhost/sub.html,admin_mysite.com" ; CsvAnnotationBeanReader<UserCsv> csvReader = new CsvAnnotationBeanReader<>(beanMapping, new StringReader(csv), CsvPreference.STANDARD_PREFERENCE); csvReader.setExceptionConverter(exceptionConverter); List<UserCsv> list = csvReader.readAll(true); csvReader.close(); csvReader.getErrorMessages().stream().forEach(System.out::println); assertThat(csvReader.getErrorMessages()).hasSize(4) .contains("[3行, 2列] : 項目「名前」の値(sample)は、存在しません。") .contains("[4行, 3列] : 項目「ホームページ」の値(ftp://mysite.com/test.html)のプロトコル「ftp」はサポートしていません。") .contains("[5行, 4列] : 項目「ホームページ(予備)」の値(abc)は、サブのホームページの値として不正です。") .contains("[6行, 5列] : 項目「E-mail」の値(admin_mysite.com)は、メールアドレスの書式として不正です。") ; assertThat(list).hasSize(1); assertThat(list.get(0)).hasFieldOrPropertyWithValue("id", "001"); } @Test public void testWrite() throws Exception { BeanMapping<UserCsv> beanMapping = beanMappingFactory.create(UserCsv.class); List<UserCsv> list = new ArrayList<UserCsv>(); list.add(new UserCsv().id("001").name("admin") .homepage(new URL("http://mysite.com/admin.html")) .homepageSub(new URL("https://localhost/sub.html")) .email("admin@mysite.com")); list.add(new UserCsv().id("002").name("sample") .homepage(new URL("http://mysite.com/sample.html")) .homepageSub(new URL("https://localhost/sub.html")) .email("sample@mysite.com")); list.add(new UserCsv().id("003").name("test") .homepage(new URL("ftp://mysite.com/test.html")) .homepageSub(new URL("https://localhost/sub.html")) .email("test@mysite.com")); // list.add(new UserCsv().id("004").name("test") // .homepage(new URL("http://mysite.com/admin.html")) // .homepageSub(new URL("mailto://localhost/sub.html")) // .email("test@mysite.com")); list.add(new UserCsv().id("005").name("admin") .homepage(new URL("http://mysite.com/admin.html")) .homepageSub(new URL("https://localhost/sub.html")) .email("admin_mysite.com")); StringWriter writer = new StringWriter(); CsvAnnotationBeanWriter<UserCsv> csvWriter = new CsvAnnotationBeanWriter<>(beanMapping, writer, CsvPreference.STANDARD_PREFERENCE); csvWriter.setExceptionConverter(exceptionConverter); csvWriter.writeAll(list, true); csvWriter.close(); csvWriter.getErrorMessages().stream().forEach(System.out::println); assertThat(csvWriter.getErrorMessages()).hasSize(3) .contains("[3行, 2列] : 項目「名前」の値(sample)は、存在しません。") .contains("[4行, 3列] : 項目「ホームページ」の値(ftp://mysite.com/test.html)のプロトコル「ftp」はサポートしていません。") .contains("[5行, 5列] : 項目「E-mail」の値(admin_mysite.com)は、メールアドレスの書式として不正です。") ; String csv = writer.toString(); String expected = "id,名前,ホームページ,ホームページ(予備),E-mail" + "\r\n" + "001,admin,http://mysite.com/admin.html,https://localhost/sub.html,admin@mysite.com" + "\r\n"; System.out.println(csv); assertThat(csv).isEqualTo(expected); } }