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.
- checksums.yaml +7 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +37 -0
- data/.gitignore +14 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +170 -0
- data/LICENSE.txt +21 -0
- data/README.md +213 -0
- data/build.gradle +103 -0
- data/config/checkstyle/checkstyle.xml +128 -0
- data/config/checkstyle/default.xml +108 -0
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/gradlew +169 -0
- data/gradlew.bat +84 -0
- data/lib/embulk/input/marketo.rb +3 -0
- data/settings.gradle +1 -0
- data/src/main/java/org/embulk/input/marketo/CsvTokenizer.java +700 -0
- data/src/main/java/org/embulk/input/marketo/MarketoInputPlugin.java +15 -0
- data/src/main/java/org/embulk/input/marketo/MarketoInputPluginDelegate.java +100 -0
- data/src/main/java/org/embulk/input/marketo/MarketoService.java +38 -0
- data/src/main/java/org/embulk/input/marketo/MarketoServiceImpl.java +245 -0
- data/src/main/java/org/embulk/input/marketo/MarketoUtils.java +212 -0
- data/src/main/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPlugin.java +167 -0
- data/src/main/java/org/embulk/input/marketo/delegate/CampaignInputPlugin.java +48 -0
- data/src/main/java/org/embulk/input/marketo/delegate/CustomObjectInputPlugin.java +75 -0
- data/src/main/java/org/embulk/input/marketo/delegate/CustomObjectResponseMapperBuilder.java +81 -0
- data/src/main/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPlugin.java +66 -0
- data/src/main/java/org/embulk/input/marketo/delegate/LeadServiceResponseMapperBuilder.java +85 -0
- data/src/main/java/org/embulk/input/marketo/delegate/LeadWithListInputPlugin.java +64 -0
- data/src/main/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPlugin.java +60 -0
- data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPlugin.java +441 -0
- data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseInputPluginDelegate.java +92 -0
- data/src/main/java/org/embulk/input/marketo/delegate/ProgramInputPlugin.java +228 -0
- data/src/main/java/org/embulk/input/marketo/exception/MarketoAPIException.java +30 -0
- data/src/main/java/org/embulk/input/marketo/model/BulkExtractRangeHeader.java +26 -0
- data/src/main/java/org/embulk/input/marketo/model/MarketoAccessTokenResponse.java +92 -0
- data/src/main/java/org/embulk/input/marketo/model/MarketoBulkExtractRequest.java +68 -0
- data/src/main/java/org/embulk/input/marketo/model/MarketoError.java +40 -0
- data/src/main/java/org/embulk/input/marketo/model/MarketoField.java +126 -0
- data/src/main/java/org/embulk/input/marketo/model/MarketoResponse.java +82 -0
- data/src/main/java/org/embulk/input/marketo/model/filter/DateRangeFilter.java +40 -0
- data/src/main/java/org/embulk/input/marketo/rest/MarketoBaseRestClient.java +306 -0
- data/src/main/java/org/embulk/input/marketo/rest/MarketoInputStreamResponseEntityReader.java +69 -0
- data/src/main/java/org/embulk/input/marketo/rest/MarketoRESTEndpoint.java +47 -0
- data/src/main/java/org/embulk/input/marketo/rest/MarketoResponseJetty92EntityReader.java +89 -0
- data/src/main/java/org/embulk/input/marketo/rest/MarketoRestClient.java +569 -0
- data/src/main/java/org/embulk/input/marketo/rest/RecordPagingIterable.java +180 -0
- data/src/test/java/org/embulk/input/marketo/MarketoServiceImplTest.java +140 -0
- data/src/test/java/org/embulk/input/marketo/MarketoUtilsTest.java +87 -0
- data/src/test/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPluginTest.java +128 -0
- data/src/test/java/org/embulk/input/marketo/delegate/CampaignInputPluginTest.java +73 -0
- data/src/test/java/org/embulk/input/marketo/delegate/CustomObjectInputPluginTest.java +102 -0
- data/src/test/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPluginTest.java +99 -0
- data/src/test/java/org/embulk/input/marketo/delegate/LeadServiceResponseMapperBuilderTest.java +119 -0
- data/src/test/java/org/embulk/input/marketo/delegate/LeadWithListInputPluginTest.java +101 -0
- data/src/test/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPluginTest.java +103 -0
- data/src/test/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPluginTest.java +169 -0
- data/src/test/java/org/embulk/input/marketo/delegate/ProgramInputPluginTest.java +343 -0
- data/src/test/java/org/embulk/input/marketo/rest/MarketoBaseRestClientTest.java +368 -0
- data/src/test/java/org/embulk/input/marketo/rest/MarketoRestClientTest.java +584 -0
- data/src/test/resources/config/activity_bulk_extract_config.yaml +7 -0
- data/src/test/resources/config/custom_object_config.yaml +8 -0
- data/src/test/resources/config/lead_bulk_extract_config.yaml +8 -0
- data/src/test/resources/config/rest_config.yaml +3 -0
- data/src/test/resources/fixtures/activity_extract1.csv +35 -0
- data/src/test/resources/fixtures/activity_extract2.csv +22 -0
- data/src/test/resources/fixtures/activity_types.json +22 -0
- data/src/test/resources/fixtures/all_program_full.json +53 -0
- data/src/test/resources/fixtures/campaign_response.json +38 -0
- data/src/test/resources/fixtures/campaign_response_full.json +102 -0
- data/src/test/resources/fixtures/custom_object_describe.json +124 -0
- data/src/test/resources/fixtures/custom_object_describe_marketo_fields_full.json +22 -0
- data/src/test/resources/fixtures/custom_object_expected.json +66 -0
- data/src/test/resources/fixtures/custom_object_response.json +24 -0
- data/src/test/resources/fixtures/custom_object_response_full.json +23 -0
- data/src/test/resources/fixtures/lead_by_list.json +33 -0
- data/src/test/resources/fixtures/lead_by_program_response.json +47 -0
- data/src/test/resources/fixtures/lead_describe.json +221 -0
- data/src/test/resources/fixtures/lead_describe_expected.json +66 -0
- data/src/test/resources/fixtures/lead_describe_marketo_fields_full.json +518 -0
- data/src/test/resources/fixtures/lead_extract1.csv +11 -0
- data/src/test/resources/fixtures/lead_response_full.json +2402 -0
- data/src/test/resources/fixtures/lead_with_program_full.json +17 -0
- data/src/test/resources/fixtures/leads_extract2.csv +10 -0
- data/src/test/resources/fixtures/list_reponse_full.json +191 -0
- data/src/test/resources/fixtures/lists_response.json +31 -0
- data/src/test/resources/fixtures/program_response.json +71 -0
- 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
|
+
}
|
data/src/test/java/org/embulk/input/marketo/delegate/LeadServiceResponseMapperBuilderTest.java
ADDED
@@ -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
|
+
}
|