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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/README.md +32 -2
  4. data/build.gradle +1 -1
  5. data/src/main/java/org/embulk/input/zendesk/RecordImporter.java +134 -0
  6. data/src/main/java/org/embulk/input/zendesk/ZendeskInputPlugin.java +182 -202
  7. data/src/main/java/org/embulk/input/zendesk/clients/ZendeskRestClient.java +54 -52
  8. data/src/main/java/org/embulk/input/zendesk/models/Target.java +3 -3
  9. data/src/main/java/org/embulk/input/zendesk/models/ZendeskException.java +1 -1
  10. data/src/main/java/org/embulk/input/zendesk/services/ZendeskCustomObjectService.java +110 -0
  11. data/src/main/java/org/embulk/input/zendesk/services/ZendeskNPSService.java +30 -0
  12. data/src/main/java/org/embulk/input/zendesk/services/ZendeskNormalServices.java +239 -0
  13. data/src/main/java/org/embulk/input/zendesk/services/ZendeskService.java +14 -0
  14. data/src/main/java/org/embulk/input/zendesk/services/ZendeskSupportAPIService.java +25 -83
  15. data/src/main/java/org/embulk/input/zendesk/services/ZendeskUserEventService.java +158 -0
  16. data/src/main/java/org/embulk/input/zendesk/stream/PagingSpliterator.java +40 -0
  17. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/CustomObjectSpliterator.java +42 -0
  18. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/SunshineSpliterator.java +66 -0
  19. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/UserEventSpliterator.java +35 -0
  20. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/OrganizationSpliterator.java +13 -0
  21. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/SupportSpliterator.java +44 -0
  22. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/UserSpliterator.java +13 -0
  23. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java +13 -1
  24. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskDateUtils.java +22 -11
  25. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskUtils.java +52 -114
  26. data/src/test/java/org/embulk/input/zendesk/TestRecordImporter.java +114 -0
  27. data/src/test/java/org/embulk/input/zendesk/TestZendeskInputPlugin.java +184 -99
  28. data/src/test/java/org/embulk/input/zendesk/clients/TestZendeskRestClient.java +6 -20
  29. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskCustomObjectService.java +161 -0
  30. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskNPSService.java +56 -0
  31. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskNormalService.java +189 -0
  32. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskSupportAPIService.java +18 -60
  33. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskUserEventService.java +158 -0
  34. data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskDateUtils.java +50 -2
  35. data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskUtil.java +0 -138
  36. data/src/test/java/org/embulk/input/zendesk/utils/ZendeskTestHelper.java +16 -0
  37. data/src/test/resources/config/nps.yml +29 -0
  38. data/src/test/resources/config/object_records.yml +24 -0
  39. data/src/test/resources/config/relationship_records.yml +23 -0
  40. data/src/test/resources/config/user_events.yml +29 -0
  41. data/src/test/resources/data/duplicate_user.json +0 -0
  42. data/src/test/resources/data/empty_result.json +7 -0
  43. data/src/test/resources/data/expected/user_events_column.json +40 -0
  44. data/src/test/resources/data/object_records.json +30 -0
  45. data/src/test/resources/data/organization.json +39 -0
  46. data/src/test/resources/data/relationship_records.json +57 -0
  47. data/src/test/resources/data/scores.json +21 -0
  48. data/src/test/resources/data/scores_share_same_time_with_next_page.json +35 -0
  49. data/src/test/resources/data/scores_share_same_time_without_next_page.json +35 -0
  50. data/src/test/resources/data/simple_organization.json +23 -0
  51. data/src/test/resources/data/simple_user.json +50 -0
  52. data/src/test/resources/data/simple_user_event.json +19 -0
  53. data/src/test/resources/data/ticket_events_share_same_time_with_next_page.json +279 -0
  54. data/src/test/resources/data/ticket_events_share_same_time_without_next_page.json +279 -0
  55. data/src/test/resources/data/ticket_events_updated_by_system_records.json +279 -0
  56. data/src/test/resources/data/ticket_share_same_time_with_next_page.json +232 -0
  57. data/src/test/resources/data/ticket_share_same_time_without_next_page.json +232 -0
  58. data/src/test/resources/data/ticket_with_updated_by_system_records.json +187 -0
  59. data/src/test/resources/data/user_event.json +19 -0
  60. data/src/test/resources/data/user_event_contain_latter_create_at.json +19 -0
  61. data/src/test/resources/data/user_event_multiple.json +33 -0
  62. metadata +46 -5
  63. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskValidatorUtils.java +0 -79
  64. data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskValidatorUtils.java +0 -130
