package org.neo4j.shell.tools.imp; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Transaction; import org.neo4j.helpers.collection.Iterables; import org.neo4j.kernel.internal.GraphDatabaseAPI; import org.neo4j.shell.ShellException; import org.neo4j.shell.impl.SameJvmClient; import org.neo4j.shell.kernel.GraphDatabaseShellServer; import org.neo4j.test.TestGraphDatabaseFactory; import java.io.*; import java.net.URL; import java.rmi.RemoteException; import java.util.Collections; import java.util.Scanner; import static org.junit.Assert.*; import static org.neo4j.shell.tools.Asserts.assertCommand; /** * Created by mh on 04.07.13. */ public class ImportCypherAppTest { private GraphDatabaseAPI db; private SameJvmClient client; @Test public void testExecuteCypher() throws Exception { assertCommand(client, "import-cypher start n=node(0) return n", "Query: start n=node(0) return n infile (none) delim ',' quoted false outfile (none)", "Import statement execution created 1 rows of output."); } @Test public void testRunWithOutputFile() throws Exception { assertCommand(client, "import-cypher -o out.csv create (n) return id(n) as id", "Query: create (n) return id(n) as id infile (none) delim ',' quoted false outfile out.csv" , "Import statement execution created 1 rows of output."); assertFile("id", "1"); try (Transaction tx = db.beginTx()) { assertNotNull(db.getNodeById(1)); tx.success(); } } @Test public void testRunWithInputFile() throws Exception { createFile("in.csv", "name", "foo"); assertCommand(client, "import-cypher -i in.csv create (n {name:{name}}) return n.name as name", "Query: create (n {name:{name}}) return n.name as name infile in.csv delim ',' quoted false outfile (none)", "finish after 1 row(s)", "Import statement execution created 1 rows of output."); try (Transaction tx = db.beginTx()) { assertEquals("foo",db.getNodeById(1).getProperty("name")); tx.success(); } } @Test public void testRunWithInputWithTypesFile() throws Exception { createFile("in.csv", "name:string,age:int", "foo,42"); assertCommand(client, "import-cypher -i in.csv create (n {name:{name}, age: {age}}) return n.name as name", "Query: create (n {name:{name}, age: {age}}) return n.name as name infile in.csv delim ',' quoted false outfile (none)", "finish after 1 row(s)", "Import statement execution created 1 rows of output."); try (Transaction tx = db.beginTx()) { Node node = db.getNodeById(1); assertEquals("foo", node.getProperty("name")); assertEquals(42, node.getProperty("age")); tx.success(); } } @Test public void testRunWithInputFileAndReplacements() throws Exception { createFile("in.csv", "name,type", "foo,Bar"); assertCommand(client, "import-cypher -i in.csv create (n:#{type} {name:{name}}) return n.name as name", "Query: create (n:#{type} {name:{name}}) return n.name as name infile in.csv delim ',' quoted false outfile (none)", "finish after 1 row(s)", "Import statement execution created 1 rows of output."); try (Transaction tx = db.beginTx()) { Node node = db.getNodeById(1); assertEquals("foo", node.getProperty("name")); assertEquals("Bar", Iterables.single(node.getLabels()).name()); tx.success(); } } @Test public void testRunWithInputFile2() throws Exception { assertCommand(client, "import-cypher -d \"\\t\" -i import.csv create (n {name:{Trackmbid}}) return n.name as name", "Query: create (n {name:{Trackmbid}}) return n.name as name infile import.csv delim '\t' quoted false outfile (none)", "finish after 9 row(s)", "Import statement execution created 9 rows of output."); try (Transaction tx = db.beginTx()) { assertEquals("5151ffce-8617-443f-959a-82692c717cbf",db.getNodeById(1).getProperty("name")); tx.success(); } } @Test public void testRunWithInputAndOutputFile() throws Exception { String[] data = {"name", "foo", "bar"}; createFile("in.csv", data); assertCommand(client,"import-cypher -i in.csv -o out.csv create (n {name:{name}}) return n.name as name", "Query: create (n {name:{name}}) return n.name as name infile in.csv delim ',' quoted false outfile out.csv", "finish after 2 row(s)", "Import statement execution created 2 rows of output."); assertFile(data); try (Transaction tx = db.beginTx()) { assertEquals("foo",db.getNodeById(1).getProperty("name")); assertEquals("bar",db.getNodeById(2).getProperty("name")); tx.success(); } } @Test public void testRunWithInputFileWithTabDelim() throws Exception { createFile("in.csv", "name\tage", "foo\t12"); assertCommand(client,"import-cypher -d \"\\t\" -i in.csv create (n {name:{name}, age:{age}}) return n.name as name", "Query: create (n {name:{name}, age:{age}}) return n.name as name infile in.csv delim '\t' quoted false outfile (none)", "finish after 1 row(s)", "Import statement execution created 1 rows of output."); try (Transaction tx = db.beginTx()) { assertEquals("foo",db.getNodeById(1).getProperty("name")); assertEquals("12",db.getNodeById(1).getProperty("age")); tx.success(); } } @Test public void testRunWithInputFileWithSpaceDelim() throws Exception { createFile("in.csv", "name age", "foo 12"); assertCommand(client,"import-cypher -d \" \" -i in.csv create (n {name:{name}, age:{age}}) return n.name as name", "Query: create (n {name:{name}, age:{age}}) return n.name as name infile in.csv delim ' ' quoted false outfile (none)", "finish after 1 row(s)", "Import statement execution created 1 rows of output."); try (Transaction tx = db.beginTx()) { assertEquals("foo",db.getNodeById(1).getProperty("name")); assertEquals("12",db.getNodeById(1).getProperty("age")); tx.success(); } } @Test @Ignore("Slow") public void testRunWithInputUrlWithTabDelim() throws Exception { // URL url = getClass().getResource("/in.csv"); URL url = new URL("https://dl.dropboxusercontent.com/u/14493611/in.csv"); assertCommand(client, "import-cypher -d \"\\t\" -i " + url + " create (n {name:{name}, age:{age}}) return n.name as name", "Query: create (n {name:{name}, age:{age}}) return n.name as name infile " + url + " delim '\t' quoted false outfile (none)", "Import statement execution created 1 rows of output."); try (Transaction tx = db.beginTx()) { assertEquals("foo",db.getNodeById(1).getProperty("name")); assertEquals("12",db.getNodeById(1).getProperty("age")); tx.success(); } } private void createFile(String fileName, String...rows) throws IOException { PrintWriter inFile = new PrintWriter(new FileWriter(fileName)); for (String row : rows) { inFile.println(row); } inFile.close(); } @Test public void testRunWithOutputFileAndMultipleLines() throws Exception { assertCommand(client, "import-cypher -o out.csv start x=node(0,0) create (n) return id(n) as id", "Query: start x=node(0,0) create (n) return id(n) as id infile (none) delim ',' quoted false outfile out.csv", "Import statement execution created 2 rows of output."); assertFile("id","1","2"); try (Transaction tx = db.beginTx()) { assertNotNull(db.getNodeById(1)); assertNotNull(db.getNodeById(2)); tx.success(); } } @Test public void testToStringWithDouble() throws Exception { assertCommand(client, "import-cypher -o out.csv return 10000000.0001 as dec, 1000000000 as int", "Query: return 10000000.0001 as dec, 1000000000 as int infile (none) delim ',' quoted false outfile out.csv batch-size 1000", "Import statement execution created 1 rows of output."); assertFile("dec\",\"int", "10000000.0001\",\"1000000000"); } private void assertFile(String...expected) throws FileNotFoundException { File file = new File("out.csv"); assertTrue("outfile exits",file.exists()); Scanner scanner = new Scanner(file).useDelimiter("\n"); for (String row : expected) { assertEquals(quote(row),scanner.next()); } assertFalse(scanner.hasNext()); } private String quote(String row) { return '"'+row+'"'; } private String readFile(File file) throws FileNotFoundException { return new Scanner(file).useDelimiter("\\z").next(); } @Before public void setUp() throws RemoteException, ShellException { db = (GraphDatabaseAPI) new TestGraphDatabaseFactory().newImpermanentDatabase(); try (Transaction tx = db.beginTx()) { db.createNode(); tx.success(); } client = new SameJvmClient(Collections.<String, Serializable>emptyMap(), new GraphDatabaseShellServer(db), new TestCtrlCHandler()); } }