embulk-output-kintone 1.0.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +65 -1
- data/build.gradle +1 -0
- data/classpath/commons-csv-1.9.0.jar +0 -0
- data/classpath/embulk-output-kintone-1.2.0.jar +0 -0
- data/classpath/externalsortinginjava-0.6.2.jar +0 -0
- data/classpath/{shadow-kintone-java-client-1.0.0-all.jar → shadow-kintone-java-client-1.2.0-all.jar} +0 -0
- data/src/main/java/org/embulk/output/kintone/KintoneClient.java +117 -0
- data/src/main/java/org/embulk/output/kintone/KintoneColumnOption.java +5 -0
- data/src/main/java/org/embulk/output/kintone/KintoneColumnType.java +226 -5
- data/src/main/java/org/embulk/output/kintone/KintoneColumnVisitor.java +82 -13
- data/src/main/java/org/embulk/output/kintone/KintoneMode.java +52 -4
- data/src/main/java/org/embulk/output/kintone/KintoneOutputPlugin.java +12 -20
- data/src/main/java/org/embulk/output/kintone/KintonePageOutput.java +123 -127
- data/src/main/java/org/embulk/output/kintone/KintoneSortColumn.java +33 -0
- data/src/main/java/org/embulk/output/kintone/PluginTask.java +32 -0
- data/src/main/java/org/embulk/output/kintone/deserializer/DeserializeApplier.java +19 -0
- data/src/main/java/org/embulk/output/kintone/deserializer/DeserializeException.java +7 -0
- data/src/main/java/org/embulk/output/kintone/deserializer/Deserializer.java +279 -0
- data/src/main/java/org/embulk/output/kintone/record/Id.java +18 -0
- data/src/main/java/org/embulk/output/kintone/record/IdOrUpdateKey.java +45 -0
- data/src/main/java/org/embulk/output/kintone/record/Skip.java +14 -0
- data/src/main/java/org/embulk/output/kintone/reducer/CSVInputColumnVisitor.java +78 -0
- data/src/main/java/org/embulk/output/kintone/reducer/CSVOutputColumnVisitor.java +79 -0
- data/src/main/java/org/embulk/output/kintone/reducer/ReduceException.java +11 -0
- data/src/main/java/org/embulk/output/kintone/reducer/ReduceType.java +190 -0
- data/src/main/java/org/embulk/output/kintone/reducer/ReducedPageOutput.java +100 -0
- data/src/main/java/org/embulk/output/kintone/reducer/Reducer.java +355 -0
- data/src/main/java/org/embulk/output/kintone/util/Lazy.java +20 -0
- data/src/test/java/org/embulk/output/kintone/KintoneClientTest.java +139 -0
- data/src/test/java/org/embulk/output/kintone/KintoneColumnOptionBuilder.java +7 -0
- data/src/test/java/org/embulk/output/kintone/KintoneColumnTypeTest.java +194 -0
- data/src/test/java/org/embulk/output/kintone/KintoneColumnVisitorTest.java +183 -64
- data/src/test/java/org/embulk/output/kintone/KintoneColumnVisitorVerifier.java +19 -9
- data/src/test/java/org/embulk/output/kintone/KintonePageOutputVerifier.java +120 -51
- data/src/test/java/org/embulk/output/kintone/MockClient.java +112 -0
- data/src/test/java/org/embulk/output/kintone/TestKintoneOutputPlugin.java +147 -22
- data/src/test/java/org/embulk/output/kintone/TestTaskMode.java +1 -0
- data/src/test/java/org/embulk/output/kintone/TestTaskReduce.java +47 -0
- data/src/test/java/org/embulk/output/kintone/TestTaskReduceException.java +50 -0
- data/src/test/java/org/embulk/output/kintone/TestTaskReduceSubtable.java +47 -0
- data/src/test/java/org/embulk/output/kintone/TestTaskSkip.java +80 -0
- data/src/test/java/org/embulk/output/kintone/TestTaskSkipId.java +80 -0
- data/src/test/java/org/embulk/output/kintone/deserializer/DeserializerTest.java +165 -0
- data/src/test/java/org/embulk/output/kintone/reducer/ReduceTypeTest.java +154 -0
- data/src/test/resources/org/embulk/output/kintone/client/config.yml +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/config.yml +2 -1
- data/src/test/resources/org/embulk/output/kintone/task/mode/config.yml +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/mode/input.csv +7 -7
- data/src/test/resources/org/embulk/output/kintone/task/mode/insert_add_records.jsonl +6 -6
- data/src/test/resources/org/embulk/output/kintone/task/mode/{insert_add_ignore_nulls_records.jsonl → insert_ignore_nulls_add_records.jsonl} +2 -2
- data/src/test/resources/org/embulk/output/kintone/task/mode/{insert_add_prefer_nulls_records.jsonl → insert_prefer_nulls_add_records.jsonl} +6 -6
- data/src/test/resources/org/embulk/output/kintone/task/mode/{update_update_ignore_nulls_records.jsonl → update_ignore_nulls_update_records.jsonl} +2 -2
- data/src/test/resources/org/embulk/output/kintone/task/mode/{update_update_prefer_nulls_records.jsonl → update_prefer_nulls_update_records.jsonl} +3 -3
- data/src/test/resources/org/embulk/output/kintone/task/mode/update_update_records.jsonl +6 -6
- data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_records.jsonl → upsert_never_skip_add_records.jsonl} +2 -2
- data/src/test/resources/org/embulk/output/kintone/task/mode/upsert_never_skip_double_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_ignore_nulls_records.jsonl → upsert_never_skip_ignore_nulls_update_records.jsonl} +2 -2
- data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_prefer_nulls_records.jsonl → upsert_never_skip_prefer_nulls_add_records.jsonl} +3 -3
- data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_prefer_nulls_records.jsonl → upsert_never_skip_prefer_nulls_update_records.jsonl} +3 -3
- data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_records.jsonl → upsert_never_skip_update_records.jsonl} +4 -4
- data/src/test/resources/org/embulk/output/kintone/task/reduce/config.yml +171 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/input.csv +7 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_ignore_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/update_ignore_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/update_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/update_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_add_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_double_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_add_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_add_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_update_records.jsonl +4 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/config.yml +36 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/derived_columns.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/input.csv +13 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/insert_add_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/update_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/config.yml +343 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/derived_columns.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/input.csv +13 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_ignore_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_ignore_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_add_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_add_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_double_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/config.yml +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/input.csv +7 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_always_skip_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_always_skip_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_never_skip_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_never_skip_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/insert_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_long_number_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_long_number_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_long_number_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_long_number_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_update_records.jsonl +5 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_never_skip_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/update_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_add_records.jsonl +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_add_records.jsonl +4 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_add_records.jsonl +4 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_add_records.jsonl +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_string_single_line_text_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_string_single_line_text_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/config.yml +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/input.csv +7 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_always_skip_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_always_skip_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_never_skip_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_never_skip_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_prefer_nulls_add_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_update_records.jsonl +5 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_never_skip_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_prefer_nulls_update_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_update_records.jsonl +6 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_update_records.jsonl +5 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_add_records.jsonl +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls_add_records.jsonl +4 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_update_records.jsonl +5 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls__id_add_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls__id_values.json +1 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls_add_records.jsonl +3 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls_update_records.jsonl +2 -0
- data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_update_records.jsonl +5 -0
- metadata +163 -17
- data/classpath/embulk-output-kintone-1.0.0.jar +0 -0
- /data/src/test/resources/org/embulk/output/kintone/task/mode/{values.json → upsert_never_skip_double_single_line_text_values.json} +0 -0
- /data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_ignore_nulls_records.jsonl → upsert_never_skip_ignore_nulls_add_records.jsonl} +0 -0
- /data/src/test/resources/org/embulk/output/kintone/task/mode/{values_ignore_nulls.json → upsert_never_skip_ignore_nulls_double_single_line_text_values.json} +0 -0
- /data/src/test/resources/org/embulk/output/kintone/task/mode/{values_prefer_nulls.json → upsert_never_skip_prefer_nulls_double_single_line_text_values.json} +0 -0
@@ -0,0 +1,139 @@
|
|
1
|
+
package org.embulk.output.kintone;
|
2
|
+
|
3
|
+
import static org.hamcrest.MatcherAssert.assertThat;
|
4
|
+
import static org.hamcrest.Matchers.is;
|
5
|
+
import static org.junit.Assert.assertThrows;
|
6
|
+
|
7
|
+
import java.util.Collections;
|
8
|
+
import org.embulk.config.ConfigException;
|
9
|
+
import org.embulk.config.ConfigSource;
|
10
|
+
import org.embulk.output.kintone.util.Lazy;
|
11
|
+
import org.embulk.spi.Schema;
|
12
|
+
import org.embulk.spi.type.Type;
|
13
|
+
import org.embulk.spi.type.Types;
|
14
|
+
import org.junit.Before;
|
15
|
+
import org.junit.Test;
|
16
|
+
|
17
|
+
public class KintoneClientTest extends TestKintoneOutputPlugin {
|
18
|
+
private ConfigSource config;
|
19
|
+
|
20
|
+
@Before
|
21
|
+
public void before() {
|
22
|
+
config = loadConfigYaml("client/config.yml");
|
23
|
+
}
|
24
|
+
|
25
|
+
@Test
|
26
|
+
public void testInsert() {
|
27
|
+
merge(config("mode: insert"));
|
28
|
+
merge(config("update_key: null"));
|
29
|
+
runWithMockClient(Lazy::get);
|
30
|
+
merge(config("update_key: long_number"));
|
31
|
+
assertConfigException("When mode is insert, require no update_key.");
|
32
|
+
merge(config("update_key: string_single_line_text"));
|
33
|
+
assertConfigException("When mode is insert, require no update_key.");
|
34
|
+
merge(config("update_key: $id"));
|
35
|
+
assertConfigException("When mode is insert, require no update_key.", id(Types.LONG));
|
36
|
+
merge(config("update_key: null"));
|
37
|
+
runWithMockClient(Lazy::get, id(Types.STRING));
|
38
|
+
}
|
39
|
+
|
40
|
+
@Test
|
41
|
+
public void testUpdate() {
|
42
|
+
merge(config("mode: update"));
|
43
|
+
merge(config("update_key: null"));
|
44
|
+
assertConfigException("When mode is update, require update_key or id column.");
|
45
|
+
merge(config("update_key: non_existing_column"));
|
46
|
+
assertConfigException("The column 'non_existing_column' for update does not exist.");
|
47
|
+
merge(config("update_key: non_existing_field"));
|
48
|
+
assertConfigException("The field 'non_existing_field' for update does not exist.");
|
49
|
+
merge(config("update_key: invalid_type_field_multi_line_text"));
|
50
|
+
assertConfigException("The update_key must be 'SINGLE_LINE_TEXT' or 'NUMBER'.");
|
51
|
+
merge(config("update_key: long_number"));
|
52
|
+
runWithMockClient(Lazy::get);
|
53
|
+
merge(config("update_key: string_single_line_text"));
|
54
|
+
runWithMockClient(Lazy::get);
|
55
|
+
merge(config("update_key: $id"));
|
56
|
+
runWithMockClient(Lazy::get, id(Types.LONG));
|
57
|
+
merge(config("update_key: null"));
|
58
|
+
assertConfigException("The id column must be 'long'.", id(Types.STRING));
|
59
|
+
}
|
60
|
+
|
61
|
+
@Test
|
62
|
+
public void testUpsert() {
|
63
|
+
merge(config("mode: upsert"));
|
64
|
+
merge(config("update_key: null"));
|
65
|
+
assertConfigException("When mode is upsert, require update_key or id column.");
|
66
|
+
merge(config("update_key: non_existing_column"));
|
67
|
+
assertConfigException("The column 'non_existing_column' for update does not exist.");
|
68
|
+
merge(config("update_key: non_existing_field"));
|
69
|
+
assertConfigException("The field 'non_existing_field' for update does not exist.");
|
70
|
+
merge(config("update_key: invalid_type_field_multi_line_text"));
|
71
|
+
assertConfigException("The update_key must be 'SINGLE_LINE_TEXT' or 'NUMBER'.");
|
72
|
+
merge(config("update_key: long_number"));
|
73
|
+
runWithMockClient(Lazy::get);
|
74
|
+
merge(config("update_key: string_single_line_text"));
|
75
|
+
runWithMockClient(Lazy::get);
|
76
|
+
merge(config("update_key: $id"));
|
77
|
+
runWithMockClient(Lazy::get, id(Types.LONG));
|
78
|
+
merge(config("update_key: null"));
|
79
|
+
assertConfigException("The id column must be 'long'.", id(Types.STRING));
|
80
|
+
}
|
81
|
+
|
82
|
+
private void assertConfigException(String message) {
|
83
|
+
assertConfigException(message, builder());
|
84
|
+
}
|
85
|
+
|
86
|
+
private void assertConfigException(String message, Schema.Builder builder) {
|
87
|
+
runWithMockClient(
|
88
|
+
client ->
|
89
|
+
assertThat(assertThrows(ConfigException.class, client::get).getMessage(), is(message)),
|
90
|
+
builder);
|
91
|
+
}
|
92
|
+
|
93
|
+
private void runWithMockClient(Consumer<Lazy<KintoneClient>> consumer) {
|
94
|
+
runWithMockClient(consumer, builder());
|
95
|
+
}
|
96
|
+
|
97
|
+
private void runWithMockClient(Consumer<Lazy<KintoneClient>> consumer, Schema.Builder builder) {
|
98
|
+
MockClient mockClient =
|
99
|
+
new MockClient(
|
100
|
+
config.get(String.class, "domain"),
|
101
|
+
Collections.emptyList(),
|
102
|
+
Collections.emptyList(),
|
103
|
+
"");
|
104
|
+
try (Lazy<KintoneClient> client = KintoneClient.lazy(this::task, schema(builder))) {
|
105
|
+
mockClient.run(() -> consumer.accept(client));
|
106
|
+
} catch (Exception e) {
|
107
|
+
throw new RuntimeException(e);
|
108
|
+
}
|
109
|
+
}
|
110
|
+
|
111
|
+
private void merge(ConfigSource config) {
|
112
|
+
this.config.merge(config);
|
113
|
+
}
|
114
|
+
|
115
|
+
private PluginTask task() {
|
116
|
+
return config.loadConfig(PluginTask.class);
|
117
|
+
}
|
118
|
+
|
119
|
+
private static Schema schema(Schema.Builder builder) {
|
120
|
+
return builder
|
121
|
+
.add("non_existing_field", Types.LONG)
|
122
|
+
.add("invalid_type_field_multi_line_text", Types.STRING)
|
123
|
+
.add("long_number", Types.LONG)
|
124
|
+
.add("string_single_line_text", Types.STRING)
|
125
|
+
.build();
|
126
|
+
}
|
127
|
+
|
128
|
+
private static Schema.Builder id(Type type) {
|
129
|
+
return builder().add("$id", type);
|
130
|
+
}
|
131
|
+
|
132
|
+
private static Schema.Builder builder() {
|
133
|
+
return Schema.builder();
|
134
|
+
}
|
135
|
+
|
136
|
+
private interface Consumer<T> {
|
137
|
+
void accept(T t) throws Exception;
|
138
|
+
}
|
139
|
+
}
|
@@ -1,5 +1,7 @@
|
|
1
1
|
package org.embulk.output.kintone;
|
2
2
|
|
3
|
+
import java.util.Collections;
|
4
|
+
import java.util.List;
|
3
5
|
import org.embulk.config.TaskSource;
|
4
6
|
|
5
7
|
public class KintoneColumnOptionBuilder {
|
@@ -50,6 +52,11 @@ public class KintoneColumnOptionBuilder {
|
|
50
52
|
return valueSeparator;
|
51
53
|
}
|
52
54
|
|
55
|
+
@Override
|
56
|
+
public List<KintoneSortColumn> getSortColumns() {
|
57
|
+
return Collections.emptyList();
|
58
|
+
}
|
59
|
+
|
53
60
|
@Override
|
54
61
|
public void validate() {}
|
55
62
|
|
@@ -0,0 +1,194 @@
|
|
1
|
+
package org.embulk.output.kintone;
|
2
|
+
|
3
|
+
import static org.embulk.output.kintone.KintoneColumnType.CHECK_BOX;
|
4
|
+
import static org.embulk.output.kintone.KintoneColumnType.DATE;
|
5
|
+
import static org.embulk.output.kintone.KintoneColumnType.DATETIME;
|
6
|
+
import static org.embulk.output.kintone.KintoneColumnType.DROP_DOWN;
|
7
|
+
import static org.embulk.output.kintone.KintoneColumnType.FILE;
|
8
|
+
import static org.embulk.output.kintone.KintoneColumnType.GROUP_SELECT;
|
9
|
+
import static org.embulk.output.kintone.KintoneColumnType.LINK;
|
10
|
+
import static org.embulk.output.kintone.KintoneColumnType.MULTI_LINE_TEXT;
|
11
|
+
import static org.embulk.output.kintone.KintoneColumnType.MULTI_SELECT;
|
12
|
+
import static org.embulk.output.kintone.KintoneColumnType.NUMBER;
|
13
|
+
import static org.embulk.output.kintone.KintoneColumnType.ORGANIZATION_SELECT;
|
14
|
+
import static org.embulk.output.kintone.KintoneColumnType.RADIO_BUTTON;
|
15
|
+
import static org.embulk.output.kintone.KintoneColumnType.RICH_TEXT;
|
16
|
+
import static org.embulk.output.kintone.KintoneColumnType.SINGLE_LINE_TEXT;
|
17
|
+
import static org.embulk.output.kintone.KintoneColumnType.SUBTABLE;
|
18
|
+
import static org.embulk.output.kintone.KintoneColumnType.TIME;
|
19
|
+
import static org.embulk.output.kintone.KintoneColumnType.USER_SELECT;
|
20
|
+
import static org.hamcrest.MatcherAssert.assertThat;
|
21
|
+
import static org.hamcrest.Matchers.is;
|
22
|
+
import static org.junit.Assert.assertThrows;
|
23
|
+
|
24
|
+
import com.kintone.client.model.record.CheckBoxFieldValue;
|
25
|
+
import com.kintone.client.model.record.DateFieldValue;
|
26
|
+
import com.kintone.client.model.record.DateTimeFieldValue;
|
27
|
+
import com.kintone.client.model.record.DropDownFieldValue;
|
28
|
+
import com.kintone.client.model.record.LinkFieldValue;
|
29
|
+
import com.kintone.client.model.record.MultiLineTextFieldValue;
|
30
|
+
import com.kintone.client.model.record.MultiSelectFieldValue;
|
31
|
+
import com.kintone.client.model.record.NumberFieldValue;
|
32
|
+
import com.kintone.client.model.record.RadioButtonFieldValue;
|
33
|
+
import com.kintone.client.model.record.RichTextFieldValue;
|
34
|
+
import com.kintone.client.model.record.SingleLineTextFieldValue;
|
35
|
+
import com.kintone.client.model.record.SubtableFieldValue;
|
36
|
+
import com.kintone.client.model.record.TableRow;
|
37
|
+
import com.kintone.client.model.record.TimeFieldValue;
|
38
|
+
import java.math.BigDecimal;
|
39
|
+
import java.time.Instant;
|
40
|
+
import java.time.LocalDate;
|
41
|
+
import java.time.LocalTime;
|
42
|
+
import java.time.ZonedDateTime;
|
43
|
+
import java.util.Arrays;
|
44
|
+
import java.util.List;
|
45
|
+
import java.util.stream.Collectors;
|
46
|
+
import org.embulk.output.kintone.deserializer.DeserializerTest;
|
47
|
+
import org.embulk.spi.time.Timestamp;
|
48
|
+
import org.junit.Test;
|
49
|
+
import org.msgpack.value.Value;
|
50
|
+
import org.msgpack.value.ValueFactory;
|
51
|
+
|
52
|
+
public class KintoneColumnTypeTest {
|
53
|
+
private static final Timestamp EPOCH = Timestamp.ofInstant(Instant.EPOCH);
|
54
|
+
private static final Value EMPTY = ValueFactory.newString("");
|
55
|
+
|
56
|
+
@Test
|
57
|
+
public void testSupportedTypes() {
|
58
|
+
// spotless:off
|
59
|
+
assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue(false, null)).getValue(), is("false"));
|
60
|
+
assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue(0L, null)).getValue(), is("0"));
|
61
|
+
assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue(0.0d, null)).getValue(), is("0.0"));
|
62
|
+
assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue("", null)).getValue(), is(""));
|
63
|
+
assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue(EPOCH, null)).getValue(), is("1970-01-01T00:00:00Z"));
|
64
|
+
assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue(EMPTY, null)).getValue(), is("\"\""));
|
65
|
+
assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue(false, null)).getValue(), is("false"));
|
66
|
+
assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue(0L, null)).getValue(), is("0"));
|
67
|
+
assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue(0.0d, null)).getValue(), is("0.0"));
|
68
|
+
assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue("", null)).getValue(), is(""));
|
69
|
+
assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue(EPOCH, null)).getValue(), is("1970-01-01T00:00:00Z"));
|
70
|
+
assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue(EMPTY, null)).getValue(), is("\"\""));
|
71
|
+
assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue(false, null)).getValue(), is("false"));
|
72
|
+
assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue(0L, null)).getValue(), is("0"));
|
73
|
+
assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue(0.0d, null)).getValue(), is("0.0"));
|
74
|
+
assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue("", null)).getValue(), is(""));
|
75
|
+
assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue(EPOCH, null)).getValue(), is("1970-01-01T00:00:00Z"));
|
76
|
+
assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue(EMPTY, null)).getValue(), is("\"\""));
|
77
|
+
assertThat(((NumberFieldValue) NUMBER.getFieldValue(false, null)).getValue(), is(number("0")));
|
78
|
+
assertThat(((NumberFieldValue) NUMBER.getFieldValue(0L, null)).getValue(), is(number("0")));
|
79
|
+
assertThat(((NumberFieldValue) NUMBER.getFieldValue(0.0d, null)).getValue(), is(number("0.0")));
|
80
|
+
assertThat(((NumberFieldValue) NUMBER.getFieldValue("", null)).getValue(), is(number("0")));
|
81
|
+
assertThat(((NumberFieldValue) NUMBER.getFieldValue(EPOCH, null)).getValue(), is(number("0")));
|
82
|
+
assertThat(((CheckBoxFieldValue) CHECK_BOX.getFieldValue("", null)).getValues(), is(list()));
|
83
|
+
assertThat(((RadioButtonFieldValue) RADIO_BUTTON.getFieldValue("", null)).getValue(), is(""));
|
84
|
+
assertThat(((MultiSelectFieldValue) MULTI_SELECT.getFieldValue("", null)).getValues(), is(list()));
|
85
|
+
assertThat(((DropDownFieldValue) DROP_DOWN.getFieldValue("", null)).getValue(), is(""));
|
86
|
+
assertThat(((DateFieldValue) DATE.getFieldValue(0L, null)).getValue(), is(date("1970-01-01")));
|
87
|
+
assertThat(((DateFieldValue) DATE.getFieldValue(0.0d, null)).getValue(), is(date("1970-01-01")));
|
88
|
+
assertThat(((DateFieldValue) DATE.getFieldValue("", null)).getValue(), is(date("1970-01-01")));
|
89
|
+
assertThat(((DateFieldValue) DATE.getFieldValue(EPOCH, null)).getValue(), is(date("1970-01-01")));
|
90
|
+
assertThat(((TimeFieldValue) TIME.getFieldValue(0L, null)).getValue(), is(time("00:00:00")));
|
91
|
+
assertThat(((TimeFieldValue) TIME.getFieldValue(0.0d, null)).getValue(), is(time("00:00:00")));
|
92
|
+
assertThat(((TimeFieldValue) TIME.getFieldValue("", null)).getValue(), is(time("00:00:00")));
|
93
|
+
assertThat(((TimeFieldValue) TIME.getFieldValue(EPOCH, null)).getValue(), is(time("00:00:00")));
|
94
|
+
assertThat(((DateTimeFieldValue) DATETIME.getFieldValue(0L, null)).getValue(), is(dateTime("1970-01-01T00:00:00Z")));
|
95
|
+
assertThat(((DateTimeFieldValue) DATETIME.getFieldValue(0.0d, null)).getValue(), is(dateTime("1970-01-01T00:00:00Z")));
|
96
|
+
assertThat(((DateTimeFieldValue) DATETIME.getFieldValue("", null)).getValue(), is(dateTime("1970-01-01T00:00:00Z")));
|
97
|
+
assertThat(((DateTimeFieldValue) DATETIME.getFieldValue(EPOCH, null)).getValue(), is(dateTime("1970-01-01T00:00:00Z")));
|
98
|
+
assertThat(((LinkFieldValue) LINK.getFieldValue("", null)).getValue(), is(""));
|
99
|
+
assertThat(((SubtableFieldValue) SUBTABLE.getFieldValue("", null)).getRows(), is(rows()));
|
100
|
+
assertThat(((SubtableFieldValue) SUBTABLE.getFieldValue(EMPTY, null)).getRows(), is(rows()));
|
101
|
+
// spotless:on
|
102
|
+
}
|
103
|
+
|
104
|
+
@Test
|
105
|
+
public void testUnsupportedTypes() {
|
106
|
+
// spotless:off
|
107
|
+
assertThrows(UnsupportedOperationException.class, () -> NUMBER.getFieldValue(EMPTY, null));
|
108
|
+
assertThrows(UnsupportedOperationException.class, () -> CHECK_BOX.getFieldValue(false, null));
|
109
|
+
assertThrows(UnsupportedOperationException.class, () -> CHECK_BOX.getFieldValue(0L, null));
|
110
|
+
assertThrows(UnsupportedOperationException.class, () -> CHECK_BOX.getFieldValue(0.0d, null));
|
111
|
+
assertThrows(UnsupportedOperationException.class, () -> CHECK_BOX.getFieldValue(EPOCH, null));
|
112
|
+
assertThrows(UnsupportedOperationException.class, () -> CHECK_BOX.getFieldValue(EMPTY, null));
|
113
|
+
assertThrows(UnsupportedOperationException.class, () -> RADIO_BUTTON.getFieldValue(false, null));
|
114
|
+
assertThrows(UnsupportedOperationException.class, () -> RADIO_BUTTON.getFieldValue(0L, null));
|
115
|
+
assertThrows(UnsupportedOperationException.class, () -> RADIO_BUTTON.getFieldValue(0.0d, null));
|
116
|
+
assertThrows(UnsupportedOperationException.class, () -> RADIO_BUTTON.getFieldValue(EPOCH, null));
|
117
|
+
assertThrows(UnsupportedOperationException.class, () -> RADIO_BUTTON.getFieldValue(EMPTY, null));
|
118
|
+
assertThrows(UnsupportedOperationException.class, () -> MULTI_SELECT.getFieldValue(false, null));
|
119
|
+
assertThrows(UnsupportedOperationException.class, () -> MULTI_SELECT.getFieldValue(0L, null));
|
120
|
+
assertThrows(UnsupportedOperationException.class, () -> MULTI_SELECT.getFieldValue(0.0d, null));
|
121
|
+
assertThrows(UnsupportedOperationException.class, () -> MULTI_SELECT.getFieldValue(EPOCH, null));
|
122
|
+
assertThrows(UnsupportedOperationException.class, () -> MULTI_SELECT.getFieldValue(EMPTY, null));
|
123
|
+
assertThrows(UnsupportedOperationException.class, () -> DROP_DOWN.getFieldValue(false, null));
|
124
|
+
assertThrows(UnsupportedOperationException.class, () -> DROP_DOWN.getFieldValue(0L, null));
|
125
|
+
assertThrows(UnsupportedOperationException.class, () -> DROP_DOWN.getFieldValue(0.0d, null));
|
126
|
+
assertThrows(UnsupportedOperationException.class, () -> DROP_DOWN.getFieldValue(EPOCH, null));
|
127
|
+
assertThrows(UnsupportedOperationException.class, () -> DROP_DOWN.getFieldValue(EMPTY, null));
|
128
|
+
assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue(false, null));
|
129
|
+
assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue(0L, null));
|
130
|
+
assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue(0.0d, null));
|
131
|
+
assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue("", null));
|
132
|
+
assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue(EPOCH, null));
|
133
|
+
assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue(EMPTY, null));
|
134
|
+
assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue(false, null));
|
135
|
+
assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue(0L, null));
|
136
|
+
assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue(0.0d, null));
|
137
|
+
assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue("", null));
|
138
|
+
assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue(EPOCH, null));
|
139
|
+
assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue(EMPTY, null));
|
140
|
+
assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue(false, null));
|
141
|
+
assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue(0L, null));
|
142
|
+
assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue(0.0d, null));
|
143
|
+
assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue("", null));
|
144
|
+
assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue(EPOCH, null));
|
145
|
+
assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue(EMPTY, null));
|
146
|
+
assertThrows(UnsupportedOperationException.class, () -> DATE.getFieldValue(false, null));
|
147
|
+
assertThrows(UnsupportedOperationException.class, () -> DATE.getFieldValue(EMPTY, null));
|
148
|
+
assertThrows(UnsupportedOperationException.class, () -> TIME.getFieldValue(false, null));
|
149
|
+
assertThrows(UnsupportedOperationException.class, () -> TIME.getFieldValue(EMPTY, null));
|
150
|
+
assertThrows(UnsupportedOperationException.class, () -> DATETIME.getFieldValue(false, null));
|
151
|
+
assertThrows(UnsupportedOperationException.class, () -> DATETIME.getFieldValue(EMPTY, null));
|
152
|
+
assertThrows(UnsupportedOperationException.class, () -> LINK.getFieldValue(false, null));
|
153
|
+
assertThrows(UnsupportedOperationException.class, () -> LINK.getFieldValue(0L, null));
|
154
|
+
assertThrows(UnsupportedOperationException.class, () -> LINK.getFieldValue(0.0d, null));
|
155
|
+
assertThrows(UnsupportedOperationException.class, () -> LINK.getFieldValue(EPOCH, null));
|
156
|
+
assertThrows(UnsupportedOperationException.class, () -> LINK.getFieldValue(EMPTY, null));
|
157
|
+
assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue(false, null));
|
158
|
+
assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue(0L, null));
|
159
|
+
assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue(0.0d, null));
|
160
|
+
assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue("", null));
|
161
|
+
assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue(EPOCH, null));
|
162
|
+
assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue(EMPTY, null));
|
163
|
+
assertThrows(UnsupportedOperationException.class, () -> SUBTABLE.getFieldValue(false, null));
|
164
|
+
assertThrows(UnsupportedOperationException.class, () -> SUBTABLE.getFieldValue(0L, null));
|
165
|
+
assertThrows(UnsupportedOperationException.class, () -> SUBTABLE.getFieldValue(0.0d, null));
|
166
|
+
assertThrows(UnsupportedOperationException.class, () -> SUBTABLE.getFieldValue(EPOCH, null));
|
167
|
+
// spotless:on
|
168
|
+
}
|
169
|
+
|
170
|
+
public static BigDecimal number(String value) {
|
171
|
+
return new BigDecimal(value);
|
172
|
+
}
|
173
|
+
|
174
|
+
@SafeVarargs
|
175
|
+
public static <T> List<T> list(T... a) {
|
176
|
+
return Arrays.asList(a);
|
177
|
+
}
|
178
|
+
|
179
|
+
public static List<TableRow> rows(Long... ids) {
|
180
|
+
return Arrays.stream(ids).map(DeserializerTest::tableRow).collect(Collectors.toList());
|
181
|
+
}
|
182
|
+
|
183
|
+
public static LocalDate date(CharSequence text) {
|
184
|
+
return LocalDate.parse(text);
|
185
|
+
}
|
186
|
+
|
187
|
+
public static LocalTime time(CharSequence text) {
|
188
|
+
return LocalTime.parse(text);
|
189
|
+
}
|
190
|
+
|
191
|
+
public static ZonedDateTime dateTime(CharSequence text) {
|
192
|
+
return ZonedDateTime.parse(text);
|
193
|
+
}
|
194
|
+
}
|