embulk-input-zendesk 0.3.4 → 0.3.5
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 +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +32 -2
- data/build.gradle +1 -1
- data/src/main/java/org/embulk/input/zendesk/RecordImporter.java +134 -0
- data/src/main/java/org/embulk/input/zendesk/ZendeskInputPlugin.java +182 -202
- data/src/main/java/org/embulk/input/zendesk/clients/ZendeskRestClient.java +54 -52
- data/src/main/java/org/embulk/input/zendesk/models/Target.java +3 -3
- data/src/main/java/org/embulk/input/zendesk/models/ZendeskException.java +1 -1
- data/src/main/java/org/embulk/input/zendesk/services/ZendeskCustomObjectService.java +110 -0
- data/src/main/java/org/embulk/input/zendesk/services/ZendeskNPSService.java +30 -0
- data/src/main/java/org/embulk/input/zendesk/services/ZendeskNormalServices.java +239 -0
- data/src/main/java/org/embulk/input/zendesk/services/ZendeskService.java +14 -0
- data/src/main/java/org/embulk/input/zendesk/services/ZendeskSupportAPIService.java +25 -83
- data/src/main/java/org/embulk/input/zendesk/services/ZendeskUserEventService.java +158 -0
- data/src/main/java/org/embulk/input/zendesk/stream/PagingSpliterator.java +40 -0
- data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/CustomObjectSpliterator.java +42 -0
- data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/SunshineSpliterator.java +66 -0
- data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/UserEventSpliterator.java +35 -0
- data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/OrganizationSpliterator.java +13 -0
- data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/SupportSpliterator.java +44 -0
- data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/UserSpliterator.java +13 -0
- data/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java +13 -1
- data/src/main/java/org/embulk/input/zendesk/utils/ZendeskDateUtils.java +22 -11
- data/src/main/java/org/embulk/input/zendesk/utils/ZendeskUtils.java +52 -114
- data/src/test/java/org/embulk/input/zendesk/TestRecordImporter.java +114 -0
- data/src/test/java/org/embulk/input/zendesk/TestZendeskInputPlugin.java +184 -99
- data/src/test/java/org/embulk/input/zendesk/clients/TestZendeskRestClient.java +6 -20
- data/src/test/java/org/embulk/input/zendesk/services/TestZendeskCustomObjectService.java +161 -0
- data/src/test/java/org/embulk/input/zendesk/services/TestZendeskNPSService.java +56 -0
- data/src/test/java/org/embulk/input/zendesk/services/TestZendeskNormalService.java +189 -0
- data/src/test/java/org/embulk/input/zendesk/services/TestZendeskSupportAPIService.java +18 -60
- data/src/test/java/org/embulk/input/zendesk/services/TestZendeskUserEventService.java +158 -0
- data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskDateUtils.java +50 -2
- data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskUtil.java +0 -138
- data/src/test/java/org/embulk/input/zendesk/utils/ZendeskTestHelper.java +16 -0
- data/src/test/resources/config/nps.yml +29 -0
- data/src/test/resources/config/object_records.yml +24 -0
- data/src/test/resources/config/relationship_records.yml +23 -0
- data/src/test/resources/config/user_events.yml +29 -0
- data/src/test/resources/data/duplicate_user.json +0 -0
- data/src/test/resources/data/empty_result.json +7 -0
- data/src/test/resources/data/expected/user_events_column.json +40 -0
- data/src/test/resources/data/object_records.json +30 -0
- data/src/test/resources/data/organization.json +39 -0
- data/src/test/resources/data/relationship_records.json +57 -0
- data/src/test/resources/data/scores.json +21 -0
- data/src/test/resources/data/scores_share_same_time_with_next_page.json +35 -0
- data/src/test/resources/data/scores_share_same_time_without_next_page.json +35 -0
- data/src/test/resources/data/simple_organization.json +23 -0
- data/src/test/resources/data/simple_user.json +50 -0
- data/src/test/resources/data/simple_user_event.json +19 -0
- data/src/test/resources/data/ticket_events_share_same_time_with_next_page.json +279 -0
- data/src/test/resources/data/ticket_events_share_same_time_without_next_page.json +279 -0
- data/src/test/resources/data/ticket_events_updated_by_system_records.json +279 -0
- data/src/test/resources/data/ticket_share_same_time_with_next_page.json +232 -0
- data/src/test/resources/data/ticket_share_same_time_without_next_page.json +232 -0
- data/src/test/resources/data/ticket_with_updated_by_system_records.json +187 -0
- data/src/test/resources/data/user_event.json +19 -0
- data/src/test/resources/data/user_event_contain_latter_create_at.json +19 -0
- data/src/test/resources/data/user_event_multiple.json +33 -0
- metadata +46 -5
- data/src/main/java/org/embulk/input/zendesk/utils/ZendeskValidatorUtils.java +0 -79
- data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskValidatorUtils.java +0 -130
|
@@ -7,25 +7,32 @@ import org.embulk.config.ConfigException;
|
|
|
7
7
|
import org.embulk.config.ConfigSource;
|
|
8
8
|
import org.embulk.config.TaskReport;
|
|
9
9
|
import org.embulk.config.TaskSource;
|
|
10
|
+
import org.embulk.input.zendesk.models.Target;
|
|
11
|
+
import org.embulk.input.zendesk.services.ZendeskCustomObjectService;
|
|
12
|
+
import org.embulk.input.zendesk.services.ZendeskNPSService;
|
|
13
|
+
import org.embulk.input.zendesk.services.ZendeskService;
|
|
10
14
|
import org.embulk.input.zendesk.services.ZendeskSupportAPIService;
|
|
15
|
+
import org.embulk.input.zendesk.services.ZendeskUserEventService;
|
|
11
16
|
import org.embulk.input.zendesk.utils.ZendeskConstants;
|
|
12
17
|
import org.embulk.input.zendesk.utils.ZendeskPluginTestRuntime;
|
|
13
18
|
import org.embulk.input.zendesk.utils.ZendeskTestHelper;
|
|
14
19
|
|
|
20
|
+
import org.embulk.spi.Exec;
|
|
15
21
|
import org.embulk.spi.InputPlugin;
|
|
16
22
|
import org.embulk.spi.PageBuilder;
|
|
17
23
|
import org.embulk.spi.PageOutput;
|
|
18
24
|
import org.embulk.spi.Schema;
|
|
25
|
+
|
|
19
26
|
import org.embulk.spi.TestPageBuilderReader;
|
|
20
27
|
import org.junit.Assert;
|
|
21
|
-
|
|
22
28
|
import org.junit.Before;
|
|
23
29
|
import org.junit.Rule;
|
|
24
30
|
import org.junit.Test;
|
|
25
|
-
import org.mockito.Mockito;
|
|
26
31
|
|
|
27
32
|
import static org.junit.Assert.assertEquals;
|
|
28
33
|
|
|
34
|
+
import static org.junit.Assert.assertTrue;
|
|
35
|
+
import static org.junit.Assert.fail;
|
|
29
36
|
import static org.mockito.ArgumentMatchers.any;
|
|
30
37
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
|
31
38
|
import static org.mockito.ArgumentMatchers.anyInt;
|
|
@@ -35,10 +42,15 @@ import static org.mockito.ArgumentMatchers.anyString;
|
|
|
35
42
|
import static org.mockito.Mockito.doReturn;
|
|
36
43
|
import static org.mockito.Mockito.mock;
|
|
37
44
|
import static org.mockito.Mockito.spy;
|
|
45
|
+
|
|
38
46
|
import static org.mockito.Mockito.times;
|
|
39
47
|
import static org.mockito.Mockito.verify;
|
|
40
48
|
import static org.mockito.Mockito.when;
|
|
41
49
|
|
|
50
|
+
import java.time.Instant;
|
|
51
|
+
import java.time.OffsetDateTime;
|
|
52
|
+
import java.time.ZoneOffset;
|
|
53
|
+
import java.time.format.DateTimeFormatter;
|
|
42
54
|
import java.util.Collections;
|
|
43
55
|
import java.util.List;
|
|
44
56
|
import java.util.stream.Collectors;
|
|
@@ -50,19 +62,19 @@ public class TestZendeskInputPlugin
|
|
|
50
62
|
@SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
|
|
51
63
|
public ZendeskPluginTestRuntime embulk = new ZendeskPluginTestRuntime();
|
|
52
64
|
|
|
53
|
-
private
|
|
65
|
+
private ZendeskService zendeskSupportAPIService;
|
|
54
66
|
|
|
55
67
|
private ZendeskInputPlugin zendeskInputPlugin;
|
|
56
68
|
|
|
57
|
-
private
|
|
69
|
+
private PageBuilder pageBuilder = mock(PageBuilder.class);
|
|
58
70
|
|
|
59
|
-
private
|
|
71
|
+
private TestPageBuilderReader.MockPageOutput output = new TestPageBuilderReader.MockPageOutput();
|
|
60
72
|
|
|
61
73
|
@Before
|
|
62
74
|
public void prepare()
|
|
63
75
|
{
|
|
64
76
|
zendeskInputPlugin = spy(new ZendeskInputPlugin());
|
|
65
|
-
|
|
77
|
+
setupSupportAPIService();
|
|
66
78
|
doReturn(pageBuilder).when(zendeskInputPlugin).getPageBuilder(any(Schema.class), any(PageOutput.class));
|
|
67
79
|
}
|
|
68
80
|
|
|
@@ -91,6 +103,15 @@ public class TestZendeskInputPlugin
|
|
|
91
103
|
setupTestGuessGenerateColumn(src, "data/ticket_metrics.json", "data/expected/ticket_metrics_column.json");
|
|
92
104
|
}
|
|
93
105
|
|
|
106
|
+
@Test
|
|
107
|
+
public void testGuessGenerateColumnsForUserEvents()
|
|
108
|
+
{
|
|
109
|
+
final ConfigSource src = ZendeskTestHelper.getConfigSource("base.yml");
|
|
110
|
+
src.set("target", "user_events");
|
|
111
|
+
src.set("profile_source", "dummy");
|
|
112
|
+
setupTestGuessGenerateColumn(src, "data/user_event.json", "data/expected/user_events_column.json");
|
|
113
|
+
}
|
|
114
|
+
|
|
94
115
|
@Test
|
|
95
116
|
public void testGuessGenerateColumnsForNonIncrementalTarget()
|
|
96
117
|
{
|
|
@@ -110,153 +131,199 @@ public class TestZendeskInputPlugin
|
|
|
110
131
|
}
|
|
111
132
|
|
|
112
133
|
@Test
|
|
113
|
-
public void
|
|
134
|
+
public void testRunSupportAPINonIncremental()
|
|
114
135
|
{
|
|
115
|
-
final ConfigSource src = ZendeskTestHelper.getConfigSource("incremental.yml");
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
when(zendeskSupportAPIService.getData(anyString(), anyInt(), anyBoolean(), anyLong())).thenReturn(dataJson);
|
|
136
|
+
final ConfigSource src = ZendeskTestHelper.getConfigSource("non-incremental.yml");
|
|
137
|
+
loadData("data/ticket_fields.json");
|
|
119
138
|
|
|
120
139
|
ConfigDiff configDiff = zendeskInputPlugin.transaction(src, new Control());
|
|
121
|
-
|
|
122
|
-
verify(pageBuilder, times(
|
|
123
|
-
|
|
124
|
-
assertEquals("2019-02-20 07:17:34 +0000", nextStartTime);
|
|
140
|
+
// running in 2 pages
|
|
141
|
+
verify(pageBuilder, times(2)).finish();
|
|
142
|
+
Assert.assertTrue(configDiff.isEmpty());
|
|
125
143
|
}
|
|
126
144
|
|
|
127
145
|
@Test
|
|
128
|
-
public void
|
|
146
|
+
public void testRunIncrementalStoreStartTime()
|
|
129
147
|
{
|
|
130
148
|
final ConfigSource src = ZendeskTestHelper.getConfigSource("incremental.yml");
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
149
|
+
TaskReport taskReport = Exec.newTaskReport();
|
|
150
|
+
taskReport.set(ZendeskConstants.Field.START_TIME, 1557026576);
|
|
151
|
+
|
|
152
|
+
when(zendeskSupportAPIService.isSupportIncremental()).thenReturn(true);
|
|
153
|
+
when(zendeskSupportAPIService.addRecordToImporter(anyInt(), any())).thenReturn(taskReport);
|
|
136
154
|
|
|
137
155
|
ConfigDiff configDiff = zendeskInputPlugin.transaction(src, new Control());
|
|
138
156
|
String nextStartTime = configDiff.get(String.class, ZendeskConstants.Field.START_TIME);
|
|
139
|
-
verify(pageBuilder, times(1)).addRecord();
|
|
140
157
|
verify(pageBuilder, times(1)).finish();
|
|
141
|
-
assertEquals("2019-
|
|
158
|
+
assertEquals("2019-05-05 03:22:56 +0000", nextStartTime);
|
|
142
159
|
}
|
|
143
160
|
|
|
144
161
|
@Test
|
|
145
|
-
public void
|
|
162
|
+
public void testDispatchPerTargetShouldReturnSupportAPIService()
|
|
146
163
|
{
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
verify(pageBuilder, times(1)).finish();
|
|
157
|
-
assertEquals("2019-02-20 07:17:34 +0000", nextStartTime);
|
|
164
|
+
// create a new one so it doesn't mock the ZendeskService
|
|
165
|
+
zendeskInputPlugin = spy(new ZendeskInputPlugin());
|
|
166
|
+
testReturnSupportAPIService(Target.TICKETS);
|
|
167
|
+
testReturnSupportAPIService(Target.TICKET_METRICS);
|
|
168
|
+
testReturnSupportAPIService(Target.TICKET_EVENTS);
|
|
169
|
+
testReturnSupportAPIService(Target.TICKET_FORMS);
|
|
170
|
+
testReturnSupportAPIService(Target.TICKET_FIELDS);
|
|
171
|
+
testReturnSupportAPIService(Target.USERS);
|
|
172
|
+
testReturnSupportAPIService(Target.ORGANIZATIONS);
|
|
158
173
|
}
|
|
159
174
|
|
|
160
175
|
@Test
|
|
161
|
-
public void
|
|
176
|
+
public void testDispatchPerTargetShouldReturnNPSService()
|
|
162
177
|
{
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
when(zendeskSupportAPIService.getData(anyString(), anyInt(), anyBoolean(), anyLong())).thenReturn(dataJson);
|
|
168
|
-
|
|
169
|
-
ConfigDiff configDiff = zendeskInputPlugin.transaction(src, new Control());
|
|
170
|
-
String nextStartTime = configDiff.get(String.class, ZendeskConstants.Field.START_TIME);
|
|
171
|
-
verify(pageBuilder, times(3)).addRecord();
|
|
172
|
-
verify(pageBuilder, times(1)).finish();
|
|
173
|
-
assertEquals("2019-02-20 07:17:34 +0000", nextStartTime);
|
|
178
|
+
// create a new one so it doesn't mock the ZendeskService
|
|
179
|
+
zendeskInputPlugin = spy(new ZendeskInputPlugin());
|
|
180
|
+
testReturnNPSService(Target.SCORES);
|
|
181
|
+
testReturnNPSService(Target.RECIPIENTS);
|
|
174
182
|
}
|
|
175
183
|
|
|
176
184
|
@Test
|
|
177
|
-
public void
|
|
185
|
+
public void testDispatchPerTargetShouldReturnCustomObjectService()
|
|
178
186
|
{
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
when(zendeskSupportAPIService.getData(anyString(), anyInt(), anyBoolean(), anyLong()))
|
|
185
|
-
.thenReturn(dataJson)
|
|
186
|
-
.thenReturn(dataJsonObject);
|
|
187
|
+
// create a new one so it doesn't mock the ZendeskService
|
|
188
|
+
zendeskInputPlugin = spy(new ZendeskInputPlugin());
|
|
189
|
+
testReturnCustomObjectService(Target.OBJECT_RECORDS);
|
|
190
|
+
testReturnCustomObjectService(Target.RELATIONSHIP_RECORDS);
|
|
191
|
+
}
|
|
187
192
|
|
|
188
|
-
|
|
193
|
+
@Test
|
|
194
|
+
public void testDispatchPerTargetShouldReturnUserEventService()
|
|
195
|
+
{
|
|
196
|
+
// create a new one so it doesn't mock the ZendeskService
|
|
197
|
+
zendeskInputPlugin = spy(new ZendeskInputPlugin());
|
|
198
|
+
final ConfigSource src = ZendeskTestHelper.getConfigSource("base.yml");
|
|
199
|
+
src.set("target", Target.USER_EVENTS.name().toLowerCase());
|
|
200
|
+
src.set("profile_source", "dummy");
|
|
201
|
+
src.set("columns", Collections.EMPTY_LIST);
|
|
202
|
+
ZendeskInputPlugin.PluginTask task = src.loadConfig(ZendeskInputPlugin.PluginTask.class);
|
|
203
|
+
ZendeskService zendeskService = zendeskInputPlugin.dispatchPerTarget(task);
|
|
204
|
+
assertTrue(zendeskService instanceof ZendeskUserEventService);
|
|
205
|
+
}
|
|
189
206
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
207
|
+
@Test
|
|
208
|
+
public void validateCredentialOauthShouldThrowException()
|
|
209
|
+
{
|
|
210
|
+
ConfigSource configSource = ZendeskTestHelper.getConfigSource("base_validator.yml");
|
|
211
|
+
configSource.set("auth_method", "oauth");
|
|
212
|
+
configSource.remove("access_token");
|
|
213
|
+
assertValidation(configSource, "access_token is required for authentication method 'oauth'");
|
|
193
214
|
}
|
|
194
215
|
|
|
195
216
|
@Test
|
|
196
|
-
public void
|
|
217
|
+
public void validateCredentialBasicShouldThrowException()
|
|
197
218
|
{
|
|
198
|
-
|
|
199
|
-
|
|
219
|
+
ConfigSource configSource = ZendeskTestHelper.getConfigSource("base_validator.yml");
|
|
220
|
+
configSource.set("auth_method", "basic");
|
|
221
|
+
configSource.remove("username");
|
|
222
|
+
assertValidation(configSource, "username and password are required for authentication method 'basic'");
|
|
223
|
+
|
|
224
|
+
configSource.set("username", "");
|
|
225
|
+
configSource.remove("password");
|
|
226
|
+
assertValidation(configSource, "username and password are required for authentication method 'basic'");
|
|
227
|
+
}
|
|
200
228
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
229
|
+
@Test
|
|
230
|
+
public void validateCredentialTokenShouldThrowException()
|
|
231
|
+
{
|
|
232
|
+
ConfigSource configSource = ZendeskTestHelper.getConfigSource("base_validator.yml");
|
|
233
|
+
configSource.set("auth_method", "token");
|
|
234
|
+
configSource.remove("token");
|
|
235
|
+
assertValidation(configSource, "username and token are required for authentication method 'token'");
|
|
236
|
+
|
|
237
|
+
configSource.set("token", "");
|
|
238
|
+
configSource.remove("username");
|
|
239
|
+
assertValidation(configSource, "username and token are required for authentication method 'token'");
|
|
206
240
|
}
|
|
207
241
|
|
|
208
242
|
@Test
|
|
209
|
-
public void
|
|
243
|
+
public void validateAppMarketPlaceShouldThrowException()
|
|
210
244
|
{
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
245
|
+
ConfigSource configSource = ZendeskTestHelper.getConfigSource("base_validator.yml");
|
|
246
|
+
configSource.remove("app_marketplace_integration_name");
|
|
247
|
+
assertValidation(configSource, "All of app_marketplace_integration_name, app_marketplace_org_id, " +
|
|
248
|
+
"app_marketplace_app_id " +
|
|
249
|
+
"are required to fill out for Apps Marketplace API header");
|
|
250
|
+
}
|
|
214
251
|
|
|
215
|
-
|
|
252
|
+
@Test
|
|
253
|
+
public void validateCustomObjectShouldThrowException()
|
|
254
|
+
{
|
|
255
|
+
ConfigSource configSource = ZendeskTestHelper.getConfigSource("base_validator.yml");
|
|
256
|
+
configSource.set("target", Target.OBJECT_RECORDS.name().toLowerCase());
|
|
257
|
+
assertValidation(configSource, "Should have at least one Object Type");
|
|
216
258
|
|
|
217
|
-
|
|
259
|
+
configSource.set("target", Target.RELATIONSHIP_RECORDS.name().toLowerCase());
|
|
260
|
+
assertValidation(configSource, "Should have at least one Relationship Type");
|
|
218
261
|
}
|
|
219
262
|
|
|
220
263
|
@Test
|
|
221
|
-
public void
|
|
264
|
+
public void validateUserEventShouldThrowException()
|
|
222
265
|
{
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
266
|
+
ConfigSource configSource = ZendeskTestHelper.getConfigSource("base_validator.yml");
|
|
267
|
+
configSource.set("target", Target.USER_EVENTS.name().toLowerCase());
|
|
268
|
+
assertValidation(configSource, "Profile Source is required for User Event Target");
|
|
269
|
+
|
|
270
|
+
configSource.set("profile_source", "");
|
|
271
|
+
configSource.set("start_time", OffsetDateTime.ofInstant(Instant.ofEpochSecond(Instant.now().getEpochSecond()), ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT));
|
|
272
|
+
configSource.set("end_time", "2019-12-2 22-12-22");
|
|
273
|
+
assertValidation(configSource, "End Time should follow these format " + ZendeskConstants.Misc.SUPPORT_DATE_TIME_FORMAT.toString());
|
|
274
|
+
|
|
275
|
+
configSource.set("start_time", OffsetDateTime.ofInstant(Instant.ofEpochSecond(Instant.now().getEpochSecond() + 3600), ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT));
|
|
276
|
+
configSource.set("end_time", OffsetDateTime.ofInstant(Instant.ofEpochSecond(Instant.now().getEpochSecond()), ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT));
|
|
277
|
+
assertValidation(configSource, "End Time should be later or equal than Start Time");
|
|
278
|
+
}
|
|
228
279
|
|
|
229
|
-
|
|
280
|
+
private void assertValidation(final ConfigSource configSource, final String message)
|
|
281
|
+
{
|
|
282
|
+
try {
|
|
283
|
+
zendeskInputPlugin.guess(configSource);
|
|
284
|
+
fail("Should not reach here");
|
|
285
|
+
}
|
|
286
|
+
catch (final Exception e) {
|
|
287
|
+
assertEquals(message, e.getMessage());
|
|
288
|
+
}
|
|
230
289
|
}
|
|
231
290
|
|
|
232
|
-
|
|
233
|
-
public void testRunIncrementalGenerateStartTimeWhenRunningInIncrementalModeAndTargetSupportIncremental()
|
|
291
|
+
private void testReturnSupportAPIService(Target target)
|
|
234
292
|
{
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
293
|
+
final ConfigSource src = ZendeskTestHelper.getConfigSource("base.yml");
|
|
294
|
+
src.set("target", target.name().toLowerCase());
|
|
295
|
+
src.set("columns", Collections.EMPTY_LIST);
|
|
296
|
+
ZendeskInputPlugin.PluginTask task = src.loadConfig(ZendeskInputPlugin.PluginTask.class);
|
|
297
|
+
ZendeskService zendeskService = zendeskInputPlugin.dispatchPerTarget(task);
|
|
298
|
+
assertTrue(zendeskService instanceof ZendeskSupportAPIService);
|
|
299
|
+
}
|
|
238
300
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
301
|
+
private void testReturnNPSService(Target target)
|
|
302
|
+
{
|
|
303
|
+
final ConfigSource src = ZendeskTestHelper.getConfigSource("base.yml");
|
|
304
|
+
src.set("target", target.name().toLowerCase());
|
|
305
|
+
src.set("columns", Collections.EMPTY_LIST);
|
|
306
|
+
ZendeskInputPlugin.PluginTask task = src.loadConfig(ZendeskInputPlugin.PluginTask.class);
|
|
307
|
+
ZendeskService zendeskService = zendeskInputPlugin.dispatchPerTarget(task);
|
|
308
|
+
assertTrue(zendeskService instanceof ZendeskNPSService);
|
|
242
309
|
}
|
|
243
310
|
|
|
244
|
-
private
|
|
311
|
+
private void testReturnCustomObjectService(Target target)
|
|
245
312
|
{
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
313
|
+
final ConfigSource src = ZendeskTestHelper.getConfigSource("base.yml");
|
|
314
|
+
src.set("target", target.name().toLowerCase());
|
|
315
|
+
src.set("relationship_types", Collections.singletonList("dummy"));
|
|
316
|
+
src.set("object_types", Collections.singletonList("account"));
|
|
317
|
+
src.set("columns", Collections.EMPTY_LIST);
|
|
318
|
+
ZendeskInputPlugin.PluginTask task = src.loadConfig(ZendeskInputPlugin.PluginTask.class);
|
|
319
|
+
ZendeskService zendeskService = zendeskInputPlugin.dispatchPerTarget(task);
|
|
320
|
+
assertTrue(zendeskService instanceof ZendeskCustomObjectService);
|
|
254
321
|
}
|
|
255
322
|
|
|
256
323
|
private void loadData(String fileName)
|
|
257
324
|
{
|
|
258
325
|
JsonNode dataJson = ZendeskTestHelper.getJsonFromFile(fileName);
|
|
259
|
-
when(zendeskSupportAPIService.
|
|
326
|
+
when(zendeskSupportAPIService.getDataFromPath(anyString(), anyInt(), anyBoolean(), anyLong())).thenReturn(dataJson);
|
|
260
327
|
}
|
|
261
328
|
|
|
262
329
|
private void setupTestGuessGenerateColumn(ConfigSource src, String fileName, String expectedSource)
|
|
@@ -266,4 +333,22 @@ public class TestZendeskInputPlugin
|
|
|
266
333
|
JsonNode columns = configDiff.get(JsonNode.class, "columns");
|
|
267
334
|
assertEquals(ZendeskTestHelper.getJsonFromFile(expectedSource), columns);
|
|
268
335
|
}
|
|
336
|
+
|
|
337
|
+
private void setupSupportAPIService()
|
|
338
|
+
{
|
|
339
|
+
zendeskSupportAPIService = mock(ZendeskSupportAPIService.class);
|
|
340
|
+
doReturn(zendeskSupportAPIService).when(zendeskInputPlugin).dispatchPerTarget(any(ZendeskInputPlugin.PluginTask.class));
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
private class Control implements InputPlugin.Control
|
|
344
|
+
{
|
|
345
|
+
@Override
|
|
346
|
+
public List<TaskReport> run(final TaskSource taskSource, final Schema schema, final int taskCount)
|
|
347
|
+
{
|
|
348
|
+
List<TaskReport> reports = IntStream.range(0, taskCount)
|
|
349
|
+
.mapToObj(i -> zendeskInputPlugin.run(taskSource, schema, i, output))
|
|
350
|
+
.collect(Collectors.toList());
|
|
351
|
+
return reports;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
269
354
|
}
|
|
@@ -10,27 +10,19 @@ import org.apache.http.client.HttpClient;
|
|
|
10
10
|
import org.apache.http.client.methods.HttpRequestBase;
|
|
11
11
|
import org.apache.http.entity.StringEntity;
|
|
12
12
|
|
|
13
|
+
import org.embulk.EmbulkTestRuntime;
|
|
13
14
|
import org.embulk.config.ConfigException;
|
|
14
15
|
import org.embulk.config.ConfigSource;
|
|
15
|
-
import org.embulk.input.zendesk.ZendeskInputPlugin;
|
|
16
16
|
import org.embulk.input.zendesk.ZendeskInputPlugin.PluginTask;
|
|
17
|
-
import org.embulk.input.zendesk.utils.ZendeskPluginTestRuntime;
|
|
18
17
|
import org.embulk.input.zendesk.utils.ZendeskTestHelper;
|
|
19
18
|
|
|
20
19
|
import org.embulk.input.zendesk.utils.ZendeskUtils;
|
|
21
|
-
import org.embulk.spi.InputPlugin;
|
|
22
|
-
import org.embulk.test.TestingEmbulk;
|
|
23
20
|
|
|
24
21
|
import org.junit.Before;
|
|
25
22
|
import org.junit.Rule;
|
|
26
23
|
import org.junit.Test;
|
|
27
24
|
|
|
28
|
-
import org.junit.rules.ExpectedException;
|
|
29
|
-
import org.junit.rules.RuleChain;
|
|
30
|
-
import org.junit.rules.TestRule;
|
|
31
|
-
|
|
32
25
|
import org.mockito.ArgumentCaptor;
|
|
33
|
-
import org.mockito.Mockito;
|
|
34
26
|
|
|
35
27
|
import static org.apache.http.HttpHeaders.AUTHORIZATION;
|
|
36
28
|
import static org.junit.Assert.assertEquals;
|
|
@@ -49,24 +41,18 @@ import java.util.Optional;
|
|
|
49
41
|
|
|
50
42
|
public class TestZendeskRestClient
|
|
51
43
|
{
|
|
52
|
-
private final ExpectedException thrown = ExpectedException.none();
|
|
53
|
-
private final TestingEmbulk embulk = TestingEmbulk.builder()
|
|
54
|
-
.registerPlugin(InputPlugin.class, "zendesk", ZendeskInputPlugin.class)
|
|
55
|
-
.build();
|
|
56
|
-
public ZendeskPluginTestRuntime runtime = new ZendeskPluginTestRuntime();
|
|
57
|
-
|
|
58
|
-
@Rule
|
|
59
44
|
@SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
|
|
60
|
-
|
|
45
|
+
@Rule
|
|
46
|
+
public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
|
|
61
47
|
|
|
62
48
|
private ZendeskRestClient zendeskRestClient;
|
|
63
49
|
private PluginTask task = ZendeskTestHelper.getConfigSource("incremental.yml").loadConfig(PluginTask.class);
|
|
64
50
|
private JsonNode data = ZendeskTestHelper.getJsonFromFile("data/client.json");
|
|
65
51
|
|
|
66
|
-
private HttpClient client =
|
|
67
|
-
private HttpResponse response =
|
|
52
|
+
private HttpClient client = mock(HttpClient.class);
|
|
53
|
+
private HttpResponse response = mock(HttpResponse.class);
|
|
68
54
|
private Header header = mock(Header.class);
|
|
69
|
-
private StatusLine statusLine =
|
|
55
|
+
private StatusLine statusLine = mock(StatusLine.class);
|
|
70
56
|
|
|
71
57
|
@Before
|
|
72
58
|
public void prepare() throws IOException
|