embulk-input-marketo_extended 0.6.18

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 (88) hide show
  1. checksums.yaml +7 -0
  2. data/.github/PULL_REQUEST_TEMPLATE.md +37 -0
  3. data/.gitignore +14 -0
  4. data/.travis.yml +6 -0
  5. data/CHANGELOG.md +170 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +213 -0
  8. data/build.gradle +103 -0
  9. data/config/checkstyle/checkstyle.xml +128 -0
  10. data/config/checkstyle/default.xml +108 -0
  11. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  12. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  13. data/gradlew +169 -0
  14. data/gradlew.bat +84 -0
  15. data/lib/embulk/input/marketo.rb +3 -0
  16. data/settings.gradle +1 -0
  17. data/src/main/java/org/embulk/input/marketo/CsvTokenizer.java +700 -0
  18. data/src/main/java/org/embulk/input/marketo/MarketoInputPlugin.java +15 -0
  19. data/src/main/java/org/embulk/input/marketo/MarketoInputPluginDelegate.java +100 -0
  20. data/src/main/java/org/embulk/input/marketo/MarketoService.java +38 -0
  21. data/src/main/java/org/embulk/input/marketo/MarketoServiceImpl.java +245 -0
  22. data/src/main/java/org/embulk/input/marketo/MarketoUtils.java +212 -0
  23. data/src/main/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPlugin.java +167 -0
  24. data/src/main/java/org/embulk/input/marketo/delegate/CampaignInputPlugin.java +48 -0
  25. data/src/main/java/org/embulk/input/marketo/delegate/CustomObjectInputPlugin.java +75 -0
  26. data/src/main/java/org/embulk/input/marketo/delegate/CustomObjectResponseMapperBuilder.java +81 -0
  27. data/src/main/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPlugin.java +66 -0
  28. data/src/main/java/org/embulk/input/marketo/delegate/LeadServiceResponseMapperBuilder.java +85 -0
  29. data/src/main/java/org/embulk/input/marketo/delegate/LeadWithListInputPlugin.java +64 -0
  30. data/src/main/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPlugin.java +60 -0
  31. data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPlugin.java +441 -0
  32. data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseInputPluginDelegate.java +92 -0
  33. data/src/main/java/org/embulk/input/marketo/delegate/ProgramInputPlugin.java +228 -0
  34. data/src/main/java/org/embulk/input/marketo/exception/MarketoAPIException.java +30 -0
  35. data/src/main/java/org/embulk/input/marketo/model/BulkExtractRangeHeader.java +26 -0
  36. data/src/main/java/org/embulk/input/marketo/model/MarketoAccessTokenResponse.java +92 -0
  37. data/src/main/java/org/embulk/input/marketo/model/MarketoBulkExtractRequest.java +68 -0
  38. data/src/main/java/org/embulk/input/marketo/model/MarketoError.java +40 -0
  39. data/src/main/java/org/embulk/input/marketo/model/MarketoField.java +126 -0
  40. data/src/main/java/org/embulk/input/marketo/model/MarketoResponse.java +82 -0
  41. data/src/main/java/org/embulk/input/marketo/model/filter/DateRangeFilter.java +40 -0
  42. data/src/main/java/org/embulk/input/marketo/rest/MarketoBaseRestClient.java +306 -0
  43. data/src/main/java/org/embulk/input/marketo/rest/MarketoInputStreamResponseEntityReader.java +69 -0
  44. data/src/main/java/org/embulk/input/marketo/rest/MarketoRESTEndpoint.java +47 -0
  45. data/src/main/java/org/embulk/input/marketo/rest/MarketoResponseJetty92EntityReader.java +89 -0
  46. data/src/main/java/org/embulk/input/marketo/rest/MarketoRestClient.java +569 -0
  47. data/src/main/java/org/embulk/input/marketo/rest/RecordPagingIterable.java +180 -0
  48. data/src/test/java/org/embulk/input/marketo/MarketoServiceImplTest.java +140 -0
  49. data/src/test/java/org/embulk/input/marketo/MarketoUtilsTest.java +87 -0
  50. data/src/test/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPluginTest.java +128 -0
  51. data/src/test/java/org/embulk/input/marketo/delegate/CampaignInputPluginTest.java +73 -0
  52. data/src/test/java/org/embulk/input/marketo/delegate/CustomObjectInputPluginTest.java +102 -0
  53. data/src/test/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPluginTest.java +99 -0
  54. data/src/test/java/org/embulk/input/marketo/delegate/LeadServiceResponseMapperBuilderTest.java +119 -0
  55. data/src/test/java/org/embulk/input/marketo/delegate/LeadWithListInputPluginTest.java +101 -0
  56. data/src/test/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPluginTest.java +103 -0
  57. data/src/test/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPluginTest.java +169 -0
  58. data/src/test/java/org/embulk/input/marketo/delegate/ProgramInputPluginTest.java +343 -0
  59. data/src/test/java/org/embulk/input/marketo/rest/MarketoBaseRestClientTest.java +368 -0
  60. data/src/test/java/org/embulk/input/marketo/rest/MarketoRestClientTest.java +584 -0
  61. data/src/test/resources/config/activity_bulk_extract_config.yaml +7 -0
  62. data/src/test/resources/config/custom_object_config.yaml +8 -0
  63. data/src/test/resources/config/lead_bulk_extract_config.yaml +8 -0
  64. data/src/test/resources/config/rest_config.yaml +3 -0
  65. data/src/test/resources/fixtures/activity_extract1.csv +35 -0
  66. data/src/test/resources/fixtures/activity_extract2.csv +22 -0
  67. data/src/test/resources/fixtures/activity_types.json +22 -0
  68. data/src/test/resources/fixtures/all_program_full.json +53 -0
  69. data/src/test/resources/fixtures/campaign_response.json +38 -0
  70. data/src/test/resources/fixtures/campaign_response_full.json +102 -0
  71. data/src/test/resources/fixtures/custom_object_describe.json +124 -0
  72. data/src/test/resources/fixtures/custom_object_describe_marketo_fields_full.json +22 -0
  73. data/src/test/resources/fixtures/custom_object_expected.json +66 -0
  74. data/src/test/resources/fixtures/custom_object_response.json +24 -0
  75. data/src/test/resources/fixtures/custom_object_response_full.json +23 -0
  76. data/src/test/resources/fixtures/lead_by_list.json +33 -0
  77. data/src/test/resources/fixtures/lead_by_program_response.json +47 -0
  78. data/src/test/resources/fixtures/lead_describe.json +221 -0
  79. data/src/test/resources/fixtures/lead_describe_expected.json +66 -0
  80. data/src/test/resources/fixtures/lead_describe_marketo_fields_full.json +518 -0
  81. data/src/test/resources/fixtures/lead_extract1.csv +11 -0
  82. data/src/test/resources/fixtures/lead_response_full.json +2402 -0
  83. data/src/test/resources/fixtures/lead_with_program_full.json +17 -0
  84. data/src/test/resources/fixtures/leads_extract2.csv +10 -0
  85. data/src/test/resources/fixtures/list_reponse_full.json +191 -0
  86. data/src/test/resources/fixtures/lists_response.json +31 -0
  87. data/src/test/resources/fixtures/program_response.json +71 -0
  88. metadata +171 -0
