embulk-input-jira 0.2.5 → 0.2.6

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +10 -5
  3. data/.travis.yml +4 -34
  4. data/CHANGELOG.md +4 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +5 -4
  7. data/build.gradle +116 -0
  8. data/config/checkstyle/checkstyle.xml +128 -0
  9. data/config/checkstyle/default.xml +108 -0
  10. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  11. data/gradle/wrapper/gradle-wrapper.properties +5 -0
  12. data/gradlew +172 -0
  13. data/gradlew.bat +84 -0
  14. data/lib/embulk/guess/jira.rb +24 -0
  15. data/lib/embulk/input/jira.rb +3 -169
  16. data/src/main/java/org/embulk/input/jira/AuthenticateMethod.java +27 -0
  17. data/src/main/java/org/embulk/input/jira/Constant.java +17 -0
  18. data/src/main/java/org/embulk/input/jira/Issue.java +150 -0
  19. data/src/main/java/org/embulk/input/jira/JiraInputPlugin.java +226 -0
  20. data/src/main/java/org/embulk/input/jira/client/JiraClient.java +254 -0
  21. data/src/main/java/org/embulk/input/jira/util/JiraException.java +18 -0
  22. data/src/main/java/org/embulk/input/jira/util/JiraUtil.java +264 -0
  23. data/src/test/java/org/embulk/input/jira/IssueTest.java +278 -0
  24. data/src/test/java/org/embulk/input/jira/JiraInputPluginTest.java +204 -0
  25. data/src/test/java/org/embulk/input/jira/JiraPluginTestRuntime.java +133 -0
  26. data/src/test/java/org/embulk/input/jira/TestHelpers.java +41 -0
  27. data/src/test/java/org/embulk/input/jira/client/JiraClientTest.java +222 -0
  28. data/src/test/java/org/embulk/input/jira/util/JiraUtilTest.java +318 -0
  29. data/src/test/resources/config.yml +13 -0
  30. data/src/test/resources/issue_flatten.json +129 -0
  31. data/src/test/resources/issue_flatten_expected.json +73 -0
  32. data/src/test/resources/issue_get.json +36 -0
  33. data/src/test/resources/issue_get_expected.json +62 -0
  34. data/src/test/resources/jira_client.json +81 -0
  35. data/src/test/resources/jira_input_plugin.json +114 -0
  36. data/src/test/resources/jira_util.json +26 -0
  37. metadata +55 -175
  38. data/Gemfile +0 -3
  39. data/LICENSE +0 -13
  40. data/Rakefile +0 -15
  41. data/embulk-input-jira.gemspec +0 -27
  42. data/gemfiles/embulk-0.8.0-latest +0 -4
  43. data/gemfiles/embulk-0.8.7 +0 -4
  44. data/gemfiles/embulk-0.8.8 +0 -4
  45. data/gemfiles/embulk-latest +0 -4
  46. data/gemfiles/template.erb +0 -4
  47. data/lib/embulk/input/jira_api.rb +0 -9
  48. data/lib/embulk/input/jira_api/client.rb +0 -144
  49. data/lib/embulk/input/jira_api/issue.rb +0 -133
  50. data/lib/embulk/input/jira_input_plugin_utils.rb +0 -58
  51. data/spec/embulk/input/jira-input-plugin-utils_spec.rb +0 -89
  52. data/spec/embulk/input/jira_api/client_spec.rb +0 -224
  53. data/spec/embulk/input/jira_api/issue_spec.rb +0 -394
  54. data/spec/embulk/input/jira_spec.rb +0 -322
  55. data/spec/embulk_spec.rb +0 -32
  56. data/spec/spec_helper.rb +0 -26
  57. data/spec/support/stdout_and_err_capture.rb +0 -45
