embulk-input-marketo-through-proxy 0.6.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +37 -0
  4. data/.github/workflows/build.yml +38 -0
  5. data/.gitignore +14 -0
  6. data/CHANGELOG.md +178 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +231 -0
  9. data/build.gradle +105 -0
  10. data/config/checkstyle/checkstyle.xml +128 -0
  11. data/config/checkstyle/default.xml +108 -0
  12. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  13. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  14. data/gradlew +169 -0
  15. data/gradlew.bat +84 -0
  16. data/lib/embulk/input/marketo.rb +3 -0
  17. data/settings.gradle +1 -0
  18. data/src/main/java/org/embulk/input/marketo/CsvTokenizer.java +695 -0
  19. data/src/main/java/org/embulk/input/marketo/MarketoInputPlugin.java +15 -0
  20. data/src/main/java/org/embulk/input/marketo/MarketoInputPluginDelegate.java +100 -0
  21. data/src/main/java/org/embulk/input/marketo/MarketoService.java +47 -0
  22. data/src/main/java/org/embulk/input/marketo/MarketoServiceImpl.java +258 -0
  23. data/src/main/java/org/embulk/input/marketo/MarketoUtils.java +212 -0
  24. data/src/main/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPlugin.java +169 -0
  25. data/src/main/java/org/embulk/input/marketo/delegate/CampaignInputPlugin.java +48 -0
  26. data/src/main/java/org/embulk/input/marketo/delegate/CustomObjectInputPlugin.java +124 -0
  27. data/src/main/java/org/embulk/input/marketo/delegate/CustomObjectResponseMapperBuilder.java +81 -0
  28. data/src/main/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPlugin.java +68 -0
  29. data/src/main/java/org/embulk/input/marketo/delegate/LeadServiceResponseMapperBuilder.java +85 -0
  30. data/src/main/java/org/embulk/input/marketo/delegate/LeadWithListInputPlugin.java +89 -0
  31. data/src/main/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPlugin.java +85 -0
  32. data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPlugin.java +448 -0
  33. data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseInputPluginDelegate.java +160 -0
  34. data/src/main/java/org/embulk/input/marketo/delegate/ProgramInputPlugin.java +234 -0
  35. data/src/main/java/org/embulk/input/marketo/exception/MarketoAPIException.java +30 -0
  36. data/src/main/java/org/embulk/input/marketo/model/BulkExtractRangeHeader.java +26 -0
  37. data/src/main/java/org/embulk/input/marketo/model/MarketoAccessTokenResponse.java +92 -0
  38. data/src/main/java/org/embulk/input/marketo/model/MarketoBulkExtractRequest.java +68 -0
  39. data/src/main/java/org/embulk/input/marketo/model/MarketoError.java +40 -0
  40. data/src/main/java/org/embulk/input/marketo/model/MarketoField.java +126 -0
  41. data/src/main/java/org/embulk/input/marketo/model/MarketoResponse.java +82 -0
  42. data/src/main/java/org/embulk/input/marketo/model/filter/DateRangeFilter.java +40 -0
  43. data/src/main/java/org/embulk/input/marketo/rest/MarketoBaseRestClient.java +344 -0
  44. data/src/main/java/org/embulk/input/marketo/rest/MarketoInputStreamResponseEntityReader.java +69 -0
  45. data/src/main/java/org/embulk/input/marketo/rest/MarketoRESTEndpoint.java +47 -0
  46. data/src/main/java/org/embulk/input/marketo/rest/MarketoResponseJetty92EntityReader.java +89 -0
  47. data/src/main/java/org/embulk/input/marketo/rest/MarketoRestClient.java +601 -0
  48. data/src/main/java/org/embulk/input/marketo/rest/RecordPagingIterable.java +180 -0
  49. data/src/test/java/org/embulk/input/marketo/MarketoServiceImplTest.java +147 -0
  50. data/src/test/java/org/embulk/input/marketo/MarketoUtilsTest.java +89 -0
  51. data/src/test/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPluginTest.java +129 -0
  52. data/src/test/java/org/embulk/input/marketo/delegate/CampaignInputPluginTest.java +73 -0
  53. data/src/test/java/org/embulk/input/marketo/delegate/CustomObjectInputPluginTest.java +175 -0
  54. data/src/test/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPluginTest.java +102 -0
  55. data/src/test/java/org/embulk/input/marketo/delegate/LeadServiceResponseMapperBuilderTest.java +119 -0
  56. data/src/test/java/org/embulk/input/marketo/delegate/LeadWithListInputPluginTest.java +132 -0
  57. data/src/test/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPluginTest.java +134 -0
  58. data/src/test/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPluginTest.java +171 -0
  59. data/src/test/java/org/embulk/input/marketo/delegate/MarketoBaseInputPluginDelegateTest.java +60 -0
  60. data/src/test/java/org/embulk/input/marketo/delegate/ProgramInputPluginTest.java +325 -0
  61. data/src/test/java/org/embulk/input/marketo/rest/MarketoBaseRestClientTest.java +368 -0
  62. data/src/test/java/org/embulk/input/marketo/rest/MarketoRestClientTest.java +649 -0
  63. data/src/test/resources/config/activity_bulk_extract_config.yaml +7 -0
  64. data/src/test/resources/config/custom_object_config.yaml +8 -0
  65. data/src/test/resources/config/lead_bulk_extract_config.yaml +8 -0
  66. data/src/test/resources/config/rest_config.yaml +3 -0
  67. data/src/test/resources/fixtures/activity_extract1.csv +35 -0
  68. data/src/test/resources/fixtures/activity_extract2.csv +22 -0
  69. data/src/test/resources/fixtures/activity_types.json +22 -0
  70. data/src/test/resources/fixtures/all_program_full.json +53 -0
  71. data/src/test/resources/fixtures/campaign_response.json +38 -0
  72. data/src/test/resources/fixtures/campaign_response_full.json +102 -0
  73. data/src/test/resources/fixtures/custom_object_describe.json +124 -0
  74. data/src/test/resources/fixtures/custom_object_describe_marketo_fields_full.json +22 -0
  75. data/src/test/resources/fixtures/custom_object_expected.json +66 -0
  76. data/src/test/resources/fixtures/custom_object_response.json +24 -0
  77. data/src/test/resources/fixtures/custom_object_response_full.json +23 -0
  78. data/src/test/resources/fixtures/lead_by_list.json +33 -0
  79. data/src/test/resources/fixtures/lead_by_program_response.json +47 -0
  80. data/src/test/resources/fixtures/lead_describe.json +221 -0
  81. data/src/test/resources/fixtures/lead_describe_expected.json +66 -0
  82. data/src/test/resources/fixtures/lead_describe_marketo_fields_full.json +518 -0
  83. data/src/test/resources/fixtures/lead_extract1.csv +11 -0
  84. data/src/test/resources/fixtures/lead_response_full.json +2402 -0
  85. data/src/test/resources/fixtures/lead_with_program_full.json +17 -0
  86. data/src/test/resources/fixtures/leads_extract2.csv +10 -0
  87. data/src/test/resources/fixtures/list_reponse_full.json +191 -0
  88. data/src/test/resources/fixtures/lists_response.json +31 -0
  89. data/src/test/resources/fixtures/program_response.json +71 -0
  90. metadata +173 -0
