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.
- checksums.yaml +7 -0
- data/.github/CODEOWNERS +1 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +37 -0
- data/.github/workflows/build.yml +38 -0
- data/.gitignore +14 -0
- data/CHANGELOG.md +178 -0
- data/LICENSE.txt +21 -0
- data/README.md +231 -0
- data/build.gradle +105 -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 +695 -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 +47 -0
- data/src/main/java/org/embulk/input/marketo/MarketoServiceImpl.java +258 -0
- data/src/main/java/org/embulk/input/marketo/MarketoUtils.java +212 -0
- data/src/main/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPlugin.java +169 -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 +124 -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 +68 -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 +89 -0
- data/src/main/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPlugin.java +85 -0
- data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPlugin.java +448 -0
- data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseInputPluginDelegate.java +160 -0
- data/src/main/java/org/embulk/input/marketo/delegate/ProgramInputPlugin.java +234 -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 +344 -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 +601 -0
- data/src/main/java/org/embulk/input/marketo/rest/RecordPagingIterable.java +180 -0
- data/src/test/java/org/embulk/input/marketo/MarketoServiceImplTest.java +147 -0
- data/src/test/java/org/embulk/input/marketo/MarketoUtilsTest.java +89 -0
- data/src/test/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPluginTest.java +129 -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 +175 -0
- data/src/test/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPluginTest.java +102 -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 +132 -0
- data/src/test/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPluginTest.java +134 -0
- data/src/test/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPluginTest.java +171 -0
- data/src/test/java/org/embulk/input/marketo/delegate/MarketoBaseInputPluginDelegateTest.java +60 -0
- data/src/test/java/org/embulk/input/marketo/delegate/ProgramInputPluginTest.java +325 -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 +649 -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 +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
|
+
}
|
data/src/test/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPluginTest.java
ADDED
@@ -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
|
+
}
|