@@ -0,0 +1,73 @@
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.embulk.EmbulkTestRuntime;
7
+ import org.embulk.base.restclient.ServiceResponseMapper;
8
+ import org.embulk.base.restclient.record.RecordImporter;
9
+ import org.embulk.base.restclient.record.ValueLocator;
10
+ import org.embulk.config.ConfigLoader;
11
+ import org.embulk.config.ConfigSource;
12
+ import org.embulk.input.marketo.rest.MarketoRestClient;
13
+ import org.embulk.input.marketo.rest.RecordPagingIterable;
14
+ import org.embulk.spi.PageBuilder;
15
+ import org.embulk.spi.Schema;
16
+ import org.junit.Before;
17
+ import org.junit.Rule;
18
+ import org.junit.Test;
19
+ import org.mockito.ArgumentCaptor;
20
+ import org.mockito.Mockito;
21
+
22
+ import java.io.IOException;
23
+ import java.util.List;
24
+
25
+ import static org.junit.Assert.assertArrayEquals;
26
+
27
+ /**
28
+ * Created by tai.khuu on 10/10/17.
29
+ */
30
+ public class CampaignInputPluginTest
31
+ {
32
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
33
+
34
+ @Rule
35
+ public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
36
+
37
+ private ConfigSource configSource;
38
+
39
+ private CampaignInputPlugin campaignInputPlugin;
40
+
41
+ private MarketoRestClient mockMarketoRestClient;
42
+
43
+ @Before
44
+ public void setUp() throws Exception
45
+ {
46
+ campaignInputPlugin = Mockito.spy(new CampaignInputPlugin());
47
+ ConfigLoader configLoader = embulkTestRuntime.getInjector().getInstance(ConfigLoader.class);
48
+ configSource = configLoader.fromYaml(this.getClass().getResourceAsStream("/config/rest_config.yaml"));
49
+ mockMarketoRestClient = Mockito.mock(MarketoRestClient.class);
50
+ Mockito.doReturn(mockMarketoRestClient).when(campaignInputPlugin).createMarketoRestClient(Mockito.any(CampaignInputPlugin.PluginTask.class));
51
+ }
52
+
53
+ @Test
54
+ public void testRun() throws IOException
55
+ {
56
+ RecordPagingIterable<ObjectNode> mockRecordPagingIterable = Mockito.mock(RecordPagingIterable.class);
57
+ JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, ObjectNode.class);
58
+ List<ObjectNode> objectNodeList = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/campaign_response_full.json"), javaType);
59
+ Mockito.when(mockRecordPagingIterable.iterator()).thenReturn(objectNodeList.iterator());
60
+ Mockito.when(mockMarketoRestClient.getCampaign()).thenReturn(mockRecordPagingIterable);
61
+ CampaignInputPlugin.PluginTask task = configSource.loadConfig(CampaignInputPlugin.PluginTask.class);
62
+ ServiceResponseMapper<? extends ValueLocator> mapper = campaignInputPlugin.buildServiceResponseMapper(task);
63
+ RecordImporter recordImporter = mapper.createRecordImporter();
64
+ PageBuilder mockPageBuilder = Mockito.mock(PageBuilder.class);
65
+ campaignInputPlugin.ingestServiceData(task, recordImporter, 1, mockPageBuilder);
66
+ Mockito.verify(mockMarketoRestClient, Mockito.times(1)).getCampaign();
67
+ Schema embulkSchema = mapper.getEmbulkSchema();
68
+ ArgumentCaptor<Long> longArgumentCaptor = ArgumentCaptor.forClass(Long.class);
69
+ Mockito.verify(mockPageBuilder, Mockito.times(10)).setLong(Mockito.eq(embulkSchema.lookupColumn("id")), longArgumentCaptor.capture());
70
+ List<Long> allValues = longArgumentCaptor.getAllValues();
71
+ assertArrayEquals(new Long[]{1003L, 1004L, 1005L, 1006L, 1007L, 1008L, 1029L, 1048L, 1051L, 1065L}, allValues.toArray());
72
+ }
73
+ }
@@ -0,0 +1,102 @@
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 com.google.common.base.Optional;
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.ConfigException;
12
+ import org.embulk.config.ConfigLoader;
13
+ import org.embulk.config.ConfigSource;
14
+ import org.embulk.input.marketo.model.MarketoField;
15
+ import org.embulk.input.marketo.rest.MarketoRestClient;
16
+ import org.embulk.input.marketo.rest.RecordPagingIterable;
17
+ import org.embulk.spi.PageBuilder;
18
+ import org.embulk.spi.Schema;
19
+ import org.junit.Before;
20
+ import org.junit.Rule;
21
+ import org.junit.Test;
22
+ import org.mockito.ArgumentCaptor;
23
+ import org.mockito.Mockito;
24
+
25
+ import java.io.IOException;
26
+ import java.util.List;
27
+
28
+ import static org.junit.Assert.assertArrayEquals;
29
+
30
+ public class CustomObjectInputPluginTest
31
+ {
32
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
33
+
34
+ @Rule
35
+ public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
36
+
37
+ private CustomObjectInputPlugin customObjectInputPlugin;
38
+
39
+ private ConfigSource configSource;
40
+
41
+ private MarketoRestClient mockMarketoRestClient;
42
+
43
+ @Before
44
+ public void setUp() throws Exception
45
+ {
46
+ customObjectInputPlugin = Mockito.spy(new CustomObjectInputPlugin());
47
+ ConfigLoader configLoader = embulkTestRuntime.getInjector().getInstance(ConfigLoader.class);
48
+ configSource = configLoader.fromYaml(this.getClass().getResourceAsStream("/config/custom_object_config.yaml"));
49
+ mockMarketoRestClient = Mockito.mock(MarketoRestClient.class);
50
+ Mockito.doReturn(mockMarketoRestClient).when(customObjectInputPlugin).createMarketoRestClient(Mockito.any(CustomObjectInputPlugin.PluginTask.class));
51
+ }
52
+
53
+ @Test(expected = ConfigException.class)
54
+ public void validateCustomObjectFilterTypeError()
55
+ {
56
+ CustomObjectInputPlugin.PluginTask pluginTask = Mockito.mock(CustomObjectInputPlugin.PluginTask.class);
57
+ Mockito.when(pluginTask.getCustomObjectFilterType()).thenReturn("");
58
+ customObjectInputPlugin.validateInputTask(pluginTask);
59
+ }
60
+
61
+ @Test(expected = ConfigException.class)
62
+ public void validateCustomObjectAPINameError()
63
+ {
64
+ CustomObjectInputPlugin.PluginTask pluginTask = Mockito.mock(CustomObjectInputPlugin.PluginTask.class);
65
+ Mockito.when(pluginTask.getCustomObjectAPIName()).thenReturn("");
66
+ customObjectInputPlugin.validateInputTask(pluginTask);
67
+ }
68
+
69
+ @Test(expected = ConfigException.class)
70
+ public void validateFromValueGreaterThanToValueError()
71
+ {
72
+ CustomObjectInputPlugin.PluginTask pluginTask = Mockito.mock(CustomObjectInputPlugin.PluginTask.class);
73
+ Mockito.when(pluginTask.getFromValue()).thenReturn(100);
74
+ Mockito.when(pluginTask.getToValue()).thenReturn(Optional.of(90));
75
+ customObjectInputPlugin.validateInputTask(pluginTask);
76
+ }
77
+
78
+ @Test
79
+ public void testRun() throws IOException
80
+ {
81
+ RecordPagingIterable<ObjectNode> mockRecordPagingIterable = Mockito.mock(RecordPagingIterable.class);
82
+ JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, ObjectNode.class);
83
+ List<ObjectNode> objectNodeList = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/custom_object_response_full.json"), javaType);
84
+ JavaType marketoFieldsType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, MarketoField.class);
85
+ List<MarketoField> marketoFields = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/custom_object_describe_marketo_fields_full.json"), marketoFieldsType);
86
+ Mockito.when(mockRecordPagingIterable.iterator()).thenReturn(objectNodeList.iterator());
87
+ Mockito.when(mockMarketoRestClient.getCustomObject(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt())).thenReturn(mockRecordPagingIterable);
88
+ Mockito.when(mockMarketoRestClient.describeCustomObject(Mockito.anyString())).thenReturn(marketoFields);
89
+ CustomObjectInputPlugin.PluginTask task = configSource.loadConfig(CustomObjectInputPlugin.PluginTask.class);
90
+ ServiceResponseMapper<? extends ValueLocator> mapper = customObjectInputPlugin.buildServiceResponseMapper(task);
91
+ RecordImporter recordImporter = mapper.createRecordImporter();
92
+ PageBuilder mockPageBuilder = Mockito.mock(PageBuilder.class);
93
+ customObjectInputPlugin.ingestServiceData(task, recordImporter, 1, mockPageBuilder);
94
+ Mockito.verify(mockMarketoRestClient, Mockito.times(1)).getCustomObject(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt());
95
+ Mockito.verify(mockMarketoRestClient, Mockito.times(1)).describeCustomObject(Mockito.anyString());
96
+ Schema embulkSchema = mapper.getEmbulkSchema();
97
+ ArgumentCaptor<Long> longArgumentCaptor = ArgumentCaptor.forClass(Long.class);
98
+ Mockito.verify(mockPageBuilder, Mockito.times(3)).setLong(Mockito.eq(embulkSchema.lookupColumn("mk_id")), longArgumentCaptor.capture());
99
+ List<Long> allValues = longArgumentCaptor.getAllValues();
100
+ assertArrayEquals(new Long[]{1L, 2L, 3L}, allValues.toArray());
101
+ }
102
+ }
@@ -0,0 +1,99 @@
1
+ package org.embulk.input.marketo.delegate;
2
+
3
+ import com.fasterxml.jackson.databind.JavaType;
4
+ import com.fasterxml.jackson.databind.ObjectMapper;
5
+ import org.embulk.EmbulkTestRuntime;
6
+ import org.embulk.base.restclient.ServiceResponseMapper;
7
+ import org.embulk.base.restclient.record.ValueLocator;
8
+ import org.embulk.config.ConfigDiff;
9
+ import org.embulk.config.ConfigLoader;
10
+ import org.embulk.config.ConfigSource;
11
+ import org.embulk.config.TaskReport;
12
+ import org.embulk.input.marketo.MarketoUtils;
13
+ import org.embulk.input.marketo.model.BulkExtractRangeHeader;
14
+ import org.embulk.input.marketo.model.MarketoField;
15
+ import org.embulk.input.marketo.rest.MarketoRestClient;
16
+ import org.embulk.spi.Column;
17
+ import org.embulk.spi.PageBuilder;
18
+ import org.embulk.spi.Schema;
19
+ import org.joda.time.DateTime;
20
+ import org.junit.Assert;
21
+ import org.junit.Before;
22
+ import org.junit.Rule;
23
+ import org.junit.Test;
24
+ import org.mockito.ArgumentCaptor;
25
+ import org.mockito.Mockito;
26
+
27
+ import java.io.IOException;
28
+ import java.text.DateFormat;
29
+ import java.text.SimpleDateFormat;
30
+ import java.util.Arrays;
31
+ import java.util.Date;
32
+ import java.util.List;
33
+
34
+ import static org.mockito.ArgumentMatchers.any;
35
+ import static org.mockito.ArgumentMatchers.eq;
36
+
37
+ /**
38
+ * Created by khuutantaitai on 10/3/17.
39
+ */
40
+ public class LeadBulkExtractInputPluginTest
41
+ {
42
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
43
+
44
+ @Rule
45
+ public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
46
+
47
+ private LeadBulkExtractInputPlugin bulkExtractInputPlugin;
48
+
49
+ private ConfigSource configSource;
50
+
51
+ private MarketoRestClient mockMarketoRestclient;
52
+
53
+ @Before
54
+ public void prepare() throws IOException
55
+ {
56
+ bulkExtractInputPlugin = Mockito.spy(new LeadBulkExtractInputPlugin());
57
+ ConfigLoader configLoader = embulkTestRuntime.getInjector().getInstance(ConfigLoader.class);
58
+ configSource = configLoader.fromYaml(this.getClass().getResourceAsStream("/config/lead_bulk_extract_config.yaml"));
59
+ mockMarketoRestclient = Mockito.mock(MarketoRestClient.class);
60
+ Mockito.doReturn(mockMarketoRestclient).when(bulkExtractInputPlugin).createMarketoRestClient(any(LeadBulkExtractInputPlugin.PluginTask.class));
61
+ }
62
+
63
+ @Test
64
+ public void testRun() throws InterruptedException, IOException
65
+ {
66
+ LeadBulkExtractInputPlugin.PluginTask task = configSource.loadConfig(LeadBulkExtractInputPlugin.PluginTask.class);
67
+ DateTime startDate = new DateTime(task.getFromDate());
68
+ PageBuilder pageBuilder = Mockito.mock(PageBuilder.class);
69
+ String exportId1 = "exportId1";
70
+ String exportId2 = "exportId2";
71
+ JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, MarketoField.class);
72
+ List<MarketoField> marketoFields = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/lead_describe_marketo_fields_full.json"), javaType);
73
+ List<String> fieldNameFromMarketoFields = MarketoUtils.getFieldNameFromMarketoFields(marketoFields);
74
+ Mockito.when(mockMarketoRestclient.describeLead()).thenReturn(marketoFields);
75
+ Mockito.when(mockMarketoRestclient.createLeadBulkExtract(any(Date.class), any(Date.class), any(List.class), any(String.class))).thenReturn(exportId1).thenReturn(exportId2).thenReturn(null);
76
+ Mockito.when(mockMarketoRestclient.getLeadBulkExtractResult(eq(exportId1), any(BulkExtractRangeHeader.class))).thenReturn(this.getClass().getResourceAsStream("/fixtures/lead_extract1.csv"));
77
+ Mockito.when(mockMarketoRestclient.getLeadBulkExtractResult(eq(exportId2), any(BulkExtractRangeHeader.class))).thenReturn(this.getClass().getResourceAsStream("/fixtures/leads_extract2.csv"));
78
+ ServiceResponseMapper<? extends ValueLocator> mapper = bulkExtractInputPlugin.buildServiceResponseMapper(task);
79
+ bulkExtractInputPlugin.validateInputTask(task);
80
+ TaskReport taskReport = bulkExtractInputPlugin.ingestServiceData(task, mapper.createRecordImporter(), 1, pageBuilder);
81
+ ArgumentCaptor<Long> argumentCaptor = ArgumentCaptor.forClass(Long.class);
82
+ Column idColumn = mapper.getEmbulkSchema().lookupColumn("mk_id");
83
+ Mockito.verify(pageBuilder, Mockito.times(19)).setLong(eq(idColumn), argumentCaptor.capture());
84
+ Mockito.verify(mockMarketoRestclient, Mockito.times(1)).startLeadBulkExtract(eq(exportId1));
85
+ Mockito.verify(mockMarketoRestclient, Mockito.times(1)).waitLeadExportJobComplete(eq(exportId1), eq(task.getPollingIntervalSecond()), eq(task.getBulkJobTimeoutSecond()));
86
+ Mockito.verify(mockMarketoRestclient, Mockito.times(1)).startLeadBulkExtract(eq(exportId2));
87
+ Mockito.verify(mockMarketoRestclient, Mockito.times(1)).waitLeadExportJobComplete(eq(exportId2), eq(task.getPollingIntervalSecond()), eq(task.getBulkJobTimeoutSecond()));
88
+ String filterField = "createdAt";
89
+ Mockito.verify(mockMarketoRestclient, Mockito.times(1)).createLeadBulkExtract(startDate.toDate(), startDate.plusDays(30).toDate(), fieldNameFromMarketoFields, filterField);
90
+ DateTime startDate2 = startDate.plusDays(30).plusSeconds(1);
91
+ Mockito.verify(mockMarketoRestclient, Mockito.times(1)).createLeadBulkExtract(startDate2.toDate(), startDate.plusDays(task.getFetchDays()).toDate(), fieldNameFromMarketoFields, filterField);
92
+ List<Long> leadIds = argumentCaptor.getAllValues();
93
+ Assert.assertEquals(19, leadIds.size());
94
+ ConfigDiff configDiff = bulkExtractInputPlugin.buildConfigDiff(task, Mockito.mock(Schema.class), 1, Arrays.asList(taskReport));
95
+ DateFormat df = new SimpleDateFormat(MarketoUtils.MARKETO_DATE_SIMPLE_DATE_FORMAT);
96
+ Assert.assertEquals(df.format(startDate.plusDays(task.getFetchDays()).toDate()), configDiff.get(String.class, "from_date"));
97
+ Assert.assertArrayEquals(new Long[]{102488L, 102456L, 102445L, 102439L, 102471L, 102503L, 102424L, 102473L, 102505L, 102492L, 102495L, 102452L, 102435L, 102467L, 102420L, 102496L, 102448L, 102499L, 102431L}, leadIds.toArray());
98
+ }
99
+ }
@@ -0,0 +1,119 @@
1
+ package org.embulk.input.marketo.delegate;
2
+
3
+ import com.fasterxml.jackson.databind.JavaType;
4
+ import org.embulk.EmbulkTestRuntime;
5
+ import org.embulk.base.restclient.ServiceResponseMapper;
6
+ import org.embulk.base.restclient.record.ValueLocator;
7
+ import org.embulk.config.ConfigLoader;
8
+ import org.embulk.config.ConfigSource;
9
+ import org.embulk.input.marketo.MarketoService;
10
+ import org.embulk.input.marketo.MarketoUtils;
11
+ import org.embulk.input.marketo.model.MarketoField;
12
+ import org.embulk.spi.Schema;
13
+ import org.junit.Assert;
14
+ import org.junit.Before;
15
+ import org.junit.Rule;
16
+ import org.junit.Test;
17
+ import org.mockito.Mockito;
18
+
19
+ import java.io.IOException;
20
+ import java.util.ArrayList;
21
+ import java.util.List;
22
+
23
+ /**
24
+ * Created by tai.khuu on 5/24/18.
25
+ */
26
+ public class LeadServiceResponseMapperBuilderTest
27
+ {
28
+ private LeadServiceResponseMapperBuilder<LeadServiceResponseMapperBuilder.PluginTask> leadServiceResponseMapperBuilder;
29
+
30
+ @Rule
31
+ public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
32
+
33
+ private LeadServiceResponseMapperBuilder.PluginTask pluginTask;
34
+
35
+ private ConfigSource configSource;
36
+
37
+ private MarketoService marketoService;
38
+
39
+ @Before
40
+ public void setUp() throws Exception
41
+ {
42
+ ConfigLoader configLoader = embulkTestRuntime.getExec().getInjector().getInstance(ConfigLoader.class);
43
+ configSource = configLoader.fromYamlString("--- \n" +
44
+ "account_id: 389-FLQ-873\n" +
45
+ "client_id: 87bdd058-12ff-49b8-8d29-c0518669e59a\n" +
46
+ "client_secret: 2uauyk43zzwjlUZwboZVxQ3SMTHe8ILY\n" +
47
+ "included_fields: \n" +
48
+ " - company\n" +
49
+ " - site\n" +
50
+ " - billingstreet\n" +
51
+ " - billingcity\n" +
52
+ " - billingstate\n" +
53
+ " - billingcountry\n" +
54
+ " - billingpostalCode\n" +
55
+ " - website\n" +
56
+ " - mainphone\n" +
57
+ " - annualrevenue\n" +
58
+ " - numberofemployees\n" +
59
+ " - industry\n" +
60
+ " - siccode\n" +
61
+ " - mktoCompanyNotes\n" +
62
+ " - externalcompanyId\n" +
63
+ " - id\n" +
64
+ "target: all_lead_with_list_id\n");
65
+ pluginTask = configSource.loadConfig(LeadServiceResponseMapperBuilder.PluginTask.class);
66
+ marketoService = Mockito.mock(MarketoService.class);
67
+ JavaType marketoFieldsType = MarketoUtils.OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, MarketoField.class);
68
+ List<MarketoField> marketoFields = MarketoUtils.OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/lead_describe_marketo_fields_full.json"), marketoFieldsType);
69
+ Mockito.when(marketoService.describeLead()).thenReturn(marketoFields);
70
+ }
71
+
72
+ @Test
73
+ public void buildServiceResponseMapper() throws Exception
74
+ {
75
+ leadServiceResponseMapperBuilder = new LeadServiceResponseMapperBuilder<>(pluginTask, marketoService);
76
+ ServiceResponseMapper<? extends ValueLocator> serviceResponseMapper = leadServiceResponseMapperBuilder.buildServiceResponseMapper(pluginTask);
77
+ Assert.assertFalse(pluginTask.getExtractedFields().isEmpty());
78
+ Assert.assertEquals(16, pluginTask.getExtractedFields().size());
79
+ Schema embulkSchema = serviceResponseMapper.getEmbulkSchema();
80
+ Assert.assertEquals(16, embulkSchema.getColumns().size());
81
+ Assert.assertEquals("mk_billingStreet", embulkSchema.getColumns().get(2).getName());
82
+ Assert.assertEquals("mk_company", embulkSchema.getColumn(0).getName());
83
+ Assert.assertEquals("mk_billingStreet", embulkSchema.getColumn(2).getName());
84
+ Assert.assertEquals("mk_id", embulkSchema.getColumn(15).getName());
85
+ }
86
+
87
+ @Test
88
+ public void getLeadColumnsIncludedEmpty() throws IOException
89
+ {
90
+ configSource = configSource.set("included_fields", MarketoUtils.OBJECT_MAPPER.readTree("[]"));
91
+ pluginTask = configSource.loadConfig(LeadServiceResponseMapperBuilder.PluginTask.class);
92
+ leadServiceResponseMapperBuilder = new LeadServiceResponseMapperBuilder<>(pluginTask, marketoService);
93
+ List<MarketoField> leadColumns = leadServiceResponseMapperBuilder.getLeadColumns();
94
+ Assert.assertEquals(129, leadColumns.size());
95
+ }
96
+
97
+ @Test
98
+ public void getLeadColumnsIncluded1() throws IOException
99
+ {
100
+ configSource = configSource.set("included_fields", MarketoUtils.OBJECT_MAPPER.readTree("[\"company\",\"incorrect_value\"]"));
101
+ pluginTask = configSource.loadConfig(LeadServiceResponseMapperBuilder.PluginTask.class);
102
+ leadServiceResponseMapperBuilder = new LeadServiceResponseMapperBuilder<>(pluginTask, marketoService);
103
+ List<MarketoField> leadColumns = leadServiceResponseMapperBuilder.getLeadColumns();
104
+ Assert.assertEquals(1, leadColumns.size());
105
+ Assert.assertEquals("company", leadColumns.get(0).getName());
106
+ }
107
+
108
+ @Test
109
+ public void getLeadColumnsIncluded2() throws IOException
110
+ {
111
+ configSource = configSource.set("included_fields", MarketoUtils.OBJECT_MAPPER.readTree("[\"company\",\"incorrect_value\"]"));
112
+ pluginTask = configSource.loadConfig(LeadServiceResponseMapperBuilder.PluginTask.class);
113
+ marketoService = Mockito.mock(MarketoService.class);
114
+ leadServiceResponseMapperBuilder = new LeadServiceResponseMapperBuilder<>(pluginTask, marketoService);
115
+ Mockito.when(marketoService.describeLead()).thenReturn(new ArrayList<MarketoField>());
116
+ List<MarketoField> leadColumns = leadServiceResponseMapperBuilder.getLeadColumns();
117
+ Assert.assertTrue(leadColumns.isEmpty());
118
+ }
119
+ }
@@ -0,0 +1,101 @@
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.MarketoUtils;
14
+ import org.embulk.input.marketo.model.MarketoField;
15
+ import org.embulk.input.marketo.rest.MarketoRestClient;
16
+ import org.embulk.input.marketo.rest.RecordPagingIterable;
17
+ import org.embulk.spi.PageBuilder;
18
+ import org.embulk.spi.Schema;
19
+ import org.junit.Before;
20
+ import org.junit.Rule;
21
+ import org.junit.Test;
22
+ import org.mockito.ArgumentCaptor;
23
+ import org.mockito.Mockito;
24
+
25
+ import java.io.IOException;
26
+ import java.util.ArrayList;
27
+ import java.util.List;
28
+
29
+ import static org.junit.Assert.assertEquals;
30
+ import static org.mockito.ArgumentMatchers.any;
31
+ import static org.mockito.ArgumentMatchers.eq;
32
+
33
+ /**
34
+ * Created by tai.khuu on 10/10/17.
35
+ */
36
+ public class LeadWithListInputPluginTest
37
+ {
38
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
39
+
40
+ @Rule
41
+ public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
42
+
43
+ private ConfigSource configSource;
44
+
45
+ private LeadWithListInputPlugin leadWithListInputPlugin;
46
+
47
+ private MarketoRestClient mockMarketoRestClient;
48
+
49
+ @Before
50
+ public void setUp() throws Exception
51
+ {
52
+ leadWithListInputPlugin = Mockito.spy(new LeadWithListInputPlugin());
53
+ ConfigLoader configLoader = embulkTestRuntime.getInjector().getInstance(ConfigLoader.class);
54
+ configSource = configLoader.fromYaml(this.getClass().getResourceAsStream("/config/rest_config.yaml"));
55
+ mockMarketoRestClient = Mockito.mock(MarketoRestClient.class);
56
+ Mockito.doReturn(mockMarketoRestClient).when(leadWithListInputPlugin).createMarketoRestClient(any(LeadWithListInputPlugin.PluginTask.class));
57
+ }
58
+
59
+ @Test
60
+ public void testRun() throws IOException
61
+ {
62
+ RecordPagingIterable<ObjectNode> mockLeadRecordPagingIterable = Mockito.mock(RecordPagingIterable.class);
63
+ RecordPagingIterable<ObjectNode> mockLeadEmptyRecordPagingIterable = Mockito.mock(RecordPagingIterable.class);
64
+ RecordPagingIterable<ObjectNode> mocklistRecords = Mockito.mock(RecordPagingIterable.class);
65
+
66
+ Mockito.when(mockLeadEmptyRecordPagingIterable.iterator()).thenReturn(new ArrayList<ObjectNode>().iterator());
67
+ JavaType objectNodeListType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, ObjectNode.class);
68
+ JavaType marketoFieldsType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, MarketoField.class);
69
+ List<ObjectNode> leads = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/lead_response_full.json"), objectNodeListType);
70
+ List<ObjectNode> lists = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/list_reponse_full.json"), objectNodeListType);
71
+ Mockito.when(mocklistRecords.iterator()).thenReturn(lists.iterator());
72
+ List<MarketoField> marketoFields = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/lead_describe_marketo_fields_full.json"), marketoFieldsType);
73
+ Mockito.when(mockLeadRecordPagingIterable.iterator()).thenReturn(leads.iterator());
74
+ Mockito.when(mockMarketoRestClient.describeLead()).thenReturn(marketoFields);
75
+ Mockito.when(mockMarketoRestClient.getLists()).thenReturn(mocklistRecords);
76
+ List<String> fieldNameFromMarketoFields = MarketoUtils.getFieldNameFromMarketoFields(marketoFields);
77
+ String fieldNameString = StringUtils.join(fieldNameFromMarketoFields, ",");
78
+ Mockito.when(mockMarketoRestClient.getLeadsByList(Mockito.anyString(), eq(fieldNameString))).thenReturn(mockLeadEmptyRecordPagingIterable);
79
+ Mockito.when(mockMarketoRestClient.getLeadsByList("1009", fieldNameString)).thenReturn(mockLeadRecordPagingIterable);
80
+
81
+ LeadWithListInputPlugin.PluginTask task = configSource.loadConfig(LeadWithListInputPlugin.PluginTask.class);
82
+ ServiceResponseMapper<? extends ValueLocator> mapper = leadWithListInputPlugin.buildServiceResponseMapper(task);
83
+
84
+ RecordImporter recordImporter = mapper.createRecordImporter();
85
+ PageBuilder mockPageBuilder = Mockito.mock(PageBuilder.class);
86
+ leadWithListInputPlugin.ingestServiceData(task, recordImporter, 1, mockPageBuilder);
87
+ Mockito.verify(mockMarketoRestClient, Mockito.times(1)).getLists();
88
+ Mockito.verify(mockMarketoRestClient, Mockito.times(24)).getLeadsByList(Mockito.anyString(), eq(fieldNameString));
89
+ Mockito.verify(mockMarketoRestClient, Mockito.times(1)).describeLead();
90
+
91
+ Schema embulkSchema = mapper.getEmbulkSchema();
92
+ ArgumentCaptor<Long> longArgumentCaptor = ArgumentCaptor.forClass(Long.class);
93
+
94
+ Mockito.verify(mockPageBuilder, Mockito.times(300)).setLong(eq(embulkSchema.lookupColumn("mk_id")), longArgumentCaptor.capture());
95
+ Mockito.verify(mockPageBuilder, Mockito.times(300)).setString(eq(embulkSchema.lookupColumn("mk_listId")), eq("1009"));
96
+
97
+ List<Long> allValues = longArgumentCaptor.getAllValues();
98
+ long actualValue = allValues.get(0);
99
+ assertEquals(103280L, actualValue);
100
+ }
101
+ }