1
1
package apoc .s3 ;
2
2
3
3
import apoc .load .LoadCsv ;
4
+ import apoc .load .LoadDirectory ;
5
+ import apoc .load .LoadHtml ;
4
6
import apoc .load .LoadJson ;
5
7
import apoc .load .Xml ;
8
+ import apoc .load .xls .LoadXls ;
6
9
import apoc .util .TestUtil ;
7
10
import apoc .util .Util ;
8
- import apoc .util .s3 .S3BaseTest ;
9
11
import apoc .xml .XmlTestUtils ;
10
12
import org .junit .Assert ;
11
13
import org .junit .Before ;
12
14
import org .junit .Rule ;
13
15
import org .junit .Test ;
14
16
import org .junit .jupiter .api .AfterAll ;
15
-
16
17
import org .neo4j .driver .internal .util .Iterables ;
18
+ import org .neo4j .graphdb .Result ;
17
19
import org .neo4j .test .rule .DbmsRule ;
18
20
import org .neo4j .test .rule .ImpermanentDbmsRule ;
19
21
22
+ import java .nio .charset .StandardCharsets ;
23
+ import java .util .ArrayList ;
24
+ import java .util .LinkedHashMap ;
25
+ import java .util .List ;
26
+ import java .util .Map ;
27
+
20
28
import static apoc .ApocConfig .APOC_IMPORT_FILE_ENABLED ;
21
29
import static apoc .ApocConfig .APOC_IMPORT_FILE_USE_NEO4J_CONFIG ;
22
30
import static apoc .ApocConfig .apocConfig ;
23
31
import static apoc .load .LoadCsvTest .assertRow ;
24
32
import static apoc .util .ExtendedITUtil .EXTENDED_PATH ;
25
33
import static apoc .util .MapUtil .map ;
34
+ import static apoc .util .S3ExtendedUtil .putToS3AndGetUrl ;
26
35
import static apoc .util .TestUtil .testCall ;
27
36
import static apoc .util .TestUtil .testResult ;
28
37
import static java .util .Arrays .asList ;
29
38
import static org .junit .Assert .assertEquals ;
30
39
import static org .junit .Assert .assertFalse ;
40
+ import static org .junit .Assert .assertTrue ;
31
41
32
- public class LoadS3Test extends S3BaseTest {
42
+ public class LoadS3Test extends S3BaseExtendedTest {
33
43
34
44
@ Rule
35
45
public DbmsRule db = new ImpermanentDbmsRule ();
36
46
37
47
@ Before
38
48
public void setUp () throws Exception {
39
- TestUtil .registerProcedure (db , LoadCsv .class , LoadJson .class , Xml .class );
49
+ TestUtil .registerProcedure (db , LoadCsv .class , LoadDirectory . class , LoadJson . class , LoadHtml . class , LoadXls .class , Xml .class );
40
50
apocConfig ().setProperty (APOC_IMPORT_FILE_ENABLED , true );
41
51
apocConfig ().setProperty (APOC_IMPORT_FILE_USE_NEO4J_CONFIG , false );
52
+ putFolderToS3 ();
42
53
}
43
54
44
55
@ AfterAll
@@ -47,10 +58,8 @@ public void tearDownAll() {
47
58
}
48
59
49
60
@ Test
50
- public void testLoadCsvS3 () {
51
- String url = s3Container .putFile (EXTENDED_PATH + "src/test/resources/test.csv" );
52
- url = removeRegionFromUrl (url );
53
-
61
+ public void testLoadCsv () {
62
+ String url = putToS3AndGetUrl (s3ExtendedContainer , EXTENDED_PATH + "src/test/resources/test.csv" );
54
63
testResult (db , "CALL apoc.load.csv($url,{failOnError:false})" , map ("url" , url ), (r ) -> {
55
64
assertRow (r , "Selma" , "8" , 0L );
56
65
assertRow (r , "Rana" , "11" , 1L );
@@ -59,29 +68,72 @@ public void testLoadCsvS3() {
59
68
});
60
69
}
61
70
62
- @ Test public void testLoadJsonS3 () {
63
- String url = s3Container .putFile (EXTENDED_PATH + "src/test/resources/map.json" );
64
- url = removeRegionFromUrl (url );
65
-
71
+ @ Test public void testLoadJson () {
72
+ String url = putToS3AndGetUrl (s3ExtendedContainer , EXTENDED_PATH + "src/test/resources/map.json" );
66
73
testCall (db , "CALL apoc.load.json($url,'')" ,map ("url" , url ),
67
74
(row ) -> {
68
75
assertEquals (map ("foo" ,asList (1L ,2L ,3L )), row .get ("value" ));
69
76
});
70
77
}
71
78
72
- @ Test public void testLoadXmlS3 () {
73
- String url = s3Container .putFile (EXTENDED_PATH + "src/test/resources/xml/books.xml" );
74
- url = removeRegionFromUrl (url );
75
-
79
+ @ Test public void testLoadXml () {
80
+ String url = putToS3AndGetUrl (s3ExtendedContainer , EXTENDED_PATH + "src/test/resources/xml/books.xml" );
76
81
testCall (db , "CALL apoc.load.xml($url,'/catalog/book[title=\" Maeve Ascendant\" ]/.',{failOnError:false}) yield value as result" , Util .map ("url" , url ), (r ) -> {
77
82
Object value = Iterables .single (r .values ());
78
83
Assert .assertEquals (XmlTestUtils .XML_XPATH_AS_NESTED_MAP , value );
79
84
});
80
85
}
81
86
82
- private String removeRegionFromUrl (String url ) {
83
- return url .replace (s3Container .getEndpointConfiguration ().getSigningRegion () + "." , "" );
87
+ @ Test public void testLoadXls () {
88
+ String url = putToS3AndGetUrl (s3ExtendedContainer , EXTENDED_PATH + "src/test/resources/load_test.xlsx" );
89
+ testResult (db , "CALL apoc.load.xls($url,'Full',{mapping:{Integer:{type:'int'}, Array:{type:'int',array:true,arraySep:';'}}})" , map ("url" ,url ), // 'file:load_test.xlsx'
90
+ (r ) -> {
91
+ assertXlsRow (r ,0L ,"String" ,"Test" ,"Boolean" ,true ,"Integer" ,2L ,"Float" ,1.5d ,"Array" ,asList (1L ,2L ,3L ));
92
+ assertFalse ("Should not have another row" ,r .hasNext ());
93
+ });
84
94
}
85
95
96
+ @ Test
97
+ public void testLoadHtml () {
98
+ String url = putToS3AndGetUrl (s3ExtendedContainer , EXTENDED_PATH + "src/test/resources/wikipedia.html" );
99
+
100
+ Map <String , Object > query = map ("links" , "a[href]" );
101
+
102
+ testCall (db , "CALL apoc.load.html($url,$query)" ,
103
+ map ("url" , url , "query" , query ),
104
+ row -> {
105
+ final List <Map <String , Object >> actual = (List ) ((Map ) row .get ("value" )).get ("links" );
106
+ assertEquals (106 , actual .size ());
107
+ assertTrue (actual .stream ().allMatch (i -> i .get ("tagName" ).equals ("a" )));
108
+ });
109
+ }
110
+
111
+ private void putFolderToS3 () {
112
+ StringBuilder csv = new StringBuilder (); // Faster
113
+ csv .append ("name,age\r \n " );
114
+ csv .append ("Bonzo,20\r \n " );
115
+ csv .append ("Oronzo,45\r \n " );
116
+ byte [] data = csv .toString ().getBytes (StandardCharsets .UTF_8 );
117
+
118
+ s3ExtendedContainer .putObjectToS3 ("test_folder/test.csv" , data );
119
+
120
+ csv = new StringBuilder ();
121
+ csv .append ("name,age\r \n " );
122
+ csv .append ("Bobby,18\r \n " );
123
+ csv .append ("Maruccio,90\r \n " );
124
+ data = csv .toString ().getBytes (StandardCharsets .UTF_8 );
125
+
126
+ s3ExtendedContainer .putObjectToS3 ("test_folder/test_1.csv" , data );
127
+ }
128
+
129
+ static void assertXlsRow (Result r , long lineNo , Object ...data ) {
130
+ Map <String , Object > row = r .next ();
131
+ Map <String , Object > map = map (data );
132
+ assertEquals (map , row .get ("map" ));
133
+ Map <Object , Object > stringMap = new LinkedHashMap <>(map .size ());
134
+ map .forEach ((k ,v ) -> stringMap .put (k ,v == null ? null : v .toString ()));
135
+ assertEquals (new ArrayList <>(map .values ()), row .get ("list" ));
136
+ assertEquals (lineNo , row .get ("lineNo" ));
137
+ }
86
138
87
139
}
0 commit comments