embulk-input-marketo-through-proxy 0.6.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +37 -0
  4. data/.github/workflows/build.yml +38 -0
  5. data/.gitignore +14 -0
  6. data/CHANGELOG.md +178 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +231 -0
  9. data/build.gradle +105 -0
  10. data/config/checkstyle/checkstyle.xml +128 -0
  11. data/config/checkstyle/default.xml +108 -0
  12. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  13. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  14. data/gradlew +169 -0
  15. data/gradlew.bat +84 -0
  16. data/lib/embulk/input/marketo.rb +3 -0
  17. data/settings.gradle +1 -0
  18. data/src/main/java/org/embulk/input/marketo/CsvTokenizer.java +695 -0
  19. data/src/main/java/org/embulk/input/marketo/MarketoInputPlugin.java +15 -0
  20. data/src/main/java/org/embulk/input/marketo/MarketoInputPluginDelegate.java +100 -0
  21. data/src/main/java/org/embulk/input/marketo/MarketoService.java +47 -0
  22. data/src/main/java/org/embulk/input/marketo/MarketoServiceImpl.java +258 -0
  23. data/src/main/java/org/embulk/input/marketo/MarketoUtils.java +212 -0
  24. data/src/main/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPlugin.java +169 -0
  25. data/src/main/java/org/embulk/input/marketo/delegate/CampaignInputPlugin.java +48 -0
  26. data/src/main/java/org/embulk/input/marketo/delegate/CustomObjectInputPlugin.java +124 -0
  27. data/src/main/java/org/embulk/input/marketo/delegate/CustomObjectResponseMapperBuilder.java +81 -0
  28. data/src/main/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPlugin.java +68 -0
  29. data/src/main/java/org/embulk/input/marketo/delegate/LeadServiceResponseMapperBuilder.java +85 -0
  30. data/src/main/java/org/embulk/input/marketo/delegate/LeadWithListInputPlugin.java +89 -0
  31. data/src/main/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPlugin.java +85 -0
  32. data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPlugin.java +448 -0
  33. data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseInputPluginDelegate.java +160 -0
  34. data/src/main/java/org/embulk/input/marketo/delegate/ProgramInputPlugin.java +234 -0
  35. data/src/main/java/org/embulk/input/marketo/exception/MarketoAPIException.java +30 -0
  36. data/src/main/java/org/embulk/input/marketo/model/BulkExtractRangeHeader.java +26 -0
  37. data/src/main/java/org/embulk/input/marketo/model/MarketoAccessTokenResponse.java +92 -0
  38. data/src/main/java/org/embulk/input/marketo/model/MarketoBulkExtractRequest.java +68 -0
  39. data/src/main/java/org/embulk/input/marketo/model/MarketoError.java +40 -0
  40. data/src/main/java/org/embulk/input/marketo/model/MarketoField.java +126 -0
  41. data/src/main/java/org/embulk/input/marketo/model/MarketoResponse.java +82 -0
  42. data/src/main/java/org/embulk/input/marketo/model/filter/DateRangeFilter.java +40 -0
  43. data/src/main/java/org/embulk/input/marketo/rest/MarketoBaseRestClient.java +344 -0
  44. data/src/main/java/org/embulk/input/marketo/rest/MarketoInputStreamResponseEntityReader.java +69 -0
  45. data/src/main/java/org/embulk/input/marketo/rest/MarketoRESTEndpoint.java +47 -0
  46. data/src/main/java/org/embulk/input/marketo/rest/MarketoResponseJetty92EntityReader.java +89 -0
  47. data/src/main/java/org/embulk/input/marketo/rest/MarketoRestClient.java +601 -0
  48. data/src/main/java/org/embulk/input/marketo/rest/RecordPagingIterable.java +180 -0
  49. data/src/test/java/org/embulk/input/marketo/MarketoServiceImplTest.java +147 -0
  50. data/src/test/java/org/embulk/input/marketo/MarketoUtilsTest.java +89 -0
  51. data/src/test/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPluginTest.java +129 -0
  52. data/src/test/java/org/embulk/input/marketo/delegate/CampaignInputPluginTest.java +73 -0
  53. data/src/test/java/org/embulk/input/marketo/delegate/CustomObjectInputPluginTest.java +175 -0
  54. data/src/test/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPluginTest.java +102 -0
  55. data/src/test/java/org/embulk/input/marketo/delegate/LeadServiceResponseMapperBuilderTest.java +119 -0
  56. data/src/test/java/org/embulk/input/marketo/delegate/LeadWithListInputPluginTest.java +132 -0
  57. data/src/test/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPluginTest.java +134 -0
  58. data/src/test/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPluginTest.java +171 -0
  59. data/src/test/java/org/embulk/input/marketo/delegate/MarketoBaseInputPluginDelegateTest.java +60 -0
  60. data/src/test/java/org/embulk/input/marketo/delegate/ProgramInputPluginTest.java +325 -0
  61. data/src/test/java/org/embulk/input/marketo/rest/MarketoBaseRestClientTest.java +368 -0
  62. data/src/test/java/org/embulk/input/marketo/rest/MarketoRestClientTest.java +649 -0
  63. data/src/test/resources/config/activity_bulk_extract_config.yaml +7 -0
  64. data/src/test/resources/config/custom_object_config.yaml +8 -0
  65. data/src/test/resources/config/lead_bulk_extract_config.yaml +8 -0
  66. data/src/test/resources/config/rest_config.yaml +3 -0
  67. data/src/test/resources/fixtures/activity_extract1.csv +35 -0
  68. data/src/test/resources/fixtures/activity_extract2.csv +22 -0
  69. data/src/test/resources/fixtures/activity_types.json +22 -0
  70. data/src/test/resources/fixtures/all_program_full.json +53 -0
  71. data/src/test/resources/fixtures/campaign_response.json +38 -0
  72. data/src/test/resources/fixtures/campaign_response_full.json +102 -0
  73. data/src/test/resources/fixtures/custom_object_describe.json +124 -0
  74. data/src/test/resources/fixtures/custom_object_describe_marketo_fields_full.json +22 -0
  75. data/src/test/resources/fixtures/custom_object_expected.json +66 -0
  76. data/src/test/resources/fixtures/custom_object_response.json +24 -0
  77. data/src/test/resources/fixtures/custom_object_response_full.json +23 -0
  78. data/src/test/resources/fixtures/lead_by_list.json +33 -0
  79. data/src/test/resources/fixtures/lead_by_program_response.json +47 -0
  80. data/src/test/resources/fixtures/lead_describe.json +221 -0
  81. data/src/test/resources/fixtures/lead_describe_expected.json +66 -0
  82. data/src/test/resources/fixtures/lead_describe_marketo_fields_full.json +518 -0
  83. data/src/test/resources/fixtures/lead_extract1.csv +11 -0
  84. data/src/test/resources/fixtures/lead_response_full.json +2402 -0
  85. data/src/test/resources/fixtures/lead_with_program_full.json +17 -0
  86. data/src/test/resources/fixtures/leads_extract2.csv +10 -0
  87. data/src/test/resources/fixtures/list_reponse_full.json +191 -0
  88. data/src/test/resources/fixtures/lists_response.json +31 -0
  89. data/src/test/resources/fixtures/program_response.json +71 -0
  90. metadata +173 -0