@@ -0,0 +1,161 @@
1
+ package org.embulk.input.zendesk.services;
2
+
3
+ import com.fasterxml.jackson.databind.JsonNode;
4
+ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
5
+ import org.embulk.EmbulkTestRuntime;
6
+
7
+ import org.embulk.config.TaskReport;
8
+ import org.embulk.input.zendesk.RecordImporter;
9
+ import org.embulk.input.zendesk.ZendeskInputPlugin;
10
+ import org.embulk.input.zendesk.clients.ZendeskRestClient;
11
+ import org.embulk.input.zendesk.utils.ZendeskTestHelper;
12
+ import org.junit.Assert;
13
+ import org.junit.Before;
14
+ import org.junit.Rule;
15
+ import org.junit.Test;
16
+ import org.mockito.ArgumentCaptor;
17
+
18
+ import java.util.Arrays;
19
+ import java.util.List;
20
+
21
+ import static org.junit.Assert.assertEquals;
22
+ import static org.junit.Assert.assertFalse;
23
+ import static org.junit.Assert.assertTrue;
24
+ import static org.mockito.ArgumentMatchers.any;
25
+ import static org.mockito.ArgumentMatchers.anyBoolean;
26
+ import static org.mockito.Mockito.atMost;
27
+ import static org.mockito.Mockito.mock;
28
+ import static org.mockito.Mockito.spy;
29
+ import static org.mockito.Mockito.times;
30
+ import static org.mockito.Mockito.verify;
31
+ import static org.mockito.Mockito.when;
32
+
33
+ public class TestZendeskCustomObjectService
34
+ {
35
+ @Rule
36
+ @SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
37
+ public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
38
+
39
+ private ZendeskRestClient zendeskRestClient;
40
+
41
+ private ZendeskCustomObjectService zendeskCustomObjectService;
42
+
43
+ private RecordImporter recordImporter;
44
+
45
+ @Before
46
+ public void prepare()
47
+ {
48
+ zendeskRestClient = mock(ZendeskRestClient.class);
49
+ recordImporter = mock(RecordImporter.class);
50
+ }
51
+
52
+ @Test
53
+ public void testGetListPathForObjectRecord()
54
+ {
55
+ setup("object_records.yml");
56
+ List<String> expectedStrings = Arrays.asList(
57
+ "https://abc.zendesk.com/api/sunshine/objects/records?type=account&per_page=1000",
58
+ "https://abc.zendesk.com/api/sunshine/objects/records?type=user&per_page=1000"
59
+ );
60
+
61
+ zendeskCustomObjectService.addRecordToImporter(0, recordImporter);
62
+ final ArgumentCaptor<String> actualString = ArgumentCaptor.forClass(String.class);
63
+ verify(zendeskRestClient, times(2)).doGet(actualString.capture(), any(), anyBoolean());
64
+ assertTrue(actualString.getAllValues().contains(expectedStrings.get(0)));
65
+ assertTrue(actualString.getAllValues().contains(expectedStrings.get(1)));
66
+ }
67
+
68
+ @Test
69
+ public void testGetListPathForRelationshipRecord()
70
+ {
71
+ setup("relationship_records.yml");
72
+ String expectedStrings = "https://abc.zendesk.com/api/sunshine/relationships/records?type=ticket_to_account&per_page=1000";
73
+ zendeskCustomObjectService.addRecordToImporter(0, recordImporter);
74
+ final ArgumentCaptor<String> actualString = ArgumentCaptor.forClass(String.class);
75
+ verify(zendeskRestClient).doGet(actualString.capture(), any(), anyBoolean());
76
+ assertEquals(expectedStrings, actualString.getValue());
77
+ }
78
+
79
+ @Test
80
+ public void testAddRecordToImporterObjectRecord()
81
+ {
82
+ ZendeskTestHelper.setPreviewMode(runtime, false);
83
+ setup("object_records.yml");
84
+ loadData("data/object_records.json");
85
+ zendeskCustomObjectService.addRecordToImporter(0, recordImporter);
86
+ // 2 types - each type 2 records
87
+ verify(recordImporter, times(4)).addRecord(any());
88
+ }
89
+
90
+ @Test
91
+ public void testAddRecordToImporterRelationShipRecord()
92
+ {
93
+ ZendeskTestHelper.setPreviewMode(runtime, false);
94
+ setup("relationship_records.yml");
95
+ loadData("data/relationship_records.json");
96
+ zendeskCustomObjectService.addRecordToImporter(0, recordImporter);
97
+ // 7 records
98
+ verify(recordImporter, times(7)).addRecord(any());
99
+ }
100
+
101
+ @Test
102
+ public void testGetData()
103
+ {
104
+ setup("object_records.yml");
105
+ loadData("data/object_records.json");
106
+ JsonNode jsonNode = zendeskCustomObjectService.getDataFromPath("https://abc.zendesk.com/api/sunshine/objects/records?type=user&per_page=1000", 0, true, 0);
107
+ assertFalse(jsonNode.isNull());
108
+ assertTrue(jsonNode.has("data"));
109
+ assertTrue(jsonNode.get("data").isArray());
110
+
111
+ setup("relationship_records.yml");
112
+ loadData("data/relationship_records.json");
113
+ jsonNode = zendeskCustomObjectService.getDataFromPath("https://abc.zendesk.com/api/sunshine/relationships/records?type=user&per_page=1000", 0, true, 0);
114
+ assertFalse(jsonNode.isNull());
115
+ assertTrue(jsonNode.has("data"));
116
+ assertTrue(jsonNode.get("data").isArray());
117
+ }
118
+
119
+ @Test
120
+ public void testAddRecordToImporterInPreviewObjectRecord()
121
+ {
122
+ ZendeskTestHelper.setPreviewMode(runtime, true);
123
+ setup("object_records.yml");
124
+ loadData("data/object_records.json");
125
+ TaskReport taskReport = zendeskCustomObjectService.addRecordToImporter(0, recordImporter);
126
+
127
+ // expect to be break and don't import all records
128
+ verify(recordImporter, atMost(3)).addRecord(any());
129
+ Assert.assertTrue(taskReport.isEmpty());
130
+ }
131
+
132
+ @Test
133
+ public void testAddRecordToImporterInPreviewRelationshipRecord()
134
+ {
135
+ ZendeskTestHelper.setPreviewMode(runtime, true);
136
+ setup("relationship_records.yml");
137
+ loadData("data/relationship_records.json");
138
+ TaskReport taskReport = zendeskCustomObjectService.addRecordToImporter(0, recordImporter);
139
+ // 1 type contain data and break
140
+ verify(recordImporter, times(1)).addRecord(any());
141
+ Assert.assertTrue(taskReport.isEmpty());
142
+ }
143
+
144
+ private void loadData(String fileName)
145
+ {
146
+ JsonNode dataJson = ZendeskTestHelper.getJsonFromFile(fileName);
147
+ when(zendeskRestClient.doGet(any(), any(), anyBoolean())).thenReturn(dataJson.toString());
148
+ }
149
+
150
+ private void setupZendeskSupportAPIService(ZendeskInputPlugin.PluginTask task)
151
+ {
152
+ zendeskCustomObjectService = spy(new ZendeskCustomObjectService(task));
153
+ when(zendeskCustomObjectService.getZendeskRestClient()).thenReturn(zendeskRestClient);
154
+ }
155
+
156
+ private void setup(String file)
157
+ {
158
+ ZendeskInputPlugin.PluginTask task = ZendeskTestHelper.getConfigSource(file).loadConfig(ZendeskInputPlugin.PluginTask.class);
159
+ setupZendeskSupportAPIService(task);
160
+ }
161
+ }
@@ -0,0 +1,56 @@
1
+ package org.embulk.input.zendesk.services;
2
+
3
+ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
4
+ import org.embulk.EmbulkTestRuntime;
5
+ import org.embulk.input.zendesk.ZendeskInputPlugin;
6
+ import org.embulk.input.zendesk.clients.ZendeskRestClient;
7
+ import org.embulk.input.zendesk.utils.ZendeskTestHelper;
8
+ import org.junit.Before;
9
+ import org.junit.Rule;
10
+ import org.junit.Test;
11
+
12
+ import static org.junit.Assert.assertEquals;
13
+ import static org.mockito.Mockito.mock;
14
+ import static org.mockito.Mockito.spy;
15
+
16
+ import static org.mockito.Mockito.when;
17
+
18
+ public class TestZendeskNPSService
19
+ {
20
+ @Rule
21
+ @SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
22
+ public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
23
+
24
+ private ZendeskRestClient zendeskRestClient;
25
+
26
+ private ZendeskNPSService zendeskNPSService;
27
+
28
+ @Before
29
+ public void prepare()
30
+ {
31
+ zendeskRestClient = mock(ZendeskRestClient.class);
32
+ }
33
+
34
+ @Test
35
+ public void testBuildURL()
36
+ {
37
+ setup();
38
+ String expectedString = "https://abc.zendesk.com/api/v2/nps/incremental/responses.json?start_time=10000";
39
+ // only use start_time so page any value
40
+ String actualString = zendeskNPSService.buildURI(0, 10000);
41
+ assertEquals(expectedString, actualString);
42
+ }
43
+
44
+ private void setupZendeskNPSService(ZendeskInputPlugin.PluginTask task)
45
+ {
46
+ zendeskNPSService = spy(new ZendeskNPSService(task));
47
+ when(zendeskNPSService.getZendeskRestClient()).thenReturn(zendeskRestClient);
48
+ }
49
+
50
+ private void setup()
51
+ {
52
+ ZendeskInputPlugin.PluginTask task = ZendeskTestHelper.getConfigSource("nps.yml")
53
+ .loadConfig(ZendeskInputPlugin.PluginTask.class);
54
+ setupZendeskNPSService(task);
55
+ }
56
+ }
@@ -0,0 +1,189 @@
1
+ package org.embulk.input.zendesk.services;
2
+
3
+ import com.fasterxml.jackson.databind.JsonNode;
4
+ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
5
+ import org.embulk.EmbulkTestRuntime;
6
+ import org.embulk.config.ConfigSource;
7
+ import org.embulk.config.TaskReport;
8
+ import org.embulk.input.zendesk.RecordImporter;
9
+ import org.embulk.input.zendesk.ZendeskInputPlugin;
10
+ import org.embulk.input.zendesk.clients.ZendeskRestClient;
11
+ import org.embulk.input.zendesk.models.Target;
12
+ import org.embulk.input.zendesk.utils.ZendeskConstants;
13
+ import org.embulk.input.zendesk.utils.ZendeskTestHelper;
14
+ import org.junit.Assert;
15
+ import org.junit.Before;
16
+ import org.junit.Rule;
17
+ import org.junit.Test;
18
+ import org.mockito.ArgumentCaptor;
19
+
20
+ import java.time.Instant;
21
+
22
+ import static org.junit.Assert.assertEquals;
23
+ import static org.mockito.ArgumentMatchers.any;
24
+ import static org.mockito.ArgumentMatchers.anyBoolean;
25
+ import static org.mockito.Mockito.mock;
26
+ import static org.mockito.Mockito.spy;
27
+ import static org.mockito.Mockito.times;
28
+ import static org.mockito.Mockito.verify;
29
+ import static org.mockito.Mockito.when;
30
+
31
+ public class TestZendeskNormalService
32
+ {
33
+ @Rule
34
+ @SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
35
+ public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
36
+
37
+ private ZendeskRestClient zendeskRestClient;
38
+
39
+ private ZendeskSupportAPIService zendeskSupportAPIService;
40
+
41
+ private RecordImporter recordImporter;
42
+
43
+ @Before
44
+ public void prepare()
45
+ {
46
+ zendeskRestClient = mock(ZendeskRestClient.class);
47
+ recordImporter = mock(RecordImporter.class);
48
+ }
49
+
50
+ @Test
51
+ public void testAddRecordToImporterWithIncremental()
52
+ {
53
+ setupSupportAPIService("incremental.yml");
54
+ loadData("data/tickets.json");
55
+
56
+ TaskReport taskReport = zendeskSupportAPIService.addRecordToImporter(0, recordImporter);
57
+ verify(recordImporter, times(4)).addRecord(any());
58
+ Assert.assertFalse(taskReport.isEmpty());
59
+ Assert.assertEquals(1550647054, taskReport.get(JsonNode.class, ZendeskConstants.Field.START_TIME).asLong());
60
+ }
61
+
62
+ @Test
63
+ public void testAddRecordToImporterWithIncrementalAndWithoutDedup()
64
+ {
65
+ ConfigSource src = ZendeskTestHelper.getConfigSource("incremental.yml");
66
+ src.set("dedup", false);
67
+ ZendeskInputPlugin.PluginTask task = src.loadConfig(ZendeskInputPlugin.PluginTask.class);
68
+ setupZendeskSupportAPIService(task);
69
+ loadData("data/tickets.json");
70
+
71
+ TaskReport taskReport = zendeskSupportAPIService.addRecordToImporter(0, recordImporter);
72
+ verify(recordImporter, times(5)).addRecord(any());
73
+ Assert.assertFalse(taskReport.isEmpty());
74
+ Assert.assertEquals(1550647054, taskReport.get(JsonNode.class, ZendeskConstants.Field.START_TIME).asLong());
75
+ }
76
+
77
+ @Test
78
+ public void testAddRecordToImporterIncrementalContainUpdatedBySystemRecords()
79
+ {
80
+ setupSupportAPIService("incremental.yml");
81
+ loadData("data/ticket_with_updated_by_system_records.json");
82
+
83
+ TaskReport taskReport = zendeskSupportAPIService.addRecordToImporter(0, recordImporter);
84
+ verify(recordImporter, times(3)).addRecord(any());
85
+ Assert.assertFalse(taskReport.isEmpty());
86
+ Assert.assertEquals(1550647054, taskReport.get(JsonNode.class, ZendeskConstants.Field.START_TIME).asLong());
87
+ }
88
+
89
+ @Test
90
+ public void testAddRecordToImporterIncrementalUpdateStartTimeWhenEmptyResult()
91
+ {
92
+ ConfigSource src = ZendeskTestHelper.getConfigSource("incremental.yml");
93
+ src.set("target", Target.TICKETS.toString());
94
+
95
+ src.set("start_time", "2219-02-20T06:52:00Z");
96
+ ZendeskInputPlugin.PluginTask task = src.loadConfig(ZendeskInputPlugin.PluginTask.class);
97
+ setupZendeskSupportAPIService(task);
98
+ loadData("data/empty_result.json");
99
+
100
+ TaskReport taskReport = zendeskSupportAPIService.addRecordToImporter(0, recordImporter);
101
+ Assert.assertFalse(taskReport.isEmpty());
102
+ Assert.assertTrue(Instant.now().getEpochSecond() <= taskReport.get(JsonNode.class, ZendeskConstants.Field.START_TIME).asLong() + 50);
103
+ }
104
+
105
+ @Test
106
+ public void testAddRecordToImporterNonIncremental()
107
+ {
108
+ setupSupportAPIService("non-incremental.yml");
109
+ loadData("data/ticket_fields.json");
110
+
111
+ TaskReport taskReport = zendeskSupportAPIService.addRecordToImporter(0, recordImporter);
112
+ verify(recordImporter, times(7)).addRecord(any());
113
+ Assert.assertTrue(taskReport.isEmpty());
114
+ }
115
+
116
+ @Test
117
+ public void testAddRecordToImporterIncrementalForSupportAndAllRecordsShareTheSameTime()
118
+ {
119
+ setupSupportAPIService("incremental.yml");
120
+ loadData("data/ticket_share_same_time_without_next_page.json");
121
+
122
+ TaskReport taskReport = zendeskSupportAPIService.addRecordToImporter(0, recordImporter);
123
+ verify(recordImporter, times(4)).addRecord(any());
124
+ // api_end_time of ticket_share_same_time_without_next_page.json + 1
125
+ Assert.assertEquals(1551419520, taskReport.get(JsonNode.class, ZendeskConstants.Field.START_TIME).asLong());
126
+ }
127
+
128
+ @Test
129
+ public void testTicketEventsAddRecordToImporterIncrementalWithNextPageAndAllRecordsShareTheSameTime()
130
+ {
131
+ // api_end_time of ticket_events_share_same_time_with_next_page.json
132
+ String expectedURL = "https://abc.zendesk.com/api/v2/incremental/ticket_events.json?start_time=1550645443";
133
+ setupSupportAPIService("incremental.yml");
134
+ ZendeskInputPlugin.PluginTask task = ZendeskTestHelper.getConfigSource("incremental.yml")
135
+ .set("target", "ticket_events")
136
+ .loadConfig(ZendeskInputPlugin.PluginTask.class);
137
+ setupZendeskSupportAPIService(task);
138
+
139
+ JsonNode dataJson = ZendeskTestHelper.getJsonFromFile("data/ticket_events_share_same_time_with_next_page.json");
140
+ JsonNode dataJsonNext = ZendeskTestHelper.getJsonFromFile("data/ticket_events_updated_by_system_records.json");
141
+ when(zendeskRestClient.doGet(any(), any(), anyBoolean()))
142
+ .thenReturn(dataJson.toString())
143
+ .thenReturn(dataJsonNext.toString());
144
+
145
+ TaskReport taskReport = zendeskSupportAPIService.addRecordToImporter(0, recordImporter);
146
+ final ArgumentCaptor<String> url = ArgumentCaptor.forClass(String.class);
147
+ verify(zendeskRestClient, times(2)).doGet(url.capture(), any(), anyBoolean());
148
+ assertEquals(expectedURL, url.getValue());
149
+
150
+ verify(recordImporter, times(4)).addRecord(any());
151
+ // api_end_time of ticket_events_updated_by_system_records.json + 1
152
+ Assert.assertEquals(1550645523, taskReport.get(JsonNode.class, ZendeskConstants.Field.START_TIME).asLong());
153
+ }
154
+
155
+ @Test
156
+ public void testTicketEventsAddRecordToImporterIncrementaAndAllRecordsShareTheSameTime()
157
+ {
158
+ setupSupportAPIService("incremental.yml");
159
+ ZendeskInputPlugin.PluginTask task = ZendeskTestHelper.getConfigSource("incremental.yml")
160
+ .set("target", "ticket_events")
161
+ .loadConfig(ZendeskInputPlugin.PluginTask.class);
162
+ setupZendeskSupportAPIService(task);
163
+ loadData("data/ticket_events_share_same_time_without_next_page.json");
164
+
165
+ TaskReport taskReport = zendeskSupportAPIService.addRecordToImporter(0, recordImporter);
166
+ verify(recordImporter, times(4)).addRecord(any());
167
+ // api_end_time of ticket_events_share_same_time_without_next_page.json + 1
168
+ Assert.assertEquals(1550645444, taskReport.get(JsonNode.class, ZendeskConstants.Field.START_TIME).asLong());
169
+ }
170
+
171
+ private void setupSupportAPIService(String file)
172
+ {
173
+ ZendeskInputPlugin.PluginTask task = ZendeskTestHelper.getConfigSource(file)
174
+ .loadConfig(ZendeskInputPlugin.PluginTask.class);
175
+ setupZendeskSupportAPIService(task);
176
+ }
177
+
178
+ private void loadData(String fileName)
179
+ {
180
+ JsonNode dataJson = ZendeskTestHelper.getJsonFromFile(fileName);
181
+ when(zendeskRestClient.doGet(any(), any(), anyBoolean())).thenReturn(dataJson.toString());
182
+ }
183
+
184
+ private void setupZendeskSupportAPIService(ZendeskInputPlugin.PluginTask task)
185
+ {
186
+ zendeskSupportAPIService = spy(new ZendeskSupportAPIService(task));
187
+ when(zendeskSupportAPIService.getZendeskRestClient()).thenReturn(zendeskRestClient);
188
+ }
189
+ }
@@ -10,14 +10,12 @@ import org.embulk.input.zendesk.utils.ZendeskTestHelper;
10
10
  import org.junit.Before;
11
11
  import org.junit.Rule;
12
12
  import org.junit.Test;
13
- import org.mockito.ArgumentCaptor;
14
13
 
15
14
  import static org.junit.Assert.assertEquals;
16
15
  import static org.mockito.ArgumentMatchers.any;
17
16
  import static org.mockito.ArgumentMatchers.anyBoolean;
18
17
  import static org.mockito.Mockito.mock;
19
18
  import static org.mockito.Mockito.spy;
20
- import static org.mockito.Mockito.verify;
21
19
  import static org.mockito.Mockito.when;
22
20
 
23
21
  import java.util.Collections;
@@ -39,25 +37,17 @@ public class TestZendeskSupportAPIService
39
37
  }
40
38
 
41
39
  @Test
42
- public void buildPathWithIncrementalForPreview()
40
+ public void testBuildPathWithIncremental()
43
41
  {
44
42
  String expectURL = "https://abc.zendesk.com/api/v2/incremental/tickets.json?start_time=0";
45
43
  setup("incremental.yml");
46
44
  loadData("data/tickets.json");
47
- setupTestAndVerifyURL(expectURL, 0, true);
45
+ String url = zendeskSupportAPIService.buildURI(0, 0);
46
+ assertEquals(expectURL, url);
48
47
  }
49
48
 
50
49
  @Test
51
- public void buildPathWithNonIncrementalForPreview()
52
- {
53
- String expectURL = "https://abc.zendesk.com/api/v2/ticket_fields.json?sort_by=id&per_page=100&page=0";
54
- setup("non-incremental.yml");
55
- loadData("data/ticket_fields.json");
56
- setupTestAndVerifyURL(expectURL, 0, true);
57
- }
58
-
59
- @Test
60
- public void buildPathWithIncrementalForPreviewWithTicketMetrics()
50
+ public void testBuildPathWithIncrementalWithTicketMetrics()
61
51
  {
62
52
  String expectURL = "https://abc.zendesk.com/api/v2/incremental/tickets.json?start_time=0&include=metric_sets";
63
53
  loadData("data/ticket_metrics.json");
@@ -67,34 +57,12 @@ public class TestZendeskSupportAPIService
67
57
  ZendeskInputPlugin.PluginTask task = src.loadConfig(ZendeskInputPlugin.PluginTask.class);
68
58
  setupZendeskSupportAPIService(task);
69
59
 
70
- setupTestAndVerifyURL(expectURL, 0, true);
60
+ String url = zendeskSupportAPIService.buildURI(0, 0);
61
+ assertEquals(expectURL, url);
71
62
  }
72
63
 
73
64
  @Test
74
- public void buildPathWithIncrementalForRun()
75
- {
76
- String expectURL = "https://abc.zendesk.com/api/v2/incremental/tickets.json?start_time=0";
77
- setup("incremental.yml");
78
- loadData("data/tickets.json");
79
- setupTestAndVerifyURL(expectURL, 0, false);
80
- }
81
-
82
- @Test
83
- public void buildPathWithIncrementalForRunWithTicketMetrics()
84
- {
85
- String expectURL = "https://abc.zendesk.com/api/v2/incremental/tickets.json?start_time=0&include=metric_sets";
86
- loadData("data/ticket_metrics.json");
87
-
88
- ConfigSource src = ZendeskTestHelper.getConfigSource("incremental.yml");
89
- src.set("target", "ticket_metrics");
90
- ZendeskInputPlugin.PluginTask task = src.loadConfig(ZendeskInputPlugin.PluginTask.class);
91
- setupZendeskSupportAPIService(task);
92
-
93
- setupTestAndVerifyURL(expectURL, 0, false);
94
- }
95
-
96
- @Test
97
- public void buildPathWithIncrementalForRunIncludeRelatedObject()
65
+ public void testBuildPathWithIncrementalIncludeRelatedObject()
98
66
  {
99
67
  String expectURL = "https://abc.zendesk.com/api/v2/incremental/tickets.json?start_time=0";
100
68
  loadData("data/tickets.json");
@@ -104,43 +72,41 @@ public class TestZendeskSupportAPIService
104
72
  ZendeskInputPlugin.PluginTask task = src.loadConfig(ZendeskInputPlugin.PluginTask.class);
105
73
  setupZendeskSupportAPIService(task);
106
74
 
107
- setupTestAndVerifyURL(expectURL, 0, false);
75
+ String url = zendeskSupportAPIService.buildURI(0, 0);
76
+ assertEquals(expectURL, url);
108
77
  }
109
78
 
110
79
  @Test
111
- public void buildPathWithIncrementalForRunTimeChange()
80
+ public void testBuildPathWithIncrementalTimeChange()
112
81
  {
113
- long time = 100;
114
82
  String expectURL = "https://abc.zendesk.com/api/v2/incremental/tickets.json?start_time=100";
115
83
  loadData("data/tickets.json");
116
84
 
117
85
  ConfigSource src = ZendeskTestHelper.getConfigSource("incremental.yml");
118
86
  ZendeskInputPlugin.PluginTask task = src.loadConfig(ZendeskInputPlugin.PluginTask.class);
119
87
  setupZendeskSupportAPIService(task);
120
-
121
- zendeskSupportAPIService.getData("", 0, false, time);
122
- final ArgumentCaptor<String> url = ArgumentCaptor.forClass(String.class);
123
- verify(zendeskRestClient).doGet(url.capture(), any(), anyBoolean());
124
- assertEquals(expectURL, url.getValue());
88
+ String url = zendeskSupportAPIService.buildURI(0, 100);
89
+ assertEquals(expectURL, url);
125
90
  }
126
91
 
127
92
  @Test
128
- public void buildPathWithNonIncrementalForRun()
93
+ public void testBuildPathWithNonIncremental()
129
94
  {
130
95
  String expectURL = "https://abc.zendesk.com/api/v2/ticket_fields.json?sort_by=id&per_page=100&page=0";
131
96
  setup("non-incremental.yml");
132
97
  loadData("data/ticket_fields.json");
133
-
134
- setupTestAndVerifyURL(expectURL, 0, false);
98
+ String url = zendeskSupportAPIService.buildURI(0, 0);
99
+ assertEquals(expectURL, url);
135
100
  }
136
101
 
137
102
  @Test
138
- public void buildPathWithNonIncrementalForRunChangePageNumber()
103
+ public void testBuildPathWithNonIncrementalChangePageNumber()
139
104
  {
140
105
  String expectURL = "https://abc.zendesk.com/api/v2/ticket_fields.json?sort_by=id&per_page=100&page=2";
141
106
  setup("non-incremental.yml");
142
107
  loadData("data/ticket_fields.json");
143
- setupTestAndVerifyURL(expectURL, 2, false);
108
+ String url = zendeskSupportAPIService.buildURI(2, 0);
109
+ assertEquals(expectURL, url);
144
110
  }
145
111
 
146
112
  private void loadData(String fileName)
@@ -161,12 +127,4 @@ public class TestZendeskSupportAPIService
161
127
  .loadConfig(ZendeskInputPlugin.PluginTask.class);
162
128
  setupZendeskSupportAPIService(task);
163
129
  }
164
-
165
- private void setupTestAndVerifyURL(String expectURL, int page, boolean isPreview)
166
- {
167
- zendeskSupportAPIService.getData("", page, isPreview, 0);
168
- final ArgumentCaptor<String> url = ArgumentCaptor.forClass(String.class);
169
- verify(zendeskRestClient).doGet(url.capture(), any(), anyBoolean());
170
- assertEquals(expectURL, url.getValue());
171
- }
172
130
  }