import com.fasterxml.jackson.databind.cfg.ContextAttributes; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.dataformat.csv.CsvMapper; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.eventbus.EventBus; import org.apache.avro.Schema; import org.apache.avro.generic.GenericData; import org.rakam.TestingConfigManager; import org.rakam.analysis.InMemoryApiKeyService; import org.rakam.analysis.InMemoryMetastore; import org.rakam.analysis.metadata.Metastore; import org.rakam.analysis.metadata.SchemaChecker; import org.rakam.collection.CsvEventDeserializer; import org.rakam.collection.Event; import org.rakam.collection.EventList; import org.rakam.collection.FieldDependencyBuilder; import org.rakam.collection.SchemaField; import org.rakam.config.ProjectConfig; import org.rakam.util.AvroUtil; import org.testng.annotations.Test; import java.util.List; import static com.google.common.collect.ImmutableSet.of; import static org.rakam.collection.FieldType.DOUBLE; import static org.rakam.collection.FieldType.STRING; import static org.testng.Assert.assertEquals; public class TestCSVParser { @Test public void testName() throws Exception { CsvMapper mapper = new CsvMapper(); FieldDependencyBuilder.FieldDependency build = new FieldDependencyBuilder().build(); Metastore metastore = new InMemoryMetastore(new InMemoryApiKeyService(), new EventBus()); mapper.registerModule(new SimpleModule().addDeserializer(EventList.class, new CsvEventDeserializer(metastore, new ProjectConfig(), new TestingConfigManager(), new SchemaChecker(metastore, build), build))); metastore.createProject("project"); metastore.getOrCreateCollectionFieldList("project", "collection", of(new SchemaField("price", DOUBLE))); String csv = "Transaction_date,Product,Price\n" + "1/2/09 6:17,Product1,1200\n" + "1/2/09 4:53,Product2,1500\n"; EventList actual = mapper.reader(EventList.class).with(ContextAttributes.getEmpty() .withSharedAttribute("project", "project") .withSharedAttribute("collection", "collection") .withSharedAttribute("apiKey", "apiKey") ).readValue(csv); List<SchemaField> collection = metastore.getCollection("project", "collection"); assertEquals(ImmutableSet.copyOf(collection), ImmutableSet.of( new SchemaField("transaction_date", STRING), new SchemaField("product", STRING), new SchemaField("price", DOUBLE))); Schema avroSchema = AvroUtil.convertAvroSchema(collection); GenericData.Record record1 = new GenericData.Record(avroSchema); record1.put("transaction_date", "1/2/09 6:17"); record1.put("product", "Product1"); record1.put("price", 1200.0); GenericData.Record record2 = new GenericData.Record(avroSchema); record2.put("transaction_date", "1/2/09 4:53"); record2.put("product", "Product2"); record2.put("price", 1500.0); EventList eventList = new EventList(Event.EventContext.apiKey("apiKey"), "project", ImmutableList.of( new Event("project", "collection", null, ImmutableList.copyOf(collection), record1), new Event("project", "collection", null, ImmutableList.copyOf(collection), record2))); assertEquals(actual, eventList); } }