@@ -0,0 +1,132 @@
1
+ package org.embulk.input.marketo.delegate;
2
+
3
+ import com.fasterxml.jackson.databind.JavaType;
4
+ import com.fasterxml.jackson.databind.ObjectMapper;
5
+ import com.fasterxml.jackson.databind.node.ObjectNode;
6
+ import org.apache.commons.lang3.StringUtils;
7
+ import org.embulk.EmbulkTestRuntime;
8
+ import org.embulk.base.restclient.ServiceResponseMapper;
9
+ import org.embulk.base.restclient.record.RecordImporter;
10
+ import org.embulk.base.restclient.record.ValueLocator;
11
+ import org.embulk.config.ConfigLoader;
12
+ import org.embulk.config.ConfigSource;
13
+ import org.embulk.input.marketo.MarketoService;
14
+ import org.embulk.input.marketo.MarketoUtils;
15
+ import org.embulk.input.marketo.model.MarketoField;
16
+ import org.embulk.input.marketo.rest.MarketoRestClient;
17
+ import org.embulk.input.marketo.rest.RecordPagingIterable;
18
+ import org.embulk.spi.PageBuilder;
19
+ import org.embulk.spi.Schema;
20
+ import org.junit.Before;
21
+ import org.junit.Rule;
22
+ import org.junit.Test;
23
+ import org.mockito.ArgumentCaptor;
24
+ import org.mockito.Mockito;
25
+
26
+ import java.io.IOException;
27
+ import java.util.ArrayList;
28
+ import java.util.Arrays;
29
+ import java.util.List;
30
+
31
+ import static org.junit.Assert.assertEquals;
32
+ import static org.mockito.ArgumentMatchers.any;
33
+ import static org.mockito.ArgumentMatchers.anyList;
34
+ import static org.mockito.ArgumentMatchers.anySet;
35
+ import static org.mockito.ArgumentMatchers.eq;
36
+
37
+ /**
38
+ * Created by tai.khuu on 10/10/17.
39
+ */
40
+ public class LeadWithListInputPluginTest
41
+ {
42
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
43
+
44
+ @Rule
45
+ public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
46
+
47
+ private ConfigSource configSource;
48
+
49
+ private LeadWithListInputPlugin leadWithListInputPlugin;
50
+
51
+ private MarketoRestClient mockMarketoRestClient;
52
+
53
+ @Before
54
+ public void setUp() throws Exception
55
+ {
56
+ leadWithListInputPlugin = Mockito.spy(new LeadWithListInputPlugin());
57
+ ConfigLoader configLoader = embulkTestRuntime.getInjector().getInstance(ConfigLoader.class);
58
+ configSource = configLoader.fromYaml(this.getClass().getResourceAsStream("/config/rest_config.yaml"));
59
+ mockMarketoRestClient = Mockito.mock(MarketoRestClient.class);
60
+ Mockito.doReturn(mockMarketoRestClient).when(leadWithListInputPlugin).createMarketoRestClient(any(LeadWithListInputPlugin.PluginTask.class));
61
+ }
62
+
63
+ @Test
64
+ public void testRun() throws IOException
65
+ {
66
+ RecordPagingIterable<ObjectNode> mockLeadRecordPagingIterable = Mockito.mock(RecordPagingIterable.class);
67
+ RecordPagingIterable<ObjectNode> mockLeadEmptyRecordPagingIterable = Mockito.mock(RecordPagingIterable.class);
68
+ RecordPagingIterable<ObjectNode> mocklistRecords = Mockito.mock(RecordPagingIterable.class);
69
+
70
+ Mockito.when(mockLeadEmptyRecordPagingIterable.iterator()).thenReturn(new ArrayList<ObjectNode>().iterator());
71
+ JavaType objectNodeListType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, ObjectNode.class);
72
+ JavaType marketoFieldsType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, MarketoField.class);
73
+ List<ObjectNode> leads = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/lead_response_full.json"), objectNodeListType);
74
+ List<ObjectNode> lists = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/list_reponse_full.json"), objectNodeListType);
75
+ Mockito.when(mocklistRecords.iterator()).thenReturn(lists.iterator());
76
+ List<MarketoField> marketoFields = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/lead_describe_marketo_fields_full.json"), marketoFieldsType);
77
+ Mockito.when(mockLeadRecordPagingIterable.iterator()).thenReturn(leads.iterator());
78
+ Mockito.when(mockMarketoRestClient.describeLead()).thenReturn(marketoFields);
79
+ Mockito.when(mockMarketoRestClient.getLists()).thenReturn(mocklistRecords);
80
+ List<String> fieldNameFromMarketoFields = MarketoUtils.getFieldNameFromMarketoFields(marketoFields);
81
+ String fieldNameString = StringUtils.join(fieldNameFromMarketoFields, ",");
82
+ Mockito.when(mockMarketoRestClient.getLeadsByList(Mockito.anyString(), eq(fieldNameString))).thenReturn(mockLeadEmptyRecordPagingIterable);
83
+ Mockito.when(mockMarketoRestClient.getLeadsByList("1009", fieldNameString)).thenReturn(mockLeadRecordPagingIterable);
84
+
85
+ LeadWithListInputPlugin.PluginTask task = configSource.loadConfig(LeadWithListInputPlugin.PluginTask.class);
86
+ ServiceResponseMapper<? extends ValueLocator> mapper = leadWithListInputPlugin.buildServiceResponseMapper(task);
87
+
88
+ RecordImporter recordImporter = mapper.createRecordImporter();
89
+ PageBuilder mockPageBuilder = Mockito.mock(PageBuilder.class);
90
+ leadWithListInputPlugin.ingestServiceData(task, recordImporter, 1, mockPageBuilder);
91
+ Mockito.verify(mockMarketoRestClient, Mockito.times(1)).getLists();
92
+ Mockito.verify(mockMarketoRestClient, Mockito.times(24)).getLeadsByList(Mockito.anyString(), eq(fieldNameString));
93
+ Mockito.verify(mockMarketoRestClient, Mockito.times(1)).describeLead();
94
+
95
+ Schema embulkSchema = mapper.getEmbulkSchema();
96
+ ArgumentCaptor<Long> longArgumentCaptor = ArgumentCaptor.forClass(Long.class);
97
+
98
+ Mockito.verify(mockPageBuilder, Mockito.times(300)).setLong(eq(embulkSchema.lookupColumn("mk_id")), longArgumentCaptor.capture());
99
+ Mockito.verify(mockPageBuilder, Mockito.times(300)).setString(eq(embulkSchema.lookupColumn("mk_listId")), eq("1009"));
100
+
101
+ List<Long> allValues = longArgumentCaptor.getAllValues();
102
+ long actualValue = allValues.get(0);
103
+ assertEquals(103280L, actualValue);
104
+ }
105
+
106
+ @Test
107
+ public void testGetListsByIds()
108
+ {
109
+ ConfigSource cfgWithInputIds = configSource.set("list_ids", "123,12333").set("skip_invalid_list_id", true);
110
+ LeadWithListInputPlugin.PluginTask task = cfgWithInputIds.loadConfig(LeadWithListInputPlugin.PluginTask.class);
111
+ MarketoService service = Mockito.mock(MarketoService.class);
112
+ Mockito.doReturn(Arrays.asList(new ObjectMapper().createObjectNode().put("id", "123"))).when(service).getListsByIds(anySet());
113
+
114
+ leadWithListInputPlugin.getServiceRecords(service, task);
115
+
116
+ Mockito.verify(service, Mockito.times(1)).getListsByIds(anySet());
117
+ Mockito.verify(service, Mockito.never()).getLists();
118
+ Mockito.verify(service, Mockito.times(1)).getAllListLead(anyList(), anyList());
119
+ }
120
+
121
+ @Test
122
+ public void testGetAllLists()
123
+ {
124
+ LeadWithListInputPlugin.PluginTask task = configSource.loadConfig(LeadWithListInputPlugin.PluginTask.class);
125
+ MarketoService service = Mockito.mock(MarketoService.class);
126
+ leadWithListInputPlugin.getServiceRecords(service, task);
127
+
128
+ Mockito.verify(service, Mockito.never()).getListsByIds(anySet());
129
+ Mockito.verify(service, Mockito.times(1)).getLists();
130
+ Mockito.verify(service, Mockito.times(1)).getAllListLead(anyList(), anyList());
131
+ }
132
+ }
@@ -0,0 +1,134 @@
1
+ package org.embulk.input.marketo.delegate;
2
+
3
+ import com.fasterxml.jackson.databind.JavaType;
4
+ import com.fasterxml.jackson.databind.ObjectMapper;
5
+ import com.fasterxml.jackson.databind.node.ObjectNode;
6
+ import org.apache.commons.lang3.StringUtils;
7
+ import org.embulk.EmbulkTestRuntime;
8
+ import org.embulk.base.restclient.ServiceResponseMapper;
9
+ import org.embulk.base.restclient.record.RecordImporter;
10
+ import org.embulk.base.restclient.record.ValueLocator;
11
+ import org.embulk.config.ConfigLoader;
12
+ import org.embulk.config.ConfigSource;
13
+ import org.embulk.input.marketo.MarketoService;
14
+ import org.embulk.input.marketo.MarketoUtils;
15
+ import org.embulk.input.marketo.model.MarketoField;
16
+ import org.embulk.input.marketo.rest.MarketoRestClient;
17
+ import org.embulk.input.marketo.rest.RecordPagingIterable;
18
+ import org.embulk.spi.PageBuilder;
19
+ import org.embulk.spi.Schema;
20
+ import org.junit.Before;
21
+ import org.junit.Rule;
22
+ import org.junit.Test;
23
+ import org.mockito.ArgumentCaptor;
24
+ import org.mockito.Mockito;
25
+
26
+ import java.io.IOException;
27
+ import java.util.ArrayList;
28
+ import java.util.Arrays;
29
+ import java.util.List;
30
+
31
+ import static org.junit.Assert.assertEquals;
32
+ import static org.mockito.ArgumentMatchers.any;
33
+ import static org.mockito.ArgumentMatchers.anyList;
34
+ import static org.mockito.ArgumentMatchers.anySet;
35
+ import static org.mockito.ArgumentMatchers.anyString;
36
+ import static org.mockito.ArgumentMatchers.eq;
37
+
38
+ /**
39
+ * Created by tai.khuu on 10/10/17.
40
+ */
41
+ public class LeadWithProgramInputPluginTest
42
+ {
43
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
44
+
45
+ @Rule
46
+ public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
47
+
48
+ private ConfigSource configSource;
49
+
50
+ private LeadWithProgramInputPlugin leadWithProgramInputPlugin;
51
+
52
+ private MarketoRestClient mockMarketoRestClient;
53
+
54
+ @Before
55
+ public void setUp() throws Exception
56
+ {
57
+ leadWithProgramInputPlugin = Mockito.spy(new LeadWithProgramInputPlugin());
58
+ ConfigLoader configLoader = embulkTestRuntime.getInjector().getInstance(ConfigLoader.class);
59
+ configSource = configLoader.fromYaml(this.getClass().getResourceAsStream("/config/rest_config.yaml"));
60
+ mockMarketoRestClient = Mockito.mock(MarketoRestClient.class);
61
+ Mockito.doReturn(mockMarketoRestClient).when(leadWithProgramInputPlugin).createMarketoRestClient(any(LeadWithProgramInputPlugin.PluginTask.class));
62
+ }
63
+
64
+ @Test
65
+ public void testRun() throws IOException
66
+ {
67
+ RecordPagingIterable<ObjectNode> mockLeadRecordPagingIterable = Mockito.mock(RecordPagingIterable.class);
68
+ RecordPagingIterable<ObjectNode> mockLeadEmptyRecordPagingIterable = Mockito.mock(RecordPagingIterable.class);
69
+ RecordPagingIterable<ObjectNode> mockProgramRecords = Mockito.mock(RecordPagingIterable.class);
70
+
71
+ Mockito.when(mockLeadEmptyRecordPagingIterable.iterator()).thenReturn(new ArrayList<ObjectNode>().iterator());
72
+ JavaType objectNodeListType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, ObjectNode.class);
73
+ JavaType marketoFieldsType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, MarketoField.class);
74
+ List<ObjectNode> leads = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/lead_with_program_full.json"), objectNodeListType);
75
+ List<ObjectNode> programs = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/all_program_full.json"), objectNodeListType);
76
+ Mockito.when(mockProgramRecords.iterator()).thenReturn(programs.iterator());
77
+ List<MarketoField> marketoFields = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/lead_describe_marketo_fields_full.json"), marketoFieldsType);
78
+ Mockito.when(mockLeadRecordPagingIterable.iterator()).thenReturn(leads.iterator());
79
+ Mockito.when(mockMarketoRestClient.describeLead()).thenReturn(marketoFields);
80
+ Mockito.when(mockMarketoRestClient.getPrograms()).thenReturn(mockProgramRecords);
81
+ List<String> fieldNameFromMarketoFields = MarketoUtils.getFieldNameFromMarketoFields(marketoFields);
82
+ String fieldNameString = StringUtils.join(fieldNameFromMarketoFields, ",");
83
+ Mockito.when(mockMarketoRestClient.getLeadsByProgram(anyString(), eq(fieldNameString))).thenReturn(mockLeadEmptyRecordPagingIterable);
84
+ Mockito.when(mockMarketoRestClient.getLeadsByProgram("1003", fieldNameString)).thenReturn(mockLeadRecordPagingIterable);
85
+
86
+ LeadWithProgramInputPlugin.PluginTask task = configSource.loadConfig(LeadWithProgramInputPlugin.PluginTask.class);
87
+ ServiceResponseMapper<? extends ValueLocator> mapper = leadWithProgramInputPlugin.buildServiceResponseMapper(task);
88
+
89
+ RecordImporter recordImporter = mapper.createRecordImporter();
90
+ PageBuilder mockPageBuilder = Mockito.mock(PageBuilder.class);
91
+
92
+ leadWithProgramInputPlugin.ingestServiceData(task, recordImporter, 1, mockPageBuilder);
93
+ Mockito.verify(mockMarketoRestClient, Mockito.times(1)).getPrograms();
94
+ Mockito.verify(mockMarketoRestClient, Mockito.times(3)).getLeadsByProgram(anyString(), eq(fieldNameString));
95
+ Mockito.verify(mockMarketoRestClient, Mockito.times(1)).describeLead();
96
+
97
+ Schema embulkSchema = mapper.getEmbulkSchema();
98
+ ArgumentCaptor<Long> longArgumentCaptor = ArgumentCaptor.forClass(Long.class);
99
+
100
+ Mockito.verify(mockPageBuilder, Mockito.times(1)).setLong(eq(embulkSchema.lookupColumn("mk_id")), longArgumentCaptor.capture());
101
+ Mockito.verify(mockPageBuilder, Mockito.times(1)).setString(eq(embulkSchema.lookupColumn("mk_programId")), eq("1003"));
102
+
103
+ List<Long> allValues = longArgumentCaptor.getAllValues();
104
+ long actualValue = allValues.get(0);
105
+ assertEquals(102519L, actualValue);
106
+ }
107
+
108
+ @Test
109
+ public void testGetProgramsByIds()
110
+ {
111
+ ConfigSource cfgWithInputIds = configSource.set("program_ids", "123,12333").set("skip_invalid_program_id", true);
112
+ LeadWithProgramInputPlugin.PluginTask task = cfgWithInputIds.loadConfig(LeadWithProgramInputPlugin.PluginTask.class);
113
+ MarketoService service = Mockito.mock(MarketoService.class);
114
+ Mockito.doReturn(Arrays.asList(new ObjectMapper().createObjectNode().put("id", "123"))).when(service).getProgramsByIds(anySet());
115
+
116
+ leadWithProgramInputPlugin.getServiceRecords(service, task);
117
+
118
+ Mockito.verify(service, Mockito.times(1)).getProgramsByIds(anySet());
119
+ Mockito.verify(service, Mockito.never()).getPrograms();
120
+ Mockito.verify(service, Mockito.times(1)).getAllProgramLead(anyList(), anyList());
121
+ }
122
+
123
+ @Test
124
+ public void testGetAllLists()
125
+ {
126
+ LeadWithProgramInputPlugin.PluginTask task = configSource.loadConfig(LeadWithProgramInputPlugin.PluginTask.class);
127
+ MarketoService service = Mockito.mock(MarketoService.class);
128
+ leadWithProgramInputPlugin.getServiceRecords(service, task);
129
+
130
+ Mockito.verify(service, Mockito.never()).getProgramsByIds(anySet());
131
+ Mockito.verify(service, Mockito.times(1)).getPrograms();
132
+ Mockito.verify(service, Mockito.times(1)).getAllProgramLead(anyList(), anyList());
133
+ }
134
+ }
@@ -0,0 +1,171 @@
1
+ package org.embulk.input.marketo.delegate;
2
+
3
+ import com.google.common.base.Optional;
4
+ import org.embulk.EmbulkTestRuntime;
5
+ import org.embulk.config.ConfigDiff;
6
+ import org.embulk.config.ConfigException;
7
+ import org.embulk.config.ConfigLoader;
8
+ import org.embulk.config.ConfigSource;
9
+ import org.embulk.config.TaskReport;
10
+ import org.embulk.input.marketo.MarketoInputPluginDelegate;
11
+ import org.embulk.input.marketo.MarketoUtils;
12
+ import org.embulk.spi.Schema;
13
+ import org.junit.Before;
14
+ import org.junit.Rule;
15
+ import org.junit.Test;
16
+ import org.mockito.ArgumentCaptor;
17
+ import org.mockito.Mockito;
18
+
19
+ import java.io.IOException;
20
+ import java.text.DateFormat;
21
+ import java.text.SimpleDateFormat;
22
+ import java.time.Instant;
23
+ import java.time.OffsetDateTime;
24
+ import java.time.ZoneOffset;
25
+ import java.time.format.DateTimeFormatter;
26
+ import java.util.Arrays;
27
+ import java.util.Date;
28
+
29
+ import static org.junit.Assert.assertEquals;
30
+ import static org.junit.Assert.fail;
31
+ import static org.mockito.AdditionalAnswers.delegatesTo;
32
+ import static org.mockito.Mockito.mock;
33
+ import static org.mockito.Mockito.when;
34
+
35
+ /**
36
+ * Created by khuutantaitai on 10/3/17.
37
+ */
38
+ public class MarketoBaseBulkExtractInputPluginTest
39
+ {
40
+ @Rule
41
+ public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
42
+
43
+ private MarketoBaseBulkExtractInputPlugin<MarketoBaseBulkExtractInputPlugin.PluginTask> baseBulkExtractInputPlugin;
44
+ private MarketoBaseBulkExtractInputPlugin.PluginTask validBaseTask;
45
+
46
+ @Before
47
+ public void prepare() throws IOException
48
+ {
49
+ baseBulkExtractInputPlugin = Mockito.mock(MarketoBaseBulkExtractInputPlugin.class, Mockito.CALLS_REAL_METHODS);
50
+ ConfigLoader configLoader = embulkTestRuntime.getInjector().getInstance(ConfigLoader.class);
51
+ ConfigSource configSource = configLoader.fromYaml(
52
+ this.getClass().getResourceAsStream("/config/activity_bulk_extract_config.yaml"));
53
+ validBaseTask = configSource.loadConfig(MarketoBaseBulkExtractInputPlugin.PluginTask.class);
54
+ }
55
+
56
+ @Test(expected = ConfigException.class)
57
+ public void validateInputTaskError()
58
+ {
59
+ MarketoBaseBulkExtractInputPlugin.PluginTask pluginTask = Mockito.mock(MarketoBaseBulkExtractInputPlugin.PluginTask.class);
60
+ Mockito.when(pluginTask.getFromDate()).thenReturn(null);
61
+ baseBulkExtractInputPlugin.validateInputTask(pluginTask);
62
+ }
63
+
64
+ @Test(expected = ConfigException.class)
65
+ public void invalidInputTaskWhenIncrementalByUpdatedAt()
66
+ {
67
+ MarketoBaseBulkExtractInputPlugin.PluginTask task = mock(
68
+ MarketoBaseBulkExtractInputPlugin.PluginTask.class,
69
+ delegatesTo(validBaseTask));
70
+ when(task.getIncrementalColumn()).thenReturn(Optional.of("updatedAt"));
71
+ when(task.getIncremental()).thenReturn(true);
72
+ baseBulkExtractInputPlugin.validateInputTask(task);
73
+ }
74
+
75
+ @Test
76
+ public void validInputTaskWhenIncrementalOtherThanUpdatedAt()
77
+ {
78
+ MarketoBaseBulkExtractInputPlugin.PluginTask task = mock(
79
+ MarketoBaseBulkExtractInputPlugin.PluginTask.class,
80
+ delegatesTo(validBaseTask));
81
+ when(task.getIncremental()).thenReturn(true);
82
+ when(task.getIncrementalColumn()).thenReturn(Optional.of("anythingButUpdatedAt"));
83
+ baseBulkExtractInputPlugin.validateInputTask(task); // should not throw
84
+ }
85
+
86
+ @Test
87
+ public void validInputTaskWhenNonIncrementalWhileSetUpdatedAt()
88
+ {
89
+ MarketoBaseBulkExtractInputPlugin.PluginTask task = mock(
90
+ MarketoBaseBulkExtractInputPlugin.PluginTask.class,
91
+ delegatesTo(validBaseTask));
92
+ when(task.getIncremental()).thenReturn(false);
93
+ when(task.getIncrementalColumn()).thenReturn(Optional.of("updatedAt"));
94
+ baseBulkExtractInputPlugin.validateInputTask(task); // should not throw
95
+ }
96
+
97
+ @Test()
98
+ public void validateInputTaskToDateLessThanJobStartTime()
99
+ {
100
+ Date fromDate = new Date(1504224000000L);
101
+ OffsetDateTime jobStartTime = OffsetDateTime.ofInstant(Instant.ofEpochMilli(1506842144000L), ZoneOffset.UTC);
102
+ MarketoBaseBulkExtractInputPlugin.PluginTask pluginTask = Mockito.mock(MarketoBaseBulkExtractInputPlugin.PluginTask.class);
103
+ Mockito.when(pluginTask.getFromDate()).thenReturn(fromDate);
104
+ Mockito.when(pluginTask.getJobStartTime()).thenReturn(jobStartTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
105
+ Mockito.when(pluginTask.getFetchDays()).thenReturn(7);
106
+ baseBulkExtractInputPlugin.validateInputTask(pluginTask);
107
+ ArgumentCaptor<Optional<Date>> argumentCaptor = ArgumentCaptor.forClass(Optional.class);
108
+ Mockito.verify(pluginTask, Mockito.times(1)).setToDate(argumentCaptor.capture());
109
+ assertEquals(1504828800000L, argumentCaptor.getValue().get().getTime());
110
+ }
111
+
112
+ @Test()
113
+ public void validateInputTaskFromDateMoreThanJobStartTime()
114
+ {
115
+ Date fromDate = new Date(1507619744000L);
116
+ OffsetDateTime jobStartTime = OffsetDateTime.ofInstant(Instant.ofEpochMilli(1506842144000L), ZoneOffset.UTC);
117
+ MarketoBaseBulkExtractInputPlugin.PluginTask pluginTask = Mockito.mock(MarketoBaseBulkExtractInputPlugin.PluginTask.class);
118
+ Mockito.when(pluginTask.getFromDate()).thenReturn(fromDate);
119
+ Mockito.when(pluginTask.getJobStartTime()).thenReturn(jobStartTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
120
+
121
+ try {
122
+ baseBulkExtractInputPlugin.validateInputTask(pluginTask);
123
+ }
124
+ catch (ConfigException ex) {
125
+ return;
126
+ }
127
+ fail();
128
+ }
129
+
130
+ @Test()
131
+ public void validateInputTaskToDateMoreThanJobStartTime()
132
+ {
133
+ Date fromDate = new Date(1504224000000L);
134
+ OffsetDateTime jobStartTime = OffsetDateTime.ofInstant(Instant.ofEpochMilli(1504396800000L), ZoneOffset.UTC);
135
+ MarketoBaseBulkExtractInputPlugin.PluginTask pluginTask = Mockito.mock(MarketoBaseBulkExtractInputPlugin.PluginTask.class);
136
+ Mockito.when(pluginTask.getFromDate()).thenReturn(fromDate);
137
+ Mockito.when(pluginTask.getFetchDays()).thenReturn(7);
138
+ Mockito.when(pluginTask.getJobStartTime()).thenReturn(jobStartTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
139
+ baseBulkExtractInputPlugin.validateInputTask(pluginTask);
140
+ ArgumentCaptor<Optional<Date>> toDateArgumentCaptor = ArgumentCaptor.forClass(Optional.class);
141
+ Mockito.verify(pluginTask, Mockito.times(1)).setToDate(toDateArgumentCaptor.capture());
142
+ assertEquals(jobStartTime.toInstant().toEpochMilli(), toDateArgumentCaptor.getValue().get().getTime());
143
+ }
144
+
145
+ @Test
146
+ public void getToDate()
147
+ {
148
+ OffsetDateTime date = OffsetDateTime.ofInstant(Instant.ofEpochMilli(1505033728000L), ZoneOffset.UTC);
149
+ OffsetDateTime jobStartTime = OffsetDateTime.ofInstant(Instant.ofEpochMilli(1507625728000L), ZoneOffset.UTC);
150
+ MarketoBaseBulkExtractInputPlugin.PluginTask pluginTask = Mockito.mock(MarketoInputPluginDelegate.PluginTask.class);
151
+ Mockito.when(pluginTask.getFromDate()).thenReturn(Date.from(date.toInstant()));
152
+ Mockito.when(pluginTask.getFetchDays()).thenReturn(30);
153
+ Mockito.when(pluginTask.getJobStartTime()).thenReturn(jobStartTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
154
+ OffsetDateTime toDate = baseBulkExtractInputPlugin.getToDate(pluginTask);
155
+ assertEquals(toDate, jobStartTime);
156
+ }
157
+
158
+ @Test
159
+ public void buildConfigDiff()
160
+ {
161
+ TaskReport taskReport1 = Mockito.mock(TaskReport.class);
162
+ MarketoInputPluginDelegate.PluginTask task = Mockito.mock(MarketoInputPluginDelegate.PluginTask.class);
163
+ Mockito.when(task.getIncremental()).thenReturn(true);
164
+ Mockito.when(task.getIncrementalColumn()).thenReturn(Optional.of("createdAt"));
165
+ Date toDate = new Date(1507625728000L);
166
+ Mockito.when(task.getToDate()).thenReturn(Optional.of(toDate));
167
+ ConfigDiff configDiff = baseBulkExtractInputPlugin.buildConfigDiff(task, Mockito.mock(Schema.class), 1, Arrays.asList(taskReport1));
168
+ DateFormat df = new SimpleDateFormat(MarketoUtils.MARKETO_DATE_SIMPLE_DATE_FORMAT);
169
+ assertEquals(df.format(toDate), configDiff.get(String.class, "from_date"));
170
+ }
171
+ }
@@ -0,0 +1,60 @@
1
+ package org.embulk.input.marketo.delegate;
2
+
3
+ import com.fasterxml.jackson.databind.ObjectMapper;
4
+ import com.fasterxml.jackson.databind.node.ObjectNode;
5
+ import com.google.common.collect.Lists;
6
+ import org.apache.commons.lang3.StringUtils;
7
+ import org.embulk.EmbulkTestRuntime;
8
+ import org.embulk.config.ConfigException;
9
+ import org.embulk.input.marketo.MarketoService;
10
+ import org.junit.Rule;
11
+ import org.junit.Test;
12
+
13
+ import java.util.ArrayList;
14
+ import java.util.Collections;
15
+ import java.util.List;
16
+ import java.util.Set;
17
+ import java.util.function.Function;
18
+
19
+ import static org.embulk.input.marketo.delegate.MarketoBaseInputPluginDelegate.ID_LIST_SEPARATOR_CHAR;
20
+ import static org.junit.Assert.assertEquals;
21
+ import static org.junit.Assert.assertThrows;
22
+ import static org.mockito.Mockito.anySet;
23
+ import static org.mockito.Mockito.doReturn;
24
+ import static org.mockito.Mockito.mock;
25
+ import static org.mockito.Mockito.spy;
26
+
27
+ public class MarketoBaseInputPluginDelegateTest
28
+ {
29
+ @Rule
30
+ public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
31
+ private final ObjectMapper mapper = new ObjectMapper();
32
+ private MarketoService service = mock(MarketoService.class);
33
+ MarketoBaseInputPluginDelegate delegate = spy(MarketoBaseInputPluginDelegate.class);
34
+
35
+ @Test
36
+ public void testInputIds()
37
+ {
38
+ doReturn(getSampleResp(), Collections.emptyList(), Collections.emptyList()).when(service).getListsByIds(anySet());
39
+ Function<Set<String>, Iterable<ObjectNode>> getListIds = (ids) -> service.getListsByIds(ids);
40
+
41
+ final String[] ids = StringUtils.split("123,abc,,123.45,1002 ", ID_LIST_SEPARATOR_CHAR);
42
+ Iterable<ObjectNode> rs1 = delegate.getObjectsByIds(ids, getListIds);
43
+ assertEquals(Lists.newArrayList(rs1).size(), 1);
44
+
45
+ final String[] nullIds = StringUtils.split(" , , ,, ", ID_LIST_SEPARATOR_CHAR);
46
+ ConfigException exception = assertThrows(ConfigException.class, () -> delegate.getObjectsByIds(nullIds, getListIds));
47
+ assertEquals("No valid Id specified", exception.getMessage());
48
+
49
+ final String[] notExist = StringUtils.split(" 123 ,3453 , 234234,,", ID_LIST_SEPARATOR_CHAR);
50
+ exception = assertThrows(ConfigException.class, () -> delegate.getObjectsByIds(notExist, getListIds));
51
+ assertEquals("No valid Id found", exception.getMessage());
52
+ }
53
+
54
+ private Iterable<ObjectNode> getSampleResp()
55
+ {
56
+ List<ObjectNode> objects = new ArrayList<>();
57
+ objects.add(mapper.createObjectNode().put("id", 1002));
58
+ return objects;
59
+ }
60
+ }