@@ -0,0 +1,649 @@
1
+ package org.embulk.input.marketo.rest;
2
+
3
+ import com.fasterxml.jackson.databind.DeserializationFeature;
4
+ import com.fasterxml.jackson.databind.JavaType;
5
+ import com.fasterxml.jackson.databind.ObjectMapper;
6
+ import com.fasterxml.jackson.databind.node.ArrayNode;
7
+ import com.fasterxml.jackson.databind.node.ObjectNode;
8
+ import com.fasterxml.jackson.databind.node.TextNode;
9
+ import com.google.common.collect.ImmutableListMultimap;
10
+ import com.google.common.collect.Multimap;
11
+ import com.google.common.io.ByteStreams;
12
+ import org.eclipse.jetty.client.api.ContentProvider;
13
+ import org.eclipse.jetty.client.util.FormContentProvider;
14
+ import org.embulk.EmbulkTestRuntime;
15
+ import org.embulk.config.ConfigSource;
16
+ import org.embulk.input.marketo.MarketoUtils;
17
+ import org.embulk.input.marketo.model.MarketoError;
18
+ import org.embulk.input.marketo.model.MarketoField;
19
+ import org.embulk.input.marketo.model.MarketoResponse;
20
+ import org.embulk.spi.DataException;
21
+ import org.embulk.util.retryhelper.jetty92.Jetty92ResponseReader;
22
+ import org.embulk.util.retryhelper.jetty92.Jetty92RetryHelper;
23
+ import org.junit.Assert;
24
+ import org.junit.Before;
25
+ import org.junit.Rule;
26
+ import org.junit.Test;
27
+ import org.mockito.ArgumentCaptor;
28
+ import org.mockito.ArgumentMatchers;
29
+ import org.mockito.Mockito;
30
+
31
+ import java.io.IOException;
32
+ import java.io.InputStream;
33
+ import java.nio.ByteBuffer;
34
+ import java.text.SimpleDateFormat;
35
+ import java.time.OffsetDateTime;
36
+ import java.time.format.DateTimeFormatter;
37
+ import java.util.ArrayList;
38
+ import java.util.Arrays;
39
+ import java.util.Date;
40
+ import java.util.HashMap;
41
+ import java.util.HashSet;
42
+ import java.util.Iterator;
43
+ import java.util.List;
44
+ import java.util.Map;
45
+ import java.util.Set;
46
+
47
+ /**
48
+ * Created by khuutantaitai on 10/3/17.
49
+ */
50
+ public class MarketoRestClientTest
51
+ {
52
+ private static final String TEST_ACCOUNT_ID = "test_account_id";
53
+
54
+ private static final String TEST_CLIENT_SECRET = "test_client_secret";
55
+
56
+ private static final String TEST_CLIENT_ID = "test_client_id";
57
+
58
+ private static final String END_POINT = MarketoUtils.getEndPoint(TEST_ACCOUNT_ID);
59
+
60
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
61
+
62
+ @Rule
63
+ public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
64
+
65
+ private MarketoRestClient marketoRestClient;
66
+
67
+ private Jetty92RetryHelper mockRetryHelper;
68
+
69
+ private static final JavaType RESPONSE_TYPE = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(MarketoResponse.class, MarketoResponse.class, ObjectNode.class);
70
+
71
+ @Before
72
+ public void prepare()
73
+ {
74
+ ConfigSource configSource = embulkTestRuntime.getExec().newConfigSource();
75
+ configSource.set("account_id", TEST_ACCOUNT_ID);
76
+ configSource.set("client_secret", TEST_CLIENT_SECRET);
77
+ configSource.set("client_id", TEST_CLIENT_ID);
78
+ configSource.set("max_return", 2);
79
+ MarketoRestClient.PluginTask task = configSource.loadConfig(MarketoRestClient.PluginTask.class);
80
+ mockRetryHelper = Mockito.mock(Jetty92RetryHelper.class);
81
+ MarketoRestClient realRestClient = new MarketoRestClient(task);
82
+ marketoRestClient = Mockito.spy(realRestClient);
83
+ }
84
+
85
+ @Test
86
+ public void describeLead() throws Exception
87
+ {
88
+ String leadSchema = new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/lead_describe.json")));
89
+ MarketoResponse<ObjectNode> marketoResponse = OBJECT_MAPPER.readValue(leadSchema, RESPONSE_TYPE);
90
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.DESCRIBE_LEAD.getEndpoint()), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
91
+ List<MarketoField> marketoFields = marketoRestClient.describeLead();
92
+ Assert.assertEquals(16, marketoFields.size());
93
+ JavaType marketoFieldType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, MarketoField.class);
94
+ List<MarketoField> expectedFields = OBJECT_MAPPER.readValue(new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/lead_describe_expected.json"))), marketoFieldType);
95
+ Assert.assertArrayEquals(expectedFields.toArray(), marketoFields.toArray());
96
+ }
97
+
98
+ @Test
99
+ public void createLeadBulkExtract() throws Exception
100
+ {
101
+ MarketoResponse<ObjectNode> marketoResponse = new MarketoResponse<>();
102
+ marketoResponse.setSuccess(true);
103
+ Date startDate = new Date(1506865856000L);
104
+ Date endDate = new Date(1507297856000L);
105
+ ObjectNode bulkExtractResult = OBJECT_MAPPER.createObjectNode();
106
+ bulkExtractResult.set("exportId", new TextNode("bulkExtractId"));
107
+ marketoResponse.setResult(Arrays.asList(bulkExtractResult));
108
+ ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
109
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.CREATE_LEAD_EXTRACT.getEndpoint()), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), argumentCaptor.capture(), Mockito.any(MarketoResponseJetty92EntityReader.class));
110
+ String filterField = "filterField";
111
+ String bulkExtractId = marketoRestClient.createLeadBulkExtract(startDate, endDate, Arrays.asList("extract_field1", "extract_field2"), filterField);
112
+ Assert.assertEquals("bulkExtractId", bulkExtractId);
113
+ String postContent = argumentCaptor.getValue();
114
+ ObjectNode marketoBulkExtractRequest = (ObjectNode) OBJECT_MAPPER.readTree(postContent);
115
+ ObjectNode filter = (ObjectNode) marketoBulkExtractRequest.get("filter");
116
+ ObjectNode dateRangeFilter = (ObjectNode) filter.get(filterField);
117
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat(MarketoUtils.MARKETO_DATE_SIMPLE_DATE_FORMAT);
118
+ Assert.assertEquals(simpleDateFormat.format(startDate), dateRangeFilter.get("startAt").textValue());
119
+ Assert.assertEquals(simpleDateFormat.format(endDate), dateRangeFilter.get("endAt").textValue());
120
+ Assert.assertEquals("CSV", marketoBulkExtractRequest.get("format").textValue());
121
+ ArrayNode fields = (ArrayNode) marketoBulkExtractRequest.get("fields");
122
+ Assert.assertEquals("extract_field1", fields.get(0).textValue());
123
+ Assert.assertEquals("extract_field2", fields.get(1).textValue());
124
+ }
125
+
126
+ @Test
127
+ public void createLeadBulkExtractWithError() throws Exception
128
+ {
129
+ MarketoResponse<ObjectNode> marketoResponse = new MarketoResponse<>();
130
+ marketoResponse.setSuccess(false);
131
+ MarketoError marketoError = new MarketoError();
132
+ marketoError.setCode("ErrorCode1");
133
+ marketoError.setMessage("Message");
134
+ marketoResponse.setErrors(Arrays.asList(marketoError));
135
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.CREATE_LEAD_EXTRACT.getEndpoint()), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.anyString(), Mockito.any(MarketoResponseJetty92EntityReader.class));
136
+ String filterField = "filterField";
137
+ try {
138
+ marketoRestClient.createLeadBulkExtract(new Date(), new Date(), Arrays.asList("extract_field1", "extract_field2"), filterField);
139
+ }
140
+ catch (DataException ex) {
141
+ Assert.assertEquals("ErrorCode1: Message", ex.getMessage());
142
+ return;
143
+ }
144
+ Assert.fail();
145
+ }
146
+
147
+ @Test
148
+ public void createActitvityExtract() throws Exception
149
+ {
150
+ MarketoResponse<ObjectNode> marketoResponse = new MarketoResponse<>();
151
+ marketoResponse.setSuccess(true);
152
+ Date startDate = new Date(1506865856000L);
153
+ Date endDate = new Date(1507297856000L);
154
+ List<Integer> activityTypeIds = new ArrayList<>();
155
+ ObjectNode bulkExtractResult = OBJECT_MAPPER.createObjectNode();
156
+ bulkExtractResult.set("exportId", new TextNode("bulkExtractId"));
157
+ marketoResponse.setResult(Arrays.asList(bulkExtractResult));
158
+ ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
159
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.CREATE_ACTIVITY_EXTRACT.getEndpoint()), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), argumentCaptor.capture(), Mockito.any(MarketoResponseJetty92EntityReader.class));
160
+ String bulkExtractId = marketoRestClient.createActivityExtract(activityTypeIds, startDate, endDate);
161
+ Assert.assertEquals("bulkExtractId", bulkExtractId);
162
+ String postContent = argumentCaptor.getValue();
163
+ ObjectNode marketoBulkExtractRequest = (ObjectNode) OBJECT_MAPPER.readTree(postContent);
164
+ ObjectNode filter = (ObjectNode) marketoBulkExtractRequest.get("filter");
165
+ Assert.assertTrue(filter.has("createdAt"));
166
+ }
167
+
168
+ @Test
169
+ public void startLeadBulkExtract() throws Exception
170
+ {
171
+ String bulkExportId = "bulkExportId";
172
+ Map<String, String> pathParams = new HashMap<>();
173
+ pathParams.put("export_id", bulkExportId);
174
+ MarketoResponse<ObjectNode> marketoResponse = new MarketoResponse<>();
175
+ marketoResponse.setSuccess(true);
176
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.START_LEAD_EXPORT_JOB.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.isNull(String.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
177
+ marketoRestClient.startLeadBulkExtract(bulkExportId);
178
+ Mockito.verify(marketoRestClient, Mockito.times(1)).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.START_LEAD_EXPORT_JOB.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.isNull(String.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
179
+ }
180
+
181
+ @Test
182
+ public void startLeadBulkExtractWithError() throws Exception
183
+ {
184
+ String bulkExportId = "bulkExportId";
185
+ Map<String, String> pathParams = new HashMap<>();
186
+ pathParams.put("export_id", bulkExportId);
187
+ MarketoResponse<ObjectNode> marketoResponse = new MarketoResponse<>();
188
+ marketoResponse.setSuccess(false);
189
+ MarketoError marketoError = new MarketoError();
190
+ marketoError.setCode("ErrorCode");
191
+ marketoError.setMessage("Message");
192
+ marketoResponse.setErrors(Arrays.asList(marketoError));
193
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.START_LEAD_EXPORT_JOB.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.isNull(String.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
194
+ try {
195
+ marketoRestClient.startLeadBulkExtract(bulkExportId);
196
+ }
197
+ catch (DataException ex) {
198
+ Mockito.verify(marketoRestClient, Mockito.times(1)).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.START_LEAD_EXPORT_JOB.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.isNull(String.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
199
+ return;
200
+ }
201
+ Assert.fail();
202
+ }
203
+
204
+ @Test
205
+ public void startActivityBulkExtract() throws Exception
206
+ {
207
+ String bulkExportId = "bulkExportId";
208
+ Map<String, String> pathParams = new HashMap<>();
209
+ pathParams.put("export_id", bulkExportId);
210
+ MarketoResponse<ObjectNode> marketoResponse = new MarketoResponse<>();
211
+ marketoResponse.setSuccess(true);
212
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.START_ACTIVITY_EXPORT_JOB.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.isNull(String.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
213
+ marketoRestClient.startActitvityBulkExtract(bulkExportId);
214
+ Mockito.verify(marketoRestClient, Mockito.times(1)).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.START_ACTIVITY_EXPORT_JOB.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.isNull(String.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
215
+ }
216
+
217
+ @Test
218
+ public void waitLeadExportJobComplete() throws Exception
219
+ {
220
+ String bulkExportId = "bulkExportId";
221
+ Map<String, String> pathParams = new HashMap<>();
222
+ pathParams.put("export_id", bulkExportId);
223
+ MarketoResponse<ObjectNode> marketoResponse = Mockito.mock(MarketoResponse.class);
224
+ Mockito.when(marketoResponse.isSuccess()).thenReturn(true);
225
+ ObjectNode result = Mockito.mock(ObjectNode.class);
226
+ Mockito.when(marketoResponse.getResult()).thenReturn(Arrays.asList(result));
227
+ Mockito.when(result.get("status")).thenReturn(new TextNode("Queued")).thenReturn(new TextNode("Processing")).thenReturn(new TextNode("Completed"));
228
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LEAD_EXPORT_STATUS.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
229
+ marketoRestClient.waitLeadExportJobComplete(bulkExportId, 1, 4);
230
+ Mockito.verify(marketoRestClient, Mockito.times(3)).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LEAD_EXPORT_STATUS.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
231
+ }
232
+
233
+ @Test
234
+ public void waitLeadExportJobTimeOut() throws Exception
235
+ {
236
+ String bulkExportId = "bulkExportId";
237
+ Map<String, String> pathParams = new HashMap<>();
238
+ pathParams.put("export_id", bulkExportId);
239
+ MarketoResponse<ObjectNode> marketoResponse = Mockito.mock(MarketoResponse.class);
240
+ Mockito.when(marketoResponse.isSuccess()).thenReturn(true);
241
+ ObjectNode result = Mockito.mock(ObjectNode.class);
242
+ Mockito.when(marketoResponse.getResult()).thenReturn(Arrays.asList(result));
243
+ Mockito.when(result.get("status")).thenReturn(new TextNode("Queued")).thenReturn(new TextNode("Processing"));
244
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LEAD_EXPORT_STATUS.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
245
+ try {
246
+ marketoRestClient.waitLeadExportJobComplete(bulkExportId, 2, 4);
247
+ }
248
+ catch (DataException e) {
249
+ Assert.assertTrue(e.getMessage().contains("Job timeout exception"));
250
+ Mockito.verify(marketoRestClient, Mockito.times(2)).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LEAD_EXPORT_STATUS.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
251
+ return;
252
+ }
253
+ Assert.fail();
254
+ }
255
+
256
+ @Test
257
+ public void waitLeadExportJobFailed() throws Exception
258
+ {
259
+ String bulkExportId = "bulkExportId";
260
+ Map<String, String> pathParams = new HashMap<>();
261
+ pathParams.put("export_id", bulkExportId);
262
+ MarketoResponse<ObjectNode> marketoResponse = Mockito.mock(MarketoResponse.class);
263
+ Mockito.when(marketoResponse.isSuccess()).thenReturn(true);
264
+ ObjectNode result = Mockito.mock(ObjectNode.class);
265
+ Mockito.when(marketoResponse.getResult()).thenReturn(Arrays.asList(result));
266
+ Mockito.when(result.get("status")).thenReturn(new TextNode("Queued")).thenReturn(new TextNode("Failed"));
267
+ Mockito.when(result.get("errorMsg")).thenReturn(new TextNode("ErrorMessage"));
268
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LEAD_EXPORT_STATUS.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
269
+ try {
270
+ marketoRestClient.waitLeadExportJobComplete(bulkExportId, 1, 4);
271
+ }
272
+ catch (DataException e) {
273
+ Assert.assertTrue(e.getMessage().contains("Bulk extract job failed"));
274
+ Assert.assertTrue(e.getMessage().contains("ErrorMessage"));
275
+ Mockito.verify(marketoRestClient, Mockito.times(2)).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LEAD_EXPORT_STATUS.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
276
+ return;
277
+ }
278
+ Assert.fail();
279
+ }
280
+
281
+ @Test
282
+ public void waitActitvityExportJobComplete() throws Exception
283
+ {
284
+ String exportId = "exportId";
285
+ Map<String, String> pathParamMap = new HashMap<>();
286
+ pathParamMap.put("export_id", exportId);
287
+ MarketoResponse<ObjectNode> marketoResponse = Mockito.mock(MarketoResponse.class);
288
+ Mockito.when(marketoResponse.isSuccess()).thenReturn(true);
289
+ ObjectNode mockObjectNode = Mockito.mock(ObjectNode.class);
290
+ Mockito.when(marketoResponse.getResult()).thenReturn(Arrays.asList(mockObjectNode));
291
+ Mockito.when(mockObjectNode.get("status")).thenReturn(new TextNode("Completed"));
292
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doGet(Mockito.anyString(), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(Jetty92ResponseReader.class));
293
+ marketoRestClient.waitActitvityExportJobComplete(exportId, 1, 3);
294
+ Mockito.verify(marketoRestClient, Mockito.times(1)).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_ACTIVITY_EXPORT_STATUS.getEndpoint(pathParamMap)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(Jetty92ResponseReader.class));
295
+ }
296
+
297
+ @Test
298
+ public void getLeadBulkExtractResult() throws Exception
299
+ {
300
+ String exportId = "exportId";
301
+ Map<String, String> pathParamMap = new HashMap<>();
302
+ pathParamMap.put("export_id", exportId);
303
+ Mockito.doReturn(Mockito.mock(InputStream.class)).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LEAD_EXPORT_RESULT.getEndpoint(pathParamMap)), Mockito.any(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoInputStreamResponseEntityReader.class));
304
+ marketoRestClient.getLeadBulkExtractResult(exportId, null);
305
+ Mockito.verify(marketoRestClient, Mockito.times(1)).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LEAD_EXPORT_RESULT.getEndpoint(pathParamMap)), Mockito.any(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoInputStreamResponseEntityReader.class));
306
+ }
307
+
308
+ @Test
309
+ public void getActivitiesBulkExtractResult() throws Exception
310
+ {
311
+ String exportId = "exportId";
312
+ Map<String, String> pathParamMap = new HashMap<>();
313
+ pathParamMap.put("export_id", exportId);
314
+ Mockito.doReturn(Mockito.mock(InputStream.class)).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_ACTIVITY_EXPORT_RESULT.getEndpoint(pathParamMap)), Mockito.any(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoInputStreamResponseEntityReader.class));
315
+ marketoRestClient.getActivitiesBulkExtractResult(exportId, null);
316
+ Mockito.verify(marketoRestClient, Mockito.times(1)).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_ACTIVITY_EXPORT_RESULT.getEndpoint(pathParamMap)), Mockito.any(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoInputStreamResponseEntityReader.class));
317
+ }
318
+
319
+ @Test
320
+ public void getLists() throws Exception
321
+ {
322
+ mockMarketoPageResponse("/fixtures/lists_response.json", END_POINT + MarketoRESTEndpoint.GET_LISTS.getEndpoint());
323
+ RecordPagingIterable<ObjectNode> lists = marketoRestClient.getLists();
324
+ Iterator<ObjectNode> iterator = lists.iterator();
325
+ ObjectNode list1 = iterator.next();
326
+ ObjectNode list2 = iterator.next();
327
+ Assert.assertFalse(iterator.hasNext());
328
+ Assert.assertEquals("Test list 1", list1.get("name").asText());
329
+ Assert.assertEquals("Test list 2", list2.get("name").asText());
330
+ ArgumentCaptor<Multimap> immutableListMultimapArgumentCaptor = ArgumentCaptor.forClass(Multimap.class);
331
+ ArgumentCaptor<FormContentProvider> formContentProviderArgumentCaptor = ArgumentCaptor.forClass(FormContentProvider.class);
332
+ Mockito.verify(marketoRestClient, Mockito.times(2)).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LISTS.getEndpoint()), Mockito.isNull(Map.class), immutableListMultimapArgumentCaptor.capture(), Mockito.any(MarketoResponseJetty92EntityReader.class), formContentProviderArgumentCaptor.capture());
333
+ List<Multimap> params = immutableListMultimapArgumentCaptor.getAllValues();
334
+ Multimap params1 = params.get(0);
335
+ Assert.assertEquals("GET", params1.get("_method").iterator().next());
336
+ Assert.assertEquals("nextPageToken=GWP55GLCVCZLPE6SS7OCG5IEXQ%3D%3D%3D%3D%3D%3D&batchSize=300", fromContentProviderToString(formContentProviderArgumentCaptor.getValue()));
337
+ }
338
+
339
+ @Test
340
+ public void getPrograms() throws Exception
341
+ {
342
+ ArrayNode listPages = (ArrayNode) OBJECT_MAPPER.readTree(new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/program_response.json")))).get("responses");
343
+ MarketoResponse<ObjectNode> page1 = OBJECT_MAPPER.readValue(listPages.get(0).toString(), RESPONSE_TYPE);
344
+ MarketoResponse<ObjectNode> page2 = OBJECT_MAPPER.readValue(listPages.get(1).toString(), RESPONSE_TYPE);
345
+ Mockito.doReturn(page1).doReturn(page2).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_PROGRAMS.getEndpoint()), Mockito.isNull(Map.class), Mockito.any(Multimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
346
+ RecordPagingIterable<ObjectNode> lists = marketoRestClient.getPrograms();
347
+ Iterator<ObjectNode> iterator = lists.iterator();
348
+ ObjectNode program1 = iterator.next();
349
+ ObjectNode program2 = iterator.next();
350
+ ObjectNode program3 = iterator.next();
351
+ Assert.assertFalse(iterator.hasNext());
352
+ Assert.assertEquals("MB_Sep_25_test_program", program1.get("name").asText());
353
+ Assert.assertEquals("TD Output Test Program", program2.get("name").asText());
354
+ Assert.assertEquals("Bill_progream", program3.get("name").asText());
355
+ ArgumentCaptor<ImmutableListMultimap> immutableListMultimapArgumentCaptor = ArgumentCaptor.forClass(ImmutableListMultimap.class);
356
+ Mockito.verify(marketoRestClient, Mockito.times(2)).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_PROGRAMS.getEndpoint()), Mockito.isNull(Map.class), immutableListMultimapArgumentCaptor.capture(), Mockito.any(MarketoResponseJetty92EntityReader.class));
357
+ List<ImmutableListMultimap> params = immutableListMultimapArgumentCaptor.getAllValues();
358
+ ImmutableListMultimap params1 = params.get(0);
359
+ Assert.assertEquals("0", params1.get("offset").get(0));
360
+ Assert.assertEquals("2", params1.get("maxReturn").get(0));
361
+ ImmutableListMultimap params2 = params.get(1);
362
+ Assert.assertEquals("2", params2.get("offset").get(0));
363
+ }
364
+
365
+ private void mockMarketoPageResponse(String fixtureName, String mockEndpoint) throws IOException
366
+ {
367
+ ArrayNode listPages = (ArrayNode) OBJECT_MAPPER.readTree(new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream(fixtureName)))).get("responses");
368
+ MarketoResponse<ObjectNode> page1 = OBJECT_MAPPER.readValue(listPages.get(0).toString(), RESPONSE_TYPE);
369
+ MarketoResponse<ObjectNode> page2 = OBJECT_MAPPER.readValue(listPages.get(1).toString(), RESPONSE_TYPE);
370
+ Mockito.doReturn(page1).doReturn(page2).when(marketoRestClient).doPost(Mockito.eq(mockEndpoint), Mockito.isNull(Map.class), Mockito.any(Multimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class), Mockito.any(FormContentProvider.class));
371
+ }
372
+
373
+ @Test
374
+ public void getLeadsByProgram() throws Exception
375
+ {
376
+ String programId = "programId";
377
+ Map<String, String> pathParamPath = new HashMap<>();
378
+ pathParamPath.put("program_id", programId);
379
+ mockMarketoPageResponse("/fixtures/lead_by_program_response.json", END_POINT + MarketoRESTEndpoint.GET_LEADS_BY_PROGRAM.getEndpoint(pathParamPath));
380
+ RecordPagingIterable<ObjectNode> lists = marketoRestClient.getLeadsByProgram(programId, "firstName,lastName");
381
+ Iterator<ObjectNode> iterator = lists.iterator();
382
+ ObjectNode lead1 = iterator.next();
383
+ ObjectNode lead2 = iterator.next();
384
+ Assert.assertFalse(iterator.hasNext());
385
+ Assert.assertEquals("Tai 1", lead1.get("firstName").asText());
386
+ Assert.assertEquals("Tai", lead2.get("firstName").asText());
387
+ ArgumentCaptor<ImmutableListMultimap> immutableListMultimapArgumentCaptor = ArgumentCaptor.forClass(ImmutableListMultimap.class);
388
+ ArgumentCaptor<FormContentProvider> formContentProviderArgumentCaptor = ArgumentCaptor.forClass(FormContentProvider.class);
389
+ Mockito.verify(marketoRestClient, Mockito.times(2)).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LEADS_BY_PROGRAM.getEndpoint(pathParamPath)), Mockito.isNull(Map.class), immutableListMultimapArgumentCaptor.capture(), Mockito.any(MarketoResponseJetty92EntityReader.class), formContentProviderArgumentCaptor.capture());
390
+ String formContent = fromContentProviderToString(formContentProviderArgumentCaptor.getValue());
391
+ List<ImmutableListMultimap> params = immutableListMultimapArgumentCaptor.getAllValues();
392
+ Multimap params1 = params.get(0);
393
+ Assert.assertEquals("GET", params1.get("_method").iterator().next());
394
+ Assert.assertEquals("nextPageToken=z4MgsIiC5C%3D%3D%3D%3D%3D%3D&batchSize=300&fields=firstName%2ClastName", formContent);
395
+ }
396
+
397
+ private String fromContentProviderToString(ContentProvider formContentProvider)
398
+ {
399
+ Iterator<ByteBuffer> byteBufferIterator = formContentProvider.iterator();
400
+ StringBuilder stringBuilder = new StringBuilder();
401
+ while (byteBufferIterator.hasNext()) {
402
+ ByteBuffer next = byteBufferIterator.next();
403
+ stringBuilder.append(new String(next.array()));
404
+ }
405
+ return stringBuilder.toString();
406
+ }
407
+
408
+ @Test
409
+ public void getLeadsByList() throws Exception
410
+ {
411
+ String listId = "listId";
412
+ Map<String, String> pathParamPath = new HashMap<>();
413
+ pathParamPath.put("list_id", listId);
414
+ mockMarketoPageResponse("/fixtures/lead_by_list.json", END_POINT + MarketoRESTEndpoint.GET_LEADS_BY_LIST.getEndpoint(pathParamPath));
415
+ RecordPagingIterable<ObjectNode> lists = marketoRestClient.getLeadsByList(listId, "firstName,lastName");
416
+ Iterator<ObjectNode> iterator = lists.iterator();
417
+ ObjectNode lead1 = iterator.next();
418
+ ObjectNode lead2 = iterator.next();
419
+ Assert.assertFalse(iterator.hasNext());
420
+ Assert.assertEquals("John10093", lead1.get("firstName").asText());
421
+ Assert.assertEquals("John10094", lead2.get("firstName").asText());
422
+ ArgumentCaptor<ImmutableListMultimap> immutableListMultimapArgumentCaptor = ArgumentCaptor.forClass(ImmutableListMultimap.class);
423
+ ArgumentCaptor<FormContentProvider> formContentProviderArgumentCaptor = ArgumentCaptor.forClass(FormContentProvider.class);
424
+ Mockito.verify(marketoRestClient, Mockito.times(2)).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LEADS_BY_LIST.getEndpoint(pathParamPath)), Mockito.isNull(Map.class), immutableListMultimapArgumentCaptor.capture(), Mockito.any(MarketoResponseJetty92EntityReader.class), formContentProviderArgumentCaptor.capture());
425
+ String formContent = fromContentProviderToString(formContentProviderArgumentCaptor.getValue());
426
+ List<ImmutableListMultimap> params = immutableListMultimapArgumentCaptor.getAllValues();
427
+ Multimap params1 = params.get(0);
428
+ Assert.assertEquals("GET", params1.get("_method").iterator().next());
429
+ Assert.assertEquals("nextPageToken=z4MgsIiC5C%3D%3D%3D%3D%3D%3D&batchSize=300&fields=firstName%2ClastName", formContent);
430
+ }
431
+
432
+ @Test
433
+ public void getCampaign() throws Exception
434
+ {
435
+ mockMarketoPageResponse("/fixtures/campaign_response.json", END_POINT + MarketoRESTEndpoint.GET_CAMPAIGN.getEndpoint());
436
+ RecordPagingIterable<ObjectNode> lists = marketoRestClient.getCampaign();
437
+ Iterator<ObjectNode> iterator = lists.iterator();
438
+ ObjectNode campaign1 = iterator.next();
439
+ ObjectNode campaign2 = iterator.next();
440
+ Assert.assertFalse(iterator.hasNext());
441
+ Assert.assertEquals("Opened Sales Email", campaign1.get("name").asText());
442
+ Assert.assertEquals("Clicks Link in Email", campaign2.get("name").asText());
443
+ ArgumentCaptor<ImmutableListMultimap> immutableListMultimapArgumentCaptor = ArgumentCaptor.forClass(ImmutableListMultimap.class);
444
+ ArgumentCaptor<FormContentProvider> formContentProviderArgumentCaptor = ArgumentCaptor.forClass(FormContentProvider.class);
445
+ Mockito.verify(marketoRestClient, Mockito.times(2)).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_CAMPAIGN.getEndpoint()), Mockito.isNull(Map.class), immutableListMultimapArgumentCaptor.capture(), Mockito.any(MarketoResponseJetty92EntityReader.class), formContentProviderArgumentCaptor.capture());
446
+ String content = fromContentProviderToString(formContentProviderArgumentCaptor.getValue());
447
+
448
+ List<ImmutableListMultimap> params = immutableListMultimapArgumentCaptor.getAllValues();
449
+ Multimap params1 = params.get(0);
450
+ Assert.assertEquals("GET", params1.get("_method").iterator().next());
451
+ Assert.assertEquals("nextPageToken=z4MgsIiC5C%3D%3D%3D%3D%3D%3D&batchSize=300", content);
452
+ }
453
+
454
+ @Test
455
+ public void testGetProgramsByTagType() throws Exception
456
+ {
457
+ ArrayNode listPages = (ArrayNode) OBJECT_MAPPER.readTree(new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/program_response.json")))).get("responses");
458
+ MarketoResponse<ObjectNode> page1 = OBJECT_MAPPER.readValue(listPages.get(0).toString(), RESPONSE_TYPE);
459
+ MarketoResponse<ObjectNode> page2 = OBJECT_MAPPER.readValue(listPages.get(1).toString(), RESPONSE_TYPE);
460
+
461
+ final String tagType = "dummy_tag";
462
+ final String tagValue = "dummy_value";
463
+
464
+ Mockito.doReturn(page1).doReturn(page2).when(marketoRestClient).doGet(
465
+ Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_PROGRAMS_BY_TAG.getEndpoint()),
466
+ (Map) ArgumentMatchers.isNull(),
467
+ Mockito.any(Multimap.class),
468
+ Mockito.any(MarketoResponseJetty92EntityReader.class));
469
+ Iterable<ObjectNode> lists = marketoRestClient.getProgramsByTag(tagType, tagValue);
470
+ Iterator<ObjectNode> iterator = lists.iterator();
471
+ ObjectNode program1 = iterator.next();
472
+ ObjectNode program2 = iterator.next();
473
+ ObjectNode program3 = iterator.next();
474
+ Assert.assertFalse(iterator.hasNext());
475
+ Assert.assertEquals("MB_Sep_25_test_program", program1.get("name").asText());
476
+ Assert.assertEquals("TD Output Test Program", program2.get("name").asText());
477
+ Assert.assertEquals("Bill_progream", program3.get("name").asText());
478
+
479
+ ArgumentCaptor<ImmutableListMultimap> immutableListMultimapArgumentCaptor = ArgumentCaptor.forClass(ImmutableListMultimap.class);
480
+ Mockito.verify(marketoRestClient, Mockito.times(2)).doGet(
481
+ Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_PROGRAMS_BY_TAG.getEndpoint()),
482
+ (Map) ArgumentMatchers.isNull(),
483
+ immutableListMultimapArgumentCaptor.capture(),
484
+ Mockito.any(MarketoResponseJetty92EntityReader.class));
485
+ List<ImmutableListMultimap> params = immutableListMultimapArgumentCaptor.getAllValues();
486
+
487
+ ImmutableListMultimap params1 = params.get(0);
488
+ Assert.assertEquals("0", params1.get("offset").get(0));
489
+ Assert.assertEquals("2", params1.get("maxReturn").get(0));
490
+ Assert.assertEquals("dummy_tag", params1.get("tagType").get(0));
491
+ Assert.assertEquals("dummy_value", params1.get("tagValue").get(0));
492
+
493
+ ImmutableListMultimap params2 = params.get(1);
494
+ Assert.assertEquals("2", params2.get("offset").get(0));
495
+ Assert.assertEquals("dummy_tag", params2.get("tagType").get(0));
496
+ Assert.assertEquals("dummy_value", params2.get("tagValue").get(0));
497
+ }
498
+
499
+ @Test
500
+ public void TestProgramsByDateRange() throws Exception
501
+ {
502
+ ArrayNode listPages = (ArrayNode) OBJECT_MAPPER.readTree(new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/program_response.json")))).get("responses");
503
+ MarketoResponse<ObjectNode> page1 = OBJECT_MAPPER.readValue(listPages.get(0).toString(), RESPONSE_TYPE);
504
+ MarketoResponse<ObjectNode> page2 = OBJECT_MAPPER.readValue(listPages.get(1).toString(), RESPONSE_TYPE);
505
+
506
+ Mockito.doReturn(page1).doReturn(page2).when(marketoRestClient).doGet(
507
+ Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_PROGRAMS.getEndpoint()),
508
+ (Map) ArgumentMatchers.isNull(),
509
+ Mockito.any(Multimap.class),
510
+ Mockito.any(MarketoResponseJetty92EntityReader.class));
511
+ OffsetDateTime earliestUpdatedAt = OffsetDateTime.now().minusDays(10);
512
+ OffsetDateTime latestUpdatedAt = earliestUpdatedAt.plusDays(5);
513
+ String filterType = "filter1";
514
+ List<String> filterValues = Arrays.asList("value1", "value2");
515
+
516
+ Iterable<ObjectNode> lists = marketoRestClient.getProgramsByDateRange(Date.from(earliestUpdatedAt.toInstant()),
517
+ Date.from(latestUpdatedAt.toInstant()), filterType, filterValues);
518
+ Iterator<ObjectNode> iterator = lists.iterator();
519
+ ObjectNode program1 = iterator.next();
520
+ ObjectNode program2 = iterator.next();
521
+ ObjectNode program3 = iterator.next();
522
+ Assert.assertFalse(iterator.hasNext());
523
+ Assert.assertEquals("MB_Sep_25_test_program", program1.get("name").asText());
524
+ Assert.assertEquals("TD Output Test Program", program2.get("name").asText());
525
+ Assert.assertEquals("Bill_progream", program3.get("name").asText());
526
+
527
+ ArgumentCaptor<ImmutableListMultimap> immutableListMultimapArgumentCaptor = ArgumentCaptor.forClass(ImmutableListMultimap.class);
528
+ Mockito.verify(marketoRestClient, Mockito.times(2)).doGet(
529
+ Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_PROGRAMS.getEndpoint()),
530
+ (Map) ArgumentMatchers.isNull(),
531
+ immutableListMultimapArgumentCaptor.capture(),
532
+ Mockito.any(MarketoResponseJetty92EntityReader.class));
533
+ List<ImmutableListMultimap> params = immutableListMultimapArgumentCaptor.getAllValues();
534
+ DateTimeFormatter fmt = DateTimeFormatter.ofPattern(MarketoUtils.MARKETO_DATE_SIMPLE_DATE_FORMAT);
535
+
536
+ ImmutableListMultimap params1 = params.get(0);
537
+ Assert.assertEquals("0", params1.get("offset").get(0));
538
+ Assert.assertEquals("2", params1.get("maxReturn").get(0));
539
+ Assert.assertEquals(earliestUpdatedAt.format(fmt), params1.get("earliestUpdatedAt").get(0));
540
+ Assert.assertEquals(latestUpdatedAt.format(fmt), params1.get("latestUpdatedAt").get(0));
541
+ Assert.assertEquals("filter1", params1.get("filterType").get(0));
542
+ Assert.assertEquals(String.join(",", filterValues), params1.get("filterValues").get(0));
543
+
544
+ ImmutableListMultimap params2 = params.get(1);
545
+ Assert.assertEquals("2", params2.get("offset").get(0));
546
+ Assert.assertEquals(earliestUpdatedAt.format(fmt), params2.get("earliestUpdatedAt").get(0));
547
+ Assert.assertEquals(latestUpdatedAt.format(fmt), params2.get("latestUpdatedAt").get(0));
548
+ Assert.assertEquals("filter1", params2.get("filterType").get(0));
549
+ Assert.assertEquals(String.join(",", filterValues), params2.get("filterValues").get(0));
550
+ }
551
+
552
+ @Test
553
+ public void describeCustomObject() throws Exception
554
+ {
555
+ String customObjectSchema = new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/custom_object_describe.json")));
556
+ MarketoResponse<ObjectNode> marketoResponse = OBJECT_MAPPER.readValue(customObjectSchema, RESPONSE_TYPE);
557
+ String apiName = "custom_object";
558
+ Map<String, String> pathParams = new HashMap<>();
559
+ pathParams.put("api_name", apiName);
560
+ Mockito.doReturn(marketoResponse).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_CUSTOM_OBJECT_DESCRIBE.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
561
+ List<MarketoField> marketoFields = marketoRestClient.describeCustomObject(apiName);
562
+ Assert.assertEquals(16, marketoFields.size());
563
+ JavaType marketoFieldType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, MarketoField.class);
564
+ List<MarketoField> expectedFields = OBJECT_MAPPER.readValue(new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/custom_object_expected.json"))), marketoFieldType);
565
+ Assert.assertArrayEquals(expectedFields.toArray(), marketoFields.toArray());
566
+ }
567
+
568
+ @Test
569
+ public void getCustomObject() throws Exception
570
+ {
571
+ String apiName = "custom_object";
572
+ Map<String, String> pathParams = new HashMap<>();
573
+ pathParams.put("api_name", apiName);
574
+
575
+ ArrayNode listPages = (ArrayNode) OBJECT_MAPPER.readTree(new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/custom_object_response.json")))).get("responses");
576
+ MarketoResponse<ObjectNode> page1 = OBJECT_MAPPER.readValue(listPages.get(0).toString(), RESPONSE_TYPE);
577
+ Mockito.doReturn(page1).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_CUSTOM_OBJECT.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.any(ImmutableListMultimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
578
+ RecordPagingIterable<ObjectNode> pages = (RecordPagingIterable<ObjectNode>) marketoRestClient.getCustomObject(apiName, "id", null, 1, 2);
579
+ Iterator<ObjectNode> iterator = pages.iterator();
580
+ ObjectNode customObject1 = iterator.next();
581
+ ObjectNode customObject2 = iterator.next();
582
+ Assert.assertFalse(iterator.hasNext());
583
+ Assert.assertEquals("1", customObject1.get("id").asText());
584
+ Assert.assertEquals("2", customObject2.get("id").asText());
585
+ }
586
+
587
+ @Test
588
+ public void testGetProgramsByIds() throws IOException
589
+ {
590
+ Set<String> ids = new HashSet<>();
591
+ ids.add("123");
592
+ ids.add("456");
593
+
594
+ ArrayNode listPages = (ArrayNode) OBJECT_MAPPER.readTree(new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/program_response.json")))).get("responses");
595
+ MarketoResponse<ObjectNode> page1 = OBJECT_MAPPER.readValue(listPages.get(0).toString(), RESPONSE_TYPE);
596
+ MarketoResponse<ObjectNode> page2 = OBJECT_MAPPER.readValue(listPages.get(1).toString(), RESPONSE_TYPE);
597
+ Mockito.doReturn(page1).doReturn(page2).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_PROGRAMS.getEndpoint()), Mockito.isNull(), Mockito.any(Multimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
598
+ RecordPagingIterable<ObjectNode> lists = marketoRestClient.getProgramsByIds(ids);
599
+ Iterator<ObjectNode> iterator = lists.iterator();
600
+ ObjectNode program1 = iterator.next();
601
+ ObjectNode program2 = iterator.next();
602
+ ObjectNode program3 = iterator.next();
603
+ Assert.assertFalse(iterator.hasNext());
604
+ Assert.assertEquals("MB_Sep_25_test_program", program1.get("name").asText());
605
+ Assert.assertEquals("TD Output Test Program", program2.get("name").asText());
606
+ Assert.assertEquals("Bill_progream", program3.get("name").asText());
607
+
608
+ ArgumentCaptor<ImmutableListMultimap> paramCaptor = ArgumentCaptor.forClass(ImmutableListMultimap.class);
609
+ Mockito.verify(marketoRestClient, Mockito.times(2)).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_PROGRAMS.getEndpoint()), Mockito.isNull(), paramCaptor.capture(), Mockito.any(MarketoResponseJetty92EntityReader.class));
610
+
611
+ List<ImmutableListMultimap> params = paramCaptor.getAllValues();
612
+
613
+ ImmutableListMultimap params1 = params.get(0);
614
+ Assert.assertEquals("id", params1.get("filterType").get(0));
615
+ Assert.assertEquals("123,456", params1.get("filterValues").get(0));
616
+
617
+ ImmutableListMultimap params2 = params.get(1);
618
+ Assert.assertEquals(params1.get("filterType").get(0), params2.get("filterType").get(0));
619
+ Assert.assertEquals(params1.get("filterValues").get(0), params2.get("filterValues").get(0));
620
+ }
621
+
622
+ @Test
623
+ public void testGetListsByIds() throws IOException
624
+ {
625
+ Set<String> ids = new HashSet<>();
626
+ ids.add("123");
627
+ ids.add("456");
628
+
629
+ mockMarketoPageResponse("/fixtures/lists_response.json", END_POINT + MarketoRESTEndpoint.GET_LISTS.getEndpoint());
630
+ RecordPagingIterable<ObjectNode> lists = marketoRestClient.getListsByIds(ids);
631
+ Iterator<ObjectNode> iterator = lists.iterator();
632
+ ObjectNode list1 = iterator.next();
633
+ ObjectNode list2 = iterator.next();
634
+
635
+ Assert.assertFalse(iterator.hasNext());
636
+ Assert.assertEquals("Test list 1", list1.get("name").asText());
637
+ Assert.assertEquals("Test list 2", list2.get("name").asText());
638
+
639
+ ArgumentCaptor<ImmutableListMultimap> paramsCaptor = ArgumentCaptor.forClass(ImmutableListMultimap.class);
640
+ ArgumentCaptor<FormContentProvider> formCaptor = ArgumentCaptor.forClass(FormContentProvider.class);
641
+ Mockito.verify(marketoRestClient, Mockito.times(2)).doPost(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_LISTS.getEndpoint()), Mockito.isNull(), paramsCaptor.capture(), Mockito.any(MarketoResponseJetty92EntityReader.class), formCaptor.capture());
642
+
643
+ ImmutableListMultimap params = paramsCaptor.getValue();
644
+ Assert.assertEquals("GET", params.get("_method").iterator().next());
645
+
646
+ FormContentProvider form = formCaptor.getValue();
647
+ Assert.assertEquals("nextPageToken=GWP55GLCVCZLPE6SS7OCG5IEXQ%3D%3D%3D%3D%3D%3D&id=123%2C456&batchSize=300", fromContentProviderToString(form));
648
+ }
649
+ }