/**
* DataCleaner (community edition)
* Copyright (C) 2014 Neopost - Customer Information Management
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.datacleaner.beans;
import static org.junit.Assert.*;
import java.util.List;
import java.util.Map;
import org.datacleaner.api.InputColumn;
import org.datacleaner.data.MockInputColumn;
import org.datacleaner.data.MockInputRow;
import org.junit.Test;
public class ParseJsonTransformerTest {
@Test
public void testExtractJsonValuesTransformerWithoutAnyValidation() {
final InputColumn<String> col1 = new MockInputColumn<>("jsonDocument", String.class);
final ParseJsonTransformer transformer = new ParseJsonTransformer(col1);
transformer.init();
assertEquals(1, transformer.getOutputColumns().getColumnCount());
final String json = "{\"name\":\"shekhar\",\"country\":\"india\"}";
final Object[] values = transformer.transform(new MockInputRow().put(col1, json));
assertEquals(1, values.length);
assertEquals(2, ((Map<?, ?>) values[0]).size());
assertEquals("{name=shekhar, country=india}", values[0].toString());
}
@Test
public void testExtractJsonNumbersAndBooleans() {
final InputColumn<String> col1 = new MockInputColumn<>("jsonDocument", String.class);
final ParseJsonTransformer transformer = new ParseJsonTransformer(col1);
transformer.init();
assertEquals(1, transformer.getOutputColumns().getColumnCount());
final String json = "{\"name\":\"kasper\",\"age\":29,\"developer\":true,\"manager\":false,\"balance\":400.17}";
final Object[] values = transformer.transform(new MockInputRow().put(col1, json));
assertEquals(1, values.length);
assertEquals(5, ((Map<?, ?>) values[0]).size());
assertEquals("{name=kasper, age=29, developer=true, manager=false, balance=400.17}", values[0].toString());
}
@Test
public void shouldReturnEmptyMapWhenNoJsonDocumentExistForColumn() throws Exception {
final InputColumn<String> col1 = new MockInputColumn<>("jsonDocument", String.class);
final ParseJsonTransformer transformer = new ParseJsonTransformer(col1);
transformer.init();
assertEquals(1, transformer.getOutputColumns().getColumnCount());
final Object[] values = transformer.transform(new MockInputRow());
assertTrue(values.length == 1);
assertNull(values[0]);
}
@Test
public void shouldExtractNestedDocumentsAsCollections() throws Exception {
final InputColumn<String> col1 = new MockInputColumn<>("jsonDocument", String.class);
final ParseJsonTransformer transformer = new ParseJsonTransformer(col1);
transformer.init();
assertEquals(1, transformer.getOutputColumns().getColumnCount());
final String json = "{\"name\":\"shekhar\",\"addresses\":[{\"city\":\"Delhi\",\"country:\":\"India\"},"
+ "{\"city\":\"Delhi\",\"country:\":\"India\"}],\"emails\":[\"email1\",\"email2\"]}";
final Object[] values = transformer.transform(new MockInputRow().put(col1, json));
assertEquals(1, values.length);
final Map<?, ?> map = (Map<?, ?>) values[0];
assertEquals("{name=shekhar, addresses=[{city=Delhi, country:=India}, {city=Delhi, country:=India}], "
+ "emails=[email1, email2]}", map.toString());
assertTrue(map.get("addresses") instanceof List);
final List<?> addresses = (List<?>) map.get("addresses");
assertTrue(addresses.get(0) instanceof Map);
assertTrue(map.get("emails") instanceof List);
}
}