@@ -0,0 +1,204 @@
1
+ package org.embulk.input.jira;
2
+
3
+ import com.google.gson.JsonElement;
4
+ import com.google.gson.JsonObject;
5
+ import com.google.gson.JsonParser;
6
+ import org.apache.http.HttpResponse;
7
+ import org.apache.http.StatusLine;
8
+ import org.apache.http.client.HttpClient;
9
+ import org.apache.http.client.methods.HttpUriRequest;
10
+ import org.apache.http.entity.StringEntity;
11
+ import org.embulk.config.ConfigDiff;
12
+ import org.embulk.config.ConfigSource;
13
+ import org.embulk.config.TaskReport;
14
+ import org.embulk.config.TaskSource;
15
+ import org.embulk.input.jira.JiraInputPlugin.PluginTask;
16
+ import org.embulk.input.jira.client.JiraClient;
17
+ import org.embulk.spi.InputPlugin;
18
+ import org.embulk.spi.PageBuilder;
19
+ import org.embulk.spi.Schema;
20
+ import org.embulk.spi.TestPageBuilderReader.MockPageOutput;
21
+ import org.junit.Before;
22
+ import org.junit.Rule;
23
+ import org.junit.Test;
24
+ import org.mockito.Mockito;
25
+
26
+ import java.io.IOException;
27
+ import java.util.ArrayList;
28
+ import java.util.List;
29
+
30
+ import static org.junit.Assert.assertEquals;
31
+ import static org.mockito.Mockito.doReturn;
32
+ import static org.mockito.Mockito.times;
33
+ import static org.mockito.Mockito.verify;
34
+ import static org.mockito.Mockito.when;
35
+
36
+ public class JiraInputPluginTest
37
+ {
38
+ @Rule
39
+ public JiraPluginTestRuntime runtime = new JiraPluginTestRuntime();
40
+
41
+ private JiraInputPlugin plugin;
42
+ private JiraClient jiraClient;
43
+ private JsonObject data;
44
+ private ConfigSource config;
45
+ private HttpClient client = Mockito.mock(HttpClient.class);
46
+ private HttpResponse response = Mockito.mock(HttpResponse.class);
47
+ private StatusLine statusLine = Mockito.mock(StatusLine.class);
48
+
49
+ private MockPageOutput output = new MockPageOutput();
50
+ private PageBuilder pageBuilder;
51
+
52
+ @Before
53
+ public void setUp() throws IOException
54
+ {
55
+ if (plugin == null) {
56
+ plugin = Mockito.spy(new JiraInputPlugin());
57
+ jiraClient = Mockito.spy(new JiraClient());
58
+ data = TestHelpers.getJsonFromFile("jira_input_plugin.json");
59
+ config = TestHelpers.config();
60
+ config.loadConfig(PluginTask.class);
61
+ pageBuilder = Mockito.mock(PageBuilder.class);
62
+ //pageBuilder = new PageBuilder(Exec.getBufferAllocator(), config.loadConfig(PluginTask.class).getColumns().toSchema(), output);
63
+ }
64
+ when(plugin.getJiraClient()).thenReturn(jiraClient);
65
+ when(jiraClient.createHttpClient()).thenReturn(client);
66
+ when(client.execute(Mockito.any(HttpUriRequest.class))).thenReturn(response);
67
+ when(response.getStatusLine()).thenReturn(statusLine);
68
+ doReturn(pageBuilder).when(plugin).getPageBuilder(Mockito.any(), Mockito.any());
69
+ }
70
+
71
+ @Test
72
+ public void test_run_withEmptyResult() throws IOException
73
+ {
74
+ JsonObject authorizeResponse = data.get("authenticateSuccess").getAsJsonObject();
75
+ JsonObject searchResponse = data.get("emptyResult").getAsJsonObject();
76
+
77
+ when(statusLine.getStatusCode())
78
+ .thenReturn(authorizeResponse.get("statusCode").getAsInt())
79
+ .thenReturn(searchResponse.get("statusCode").getAsInt());
80
+ when(response.getEntity())
81
+ .thenReturn(new StringEntity(authorizeResponse.get("body").toString()))
82
+ .thenReturn(new StringEntity(searchResponse.get("body").toString()));
83
+
84
+ plugin.transaction(config, new Control());
85
+ // Check credential 1 + getTotal 1 + loadData 0
86
+ verify(jiraClient, times(2)).createHttpClient();
87
+ verify(pageBuilder, times(0)).addRecord();
88
+ verify(pageBuilder, times(1)).finish();
89
+ }
90
+
91
+ @Test
92
+ public void test_run_with1RecordsResult() throws IOException
93
+ {
94
+ JsonObject authorizeResponse = data.get("authenticateSuccess").getAsJsonObject();
95
+ JsonObject searchResponse = data.get("oneRecordResult").getAsJsonObject();
96
+
97
+ when(statusLine.getStatusCode())
98
+ .thenReturn(authorizeResponse.get("statusCode").getAsInt())
99
+ .thenReturn(searchResponse.get("statusCode").getAsInt());
100
+ when(response.getEntity())
101
+ .thenReturn(new StringEntity(authorizeResponse.get("body").toString()))
102
+ .thenReturn(new StringEntity(searchResponse.get("body").toString()));
103
+
104
+ plugin.transaction(config, new Control());
105
+ // Check credential 1 + getTotal 1 + loadData 1
106
+ verify(jiraClient, times(3)).createHttpClient();
107
+ verify(pageBuilder, times(1)).addRecord();
108
+ verify(pageBuilder, times(1)).finish();
109
+ }
110
+
111
+ @Test
112
+ public void test_run_with2PagesResult() throws IOException
113
+ {
114
+ JsonObject authorizeResponse = data.get("authenticateSuccess").getAsJsonObject();
115
+ JsonObject searchResponse = data.get("2PagesResult").getAsJsonObject();
116
+
117
+ when(statusLine.getStatusCode())
118
+ .thenReturn(authorizeResponse.get("statusCode").getAsInt())
119
+ .thenReturn(searchResponse.get("statusCode").getAsInt());
120
+ when(response.getEntity())
121
+ .thenReturn(new StringEntity(authorizeResponse.get("body").toString()))
122
+ .thenReturn(new StringEntity(searchResponse.get("body").toString()));
123
+
124
+ plugin.transaction(config, new Control());
125
+ // Check credential 1 + getTotal 1 + loadData 2
126
+ verify(jiraClient, times(4)).createHttpClient();
127
+ verify(pageBuilder, times(2)).addRecord();
128
+ verify(pageBuilder, times(1)).finish();
129
+ }
130
+
131
+ @Test
132
+ public void test_preview_withEmptyResult() throws IOException
133
+ {
134
+ when(plugin.isPreview()).thenReturn(true);
135
+ JsonObject authorizeResponse = data.get("authenticateSuccess").getAsJsonObject();
136
+ JsonObject searchResponse = data.get("emptyResult").getAsJsonObject();
137
+
138
+ when(statusLine.getStatusCode())
139
+ .thenReturn(authorizeResponse.get("statusCode").getAsInt())
140
+ .thenReturn(searchResponse.get("statusCode").getAsInt());
141
+ when(response.getEntity())
142
+ .thenReturn(new StringEntity(searchResponse.get("body").toString()));
143
+
144
+ plugin.transaction(config, new Control());
145
+ // Check credential 1 + loadData 1
146
+ verify(jiraClient, times(2)).createHttpClient();
147
+ verify(pageBuilder, times(0)).addRecord();
148
+ verify(pageBuilder, times(1)).finish();
149
+ }
150
+
151
+ @Test
152
+ public void test_preview_with1RecordsResult() throws IOException
153
+ {
154
+ when(plugin.isPreview()).thenReturn(true);
155
+ JsonObject authorizeResponse = data.get("authenticateSuccess").getAsJsonObject();
156
+ JsonObject searchResponse = data.get("oneRecordResult").getAsJsonObject();
157
+
158
+ when(statusLine.getStatusCode())
159
+ .thenReturn(authorizeResponse.get("statusCode").getAsInt())
160
+ .thenReturn(searchResponse.get("statusCode").getAsInt());
161
+ when(response.getEntity())
162
+ .thenReturn(new StringEntity(authorizeResponse.get("body").toString()))
163
+ .thenReturn(new StringEntity(searchResponse.get("body").toString()));
164
+
165
+ plugin.transaction(config, new Control());
166
+ // Check credential 1 + loadData 1
167
+ verify(jiraClient, times(2)).createHttpClient();
168
+ verify(pageBuilder, times(1)).addRecord();
169
+ verify(pageBuilder, times(1)).finish();
170
+ }
171
+
172
+ @Test
173
+ public void test_guess() throws IOException
174
+ {
175
+ ConfigSource configSource = TestHelpers.config();
176
+ JsonObject authorizeResponse = data.get("authenticateSuccess").getAsJsonObject();
177
+ JsonObject searchResponse = data.get("guessDataResult").getAsJsonObject();
178
+
179
+ when(statusLine.getStatusCode())
180
+ .thenReturn(authorizeResponse.get("statusCode").getAsInt())
181
+ .thenReturn(searchResponse.get("statusCode").getAsInt());
182
+ when(response.getEntity())
183
+ .thenReturn(new StringEntity(searchResponse.get("body").toString()))
184
+ .thenReturn(new StringEntity(searchResponse.get("body").toString()));
185
+
186
+ ConfigDiff result = plugin.guess(configSource);
187
+ JsonElement expected = data.get("guessResult").getAsJsonObject();
188
+ JsonElement actual = new JsonParser().parse(result.toString());
189
+ assertEquals(expected, actual);
190
+ }
191
+
192
+ private class Control implements InputPlugin.Control
193
+ {
194
+ @Override
195
+ public List<TaskReport> run(final TaskSource taskSource, final Schema schema, final int taskCount)
196
+ {
197
+ List<TaskReport> reports = new ArrayList<>();
198
+ for (int i = 0; i < taskCount; i++) {
199
+ reports.add(plugin.run(taskSource, schema, i, output));
200
+ }
201
+ return reports;
202
+ }
203
+ }
204
+ }
@@ -0,0 +1,133 @@
1
+ package org.embulk.input.jira;
2
+
3
+ import com.fasterxml.jackson.databind.ObjectMapper;
4
+ import com.fasterxml.jackson.databind.node.JsonNodeFactory;
5
+ import com.fasterxml.jackson.databind.node.ObjectNode;
6
+ import com.google.inject.Binder;
7
+ import com.google.inject.Injector;
8
+ import com.google.inject.Module;
9
+ import org.embulk.GuiceBinder;
10
+ import org.embulk.RandomManager;
11
+ import org.embulk.TestPluginSourceModule;
12
+ import org.embulk.TestUtilityModule;
13
+ import org.embulk.config.ConfigSource;
14
+ import org.embulk.config.DataSourceImpl;
15
+ import org.embulk.config.ModelManager;
16
+ import org.embulk.exec.ExecModule;
17
+ import org.embulk.exec.ExtensionServiceLoaderModule;
18
+ import org.embulk.exec.SystemConfigModule;
19
+ import org.embulk.jruby.JRubyScriptingModule;
20
+ import org.embulk.plugin.BuiltinPluginSourceModule;
21
+ import org.embulk.plugin.PluginClassLoaderFactory;
22
+ import org.embulk.plugin.PluginClassLoaderModule;
23
+ import org.embulk.spi.BufferAllocator;
24
+ import org.embulk.spi.Exec;
25
+ import org.embulk.spi.ExecAction;
26
+ import org.embulk.spi.ExecSession;
27
+ import org.junit.runner.Description;
28
+ import org.junit.runners.model.Statement;
29
+
30
+ import java.util.Random;
31
+
32
+ /**
33
+ * This is a clone from {@link org.embulk.EmbulkTestRuntime}, since there is no easy way to extend it.
34
+ * The only modification is on the provided systemConfig, enable tests to run `embulk/guess/jira.rb`
35
+ */
36
+ public class JiraPluginTestRuntime extends GuiceBinder
37
+ {
38
+ private static ConfigSource getSystemConfig()
39
+ {
40
+ ObjectNode configNode = JsonNodeFactory.instance.objectNode();
41
+ configNode.set("jruby_load_path", JsonNodeFactory.instance.arrayNode().add("lib"));
42
+
43
+ return new DataSourceImpl(new ModelManager(null, new ObjectMapper()), configNode);
44
+ }
45
+
46
+ public static class TestRuntimeModule implements Module
47
+ {
48
+ @Override
49
+ public void configure(Binder binder)
50
+ {
51
+ ConfigSource systemConfig = getSystemConfig();
52
+ new SystemConfigModule(systemConfig).configure(binder);
53
+ new ExecModule().configure(binder);
54
+ new ExtensionServiceLoaderModule(systemConfig).configure(binder);
55
+ new BuiltinPluginSourceModule().configure(binder);
56
+ new JRubyScriptingModule(systemConfig).configure(binder);
57
+ new PluginClassLoaderModule(systemConfig).configure(binder);
58
+ new TestUtilityModule().configure(binder);
59
+ new TestPluginSourceModule().configure(binder);
60
+ }
61
+ }
62
+
63
+ private ExecSession exec;
64
+
65
+ public JiraPluginTestRuntime()
66
+ {
67
+ super(new TestRuntimeModule());
68
+ Injector injector = getInjector();
69
+ ConfigSource execConfig = new DataSourceImpl(injector.getInstance(ModelManager.class));
70
+ this.exec = ExecSession.builder(injector).fromExecConfig(execConfig).build();
71
+ }
72
+
73
+ public ExecSession getExec()
74
+ {
75
+ return exec;
76
+ }
77
+
78
+ public BufferAllocator getBufferAllocator()
79
+ {
80
+ return getInstance(BufferAllocator.class);
81
+ }
82
+
83
+ public ModelManager getModelManager()
84
+ {
85
+ return getInstance(ModelManager.class);
86
+ }
87
+
88
+ public Random getRandom()
89
+ {
90
+ return getInstance(RandomManager.class).getRandom();
91
+ }
92
+
93
+ public PluginClassLoaderFactory getPluginClassLoaderFactory()
94
+ {
95
+ return getInstance(PluginClassLoaderFactory.class);
96
+ }
97
+
98
+ @Override
99
+ public Statement apply(Statement base, Description description)
100
+ {
101
+ final Statement superStatement = JiraPluginTestRuntime.super.apply(base, description);
102
+ return new Statement() {
103
+ public void evaluate() throws Throwable
104
+ {
105
+ try {
106
+ Exec.doWith(exec, (ExecAction<Void>) () -> {
107
+ try {
108
+ superStatement.evaluate();
109
+ }
110
+ catch (Throwable ex) {
111
+ throw new RuntimeExecutionException(ex);
112
+ }
113
+ return null;
114
+ });
115
+ }
116
+ catch (RuntimeException ex) {
117
+ throw ex.getCause();
118
+ }
119
+ finally {
120
+ exec.cleanup();
121
+ }
122
+ }
123
+ };
124
+ }
125
+
126
+ private static class RuntimeExecutionException extends RuntimeException
127
+ {
128
+ public RuntimeExecutionException(Throwable cause)
129
+ {
130
+ super(cause);
131
+ }
132
+ }
133
+ }
@@ -0,0 +1,41 @@
1
+ package org.embulk.input.jira;
2
+
3
+ import com.fasterxml.jackson.databind.ObjectMapper;
4
+ import com.fasterxml.jackson.datatype.guava.GuavaModule;
5
+ import com.fasterxml.jackson.datatype.joda.JodaModule;
6
+ import com.google.common.io.Resources;
7
+ import com.google.gson.JsonObject;
8
+ import com.google.gson.JsonParser;
9
+ import com.google.gson.stream.JsonReader;
10
+
11
+ import org.embulk.config.ConfigLoader;
12
+ import org.embulk.config.ConfigSource;
13
+ import org.embulk.config.ModelManager;
14
+
15
+ import java.io.File;
16
+ import java.io.FileReader;
17
+ import java.io.IOException;
18
+
19
+ public final class TestHelpers
20
+ {
21
+ private TestHelpers() {}
22
+
23
+ public static JsonObject getJsonFromFile(String fileName) throws IOException
24
+ {
25
+ String path = Resources.getResource(fileName).getPath();
26
+ try (JsonReader reader = new JsonReader(new FileReader(path))) {
27
+ JsonParser parser = new JsonParser();
28
+ return parser.parse(reader).getAsJsonObject();
29
+ }
30
+ }
31
+
32
+ public static ConfigSource config() throws IOException
33
+ {
34
+ String path = Resources.getResource("config.yml").getPath();
35
+ ObjectMapper mapper = new ObjectMapper()
36
+ .registerModule(new GuavaModule())
37
+ .registerModule(new JodaModule());
38
+ ConfigLoader configLoader = new ConfigLoader(new ModelManager(null, mapper));
39
+ return configLoader.fromYamlFile(new File(path));
40
+ }
41
+ }
@@ -0,0 +1,222 @@
1
+ package org.embulk.input.jira.client;
2
+
3
+ import com.google.gson.JsonObject;
4
+
5
+ import org.apache.http.HttpResponse;
6
+ import org.apache.http.StatusLine;
7
+ import org.apache.http.client.HttpClient;
8
+ import org.apache.http.entity.StringEntity;
9
+ import org.embulk.EmbulkTestRuntime;
10
+ import org.embulk.config.ConfigException;
11
+ import org.embulk.input.jira.Issue;
12
+ import org.embulk.input.jira.JiraInputPlugin.PluginTask;
13
+ import org.embulk.input.jira.TestHelpers;
14
+
15
+ import org.junit.Before;
16
+ import org.junit.Rule;
17
+ import org.junit.Test;
18
+ import org.mockito.Mockito;
19
+
20
+ import java.io.IOException;
21
+ import java.util.List;
22
+
23
+ import static org.junit.Assert.assertEquals;
24
+ import static org.junit.Assert.assertThrows;
25
+ import static org.mockito.Mockito.times;
26
+ import static org.mockito.Mockito.verify;
27
+ import static org.mockito.Mockito.when;
28
+
29
+ public class JiraClientTest
30
+ {
31
+ @Rule
32
+ public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
33
+ private JiraClient jiraClient;
34
+ private PluginTask task;
35
+
36
+ private HttpClient client = Mockito.mock(HttpClient.class);
37
+ private HttpResponse response = Mockito.mock(HttpResponse.class);
38
+ private StatusLine statusLine = Mockito.mock(StatusLine.class);
39
+ private JsonObject data;
40
+
41
+ @Before
42
+ public void setUp() throws IOException
43
+ {
44
+ if (jiraClient == null) {
45
+ jiraClient = Mockito.spy(new JiraClient());
46
+ response = Mockito.mock(HttpResponse.class);
47
+ task = TestHelpers.config().loadConfig(PluginTask.class);
48
+ data = TestHelpers.getJsonFromFile("jira_client.json");
49
+ }
50
+ when(jiraClient.createHttpClient()).thenReturn(client);
51
+ when(client.execute(Mockito.any())).thenReturn(response);
52
+ when(response.getStatusLine()).thenReturn(statusLine);
53
+ }
54
+
55
+ @Test
56
+ public void test_checkUserCredentials_success() throws IOException
57
+ {
58
+ String dataName = "credentialSuccess";
59
+ JsonObject messageResponse = data.get(dataName).getAsJsonObject();
60
+ int statusCode = messageResponse.get("statusCode").getAsInt();
61
+ String body = messageResponse.get("body").toString();
62
+
63
+ when(statusLine.getStatusCode()).thenReturn(statusCode);
64
+ when(response.getEntity()).thenReturn(new StringEntity(body));
65
+
66
+ jiraClient.checkUserCredentials(task);
67
+ }
68
+
69
+ @Test
70
+ public void test_checkUserCredentials_failOn400() throws IOException
71
+ {
72
+ String dataName = "credentialFail400";
73
+ JsonObject messageResponse = data.get(dataName).getAsJsonObject();
74
+ int statusCode = messageResponse.get("statusCode").getAsInt();
75
+ String body = messageResponse.get("body").toString();
76
+
77
+ when(statusLine.getStatusCode()).thenReturn(statusCode);
78
+ when(response.getEntity()).thenReturn(new StringEntity(body));
79
+
80
+ assertThrows("Could not authorize with your credential.", ConfigException.class, () -> jiraClient.checkUserCredentials(task));
81
+ }
82
+
83
+ @Test
84
+ public void test_checkUserCredentials_failOn401() throws IOException
85
+ {
86
+ String dataName = "credentialFail401";
87
+ JsonObject messageResponse = data.get(dataName).getAsJsonObject();
88
+ int statusCode = messageResponse.get("statusCode").getAsInt();
89
+ String body = messageResponse.get("body").toString();
90
+
91
+ when(statusLine.getStatusCode()).thenReturn(statusCode);
92
+ when(response.getEntity()).thenReturn(new StringEntity(body));
93
+
94
+ assertThrows("Could not authorize with your credential.", ConfigException.class, () -> jiraClient.checkUserCredentials(task));
95
+ }
96
+
97
+ @Test
98
+ public void test_checkUserCredentials_failOn429() throws IOException
99
+ {
100
+ String dataName = "credentialFail429";
101
+ JsonObject messageResponse = data.get(dataName).getAsJsonObject();
102
+ int statusCode = messageResponse.get("statusCode").getAsInt();
103
+ String body = messageResponse.get("body").toString();
104
+
105
+ when(statusLine.getStatusCode()).thenReturn(statusCode);
106
+ when(response.getEntity()).thenReturn(new StringEntity(body));
107
+
108
+ assertThrows("Could not authorize with your credential due to problems when contacting JIRA API.", ConfigException.class, () -> jiraClient.checkUserCredentials(task));
109
+ }
110
+
111
+ @Test
112
+ public void test_checkUserCredentials_failOn500() throws IOException
113
+ {
114
+ String dataName = "credentialFail500";
115
+ JsonObject messageResponse = data.get(dataName).getAsJsonObject();
116
+ int statusCode = messageResponse.get("statusCode").getAsInt();
117
+ String body = messageResponse.get("body").toString();
118
+
119
+ when(statusLine.getStatusCode()).thenReturn(statusCode);
120
+ when(response.getEntity()).thenReturn(new StringEntity(body));
121
+
122
+ assertThrows("Could not authorize with your credential due to problems when contacting JIRA API.", ConfigException.class, () -> jiraClient.checkUserCredentials(task));
123
+ }
124
+
125
+ @Test
126
+ public void test_getTotalCount_success() throws IOException
127
+ {
128
+ String dataName = "totalCountSuccess";
129
+ JsonObject messageResponse = data.get(dataName).getAsJsonObject();
130
+ int statusCode = messageResponse.get("statusCode").getAsInt();
131
+ String body = messageResponse.get("body").toString();
132
+
133
+ when(statusLine.getStatusCode()).thenReturn(statusCode);
134
+ when(response.getEntity()).thenReturn(new StringEntity(body));
135
+
136
+ int totalCount = jiraClient.getTotalCount(task);
137
+ assertEquals(totalCount, messageResponse.get("body").getAsJsonObject().get("total").getAsInt());
138
+ }
139
+
140
+ @Test
141
+ public void test_getTotalCount_failOnRetry() throws IOException
142
+ {
143
+ String dataName = "totalCountFailAllTime";
144
+ JsonObject messageResponse = data.get(dataName).getAsJsonObject();
145
+ int statusCode = messageResponse.get("statusCode").getAsInt();
146
+ String body = messageResponse.get("body").toString();
147
+
148
+ when(statusLine.getStatusCode()).thenReturn(statusCode);
149
+ when(response.getEntity()).thenReturn(new StringEntity(body));
150
+
151
+ assertThrows(RuntimeException.class, () -> jiraClient.getTotalCount(task));
152
+
153
+ // First try + 3 retry_limit
154
+ int expectedInvocation = 3 + 1;
155
+ verify(jiraClient, times(expectedInvocation)).createHttpClient();
156
+ verify(statusLine, times(expectedInvocation)).getStatusCode();
157
+ }
158
+
159
+ @Test
160
+ public void test_getTotalCount_doNotRetryOn400Status() throws IOException
161
+ {
162
+ String dataName = "totalCountFail400";
163
+ JsonObject messageResponse = data.get(dataName).getAsJsonObject();
164
+ int statusCode = messageResponse.get("statusCode").getAsInt();
165
+ String body = messageResponse.get("body").toString();
166
+
167
+ when(statusLine.getStatusCode()).thenReturn(statusCode);
168
+ when(response.getEntity()).thenReturn(new StringEntity(body));
169
+
170
+ assertThrows(RuntimeException.class, () -> jiraClient.getTotalCount(task));
171
+
172
+ // No retry
173
+ int expectedInvocation = 1;
174
+ verify(jiraClient, times(expectedInvocation)).createHttpClient();
175
+ verify(statusLine, times(expectedInvocation)).getStatusCode();
176
+ }
177
+
178
+ @Test
179
+ public void test_getTotalCount_retryOnIOException() throws IOException
180
+ {
181
+ when(client.execute(Mockito.any())).thenThrow(new IOException("test exeception"));
182
+
183
+ assertThrows(RuntimeException.class, () -> jiraClient.getTotalCount(task));
184
+
185
+ // First try + 3 retry_limit
186
+ int expectedInvocation = 3 + 1;
187
+ verify(jiraClient, times(expectedInvocation)).createHttpClient();
188
+ // getStatusCode is not triggered
189
+ verify(statusLine, times(0)).getStatusCode();
190
+ }
191
+
192
+ @Test
193
+ public void test_searchIssues() throws IOException
194
+ {
195
+ String dataName = "searchIssuesSuccess";
196
+ JsonObject messageResponse = data.get(dataName).getAsJsonObject();
197
+
198
+ int statusCode = messageResponse.get("statusCode").getAsInt();
199
+ String body = messageResponse.get("body").toString();
200
+
201
+ when(statusLine.getStatusCode()).thenReturn(statusCode);
202
+ when(response.getEntity()).thenReturn(new StringEntity(body));
203
+
204
+ List<Issue> issues = jiraClient.searchIssues(task, 0, 50);
205
+ assertEquals(issues.size(), 2);
206
+ }
207
+
208
+ @Test
209
+ public void test_searchIssues_failJql() throws IOException
210
+ {
211
+ String dataName = "searchIssuesFailJql";
212
+ JsonObject messageResponse = data.get(dataName).getAsJsonObject();
213
+
214
+ int statusCode = messageResponse.get("statusCode").getAsInt();
215
+ String body = messageResponse.get("body").toString();
216
+
217
+ when(statusLine.getStatusCode()).thenReturn(statusCode);
218
+ when(response.getEntity()).thenReturn(new StringEntity(body));
219
+
220
+ assertThrows(ConfigException.class, () -> jiraClient.searchIssues(task, 0, 50));
221
+ }
222
+ }