Commit f037b52e1893522913e86018c987907ee325ced9
1 parent
f15e87e9
Execute command on issue.
Refactored Filter.
Showing
11 changed files
with
689 additions
and
133 deletions
1 | +package pl.com.it_crowd.youtrack.api; | ||
2 | + | ||
3 | +import pl.com.it_crowd.youtrack.api.defaults.Fields; | ||
4 | +import pl.com.it_crowd.youtrack.api.defaults.StateValues; | ||
5 | + | ||
6 | +public class Command { | ||
7 | +// ------------------------------ FIELDS ------------------------------ | ||
8 | + | ||
9 | + protected StringBuilder command = new StringBuilder(); | ||
10 | + | ||
11 | +// -------------------------- STATIC METHODS -------------------------- | ||
12 | + | ||
13 | + public static Command assigneeCommand(String assignee) | ||
14 | + { | ||
15 | + return new Command().assignee(assignee); | ||
16 | + } | ||
17 | + | ||
18 | + public static Command stateCommand(String state) | ||
19 | + { | ||
20 | + return new Command().state(state); | ||
21 | + } | ||
22 | + | ||
23 | + public static Command stateCommand(StateValues state) | ||
24 | + { | ||
25 | + return new Command().state(state); | ||
26 | + } | ||
27 | + | ||
28 | +// --------------------------- CONSTRUCTORS --------------------------- | ||
29 | + | ||
30 | + private Command() | ||
31 | + { | ||
32 | + } | ||
33 | + | ||
34 | +// ------------------------ CANONICAL METHODS ------------------------ | ||
35 | + | ||
36 | + @Override | ||
37 | + public String toString() | ||
38 | + { | ||
39 | + return command.toString().trim(); | ||
40 | + } | ||
41 | + | ||
42 | +// -------------------------- OTHER METHODS -------------------------- | ||
43 | + | ||
44 | + public Command assignee(String assignee) | ||
45 | + { | ||
46 | + return command(Fields.assignee, assignee); | ||
47 | + } | ||
48 | + | ||
49 | + public Command state(String state) | ||
50 | + { | ||
51 | + return command(Fields.state, state); | ||
52 | + } | ||
53 | + | ||
54 | + public Command state(StateValues state) | ||
55 | + { | ||
56 | + if (state.getCommandValue() == null) { | ||
57 | + throw new IllegalArgumentException("Cannot set readonly state: " + state); | ||
58 | + } | ||
59 | + return state(state.getCommandValue()); | ||
60 | + } | ||
61 | + | ||
62 | + private Command command(Fields command, String argument) | ||
63 | + { | ||
64 | + this.command.append(" ").append(command.getCommand()).append(" ").append(argument); | ||
65 | + return this; | ||
66 | + } | ||
67 | +} |
1 | package pl.com.it_crowd.youtrack.api; | 1 | package pl.com.it_crowd.youtrack.api; |
2 | 2 | ||
3 | +import pl.com.it_crowd.youtrack.api.defaults.DateValues; | ||
4 | +import pl.com.it_crowd.youtrack.api.defaults.Fields; | ||
5 | +import pl.com.it_crowd.youtrack.api.defaults.StateValues; | ||
6 | + | ||
3 | import java.io.UnsupportedEncodingException; | 7 | import java.io.UnsupportedEncodingException; |
4 | import java.net.URLEncoder; | 8 | import java.net.URLEncoder; |
5 | import java.util.ArrayList; | 9 | import java.util.ArrayList; |
6 | import java.util.List; | 10 | import java.util.List; |
7 | 11 | ||
8 | -public final class FilterHelper { | 12 | +public final class Filter { |
13 | +// ------------------------------ FIELDS ------------------------------ | ||
14 | + | ||
15 | + private List<Condition> conditions = new ArrayList<Condition>(); | ||
16 | + | ||
17 | + private long maxResults; | ||
18 | + | ||
9 | // -------------------------- STATIC METHODS -------------------------- | 19 | // -------------------------- STATIC METHODS -------------------------- |
10 | 20 | ||
11 | - public static Filter issueId(String issueId) | 21 | + public static Filter createdFilter(String date) |
22 | + { | ||
23 | + return new Filter().created(date); | ||
24 | + } | ||
25 | + | ||
26 | + public static Filter createdFilter(DateValues date) | ||
27 | + { | ||
28 | + return new Filter().created(date); | ||
29 | + } | ||
30 | + | ||
31 | + public static Filter descriptionFilter(String description) | ||
32 | + { | ||
33 | + return new Filter().description(description); | ||
34 | + } | ||
35 | + | ||
36 | + public static Filter issueIdFilter(String issueId) | ||
12 | { | 37 | { |
13 | return new Filter().issueId(issueId); | 38 | return new Filter().issueId(issueId); |
14 | } | 39 | } |
15 | 40 | ||
16 | - public static Filter summary(String summary) | 41 | + public static Filter projectFilter(String project) |
17 | { | 42 | { |
18 | - return new Filter().summary(summary); | 43 | + return new Filter().project(project); |
19 | } | 44 | } |
20 | 45 | ||
21 | - public static Filter unresolved() | 46 | + public static Filter reporterFilter(String reporter) |
22 | { | 47 | { |
23 | - return new Filter().unresolved(); | 48 | + return new Filter().reporter(reporter); |
24 | } | 49 | } |
25 | 50 | ||
26 | -// --------------------------- CONSTRUCTORS --------------------------- | 51 | + public static Filter resolvedFilter(String date) |
52 | + { | ||
53 | + return new Filter().resolved(date); | ||
54 | + } | ||
27 | 55 | ||
28 | - private FilterHelper() | 56 | + public static Filter resolvedFilter(DateValues date) |
29 | { | 57 | { |
58 | + return new Filter().resolved(date); | ||
59 | + } | ||
30 | 60 | ||
61 | + public static Filter stateFilter(StateValues state) | ||
62 | + { | ||
63 | + return new Filter().state(state); | ||
31 | } | 64 | } |
32 | 65 | ||
33 | -// -------------------------- INNER CLASSES -------------------------- | 66 | + public static Filter stateFilter(String state) |
67 | + { | ||
68 | + return new Filter().state(state); | ||
69 | + } | ||
34 | 70 | ||
35 | - public static class Filter { | ||
36 | -// ------------------------------ FIELDS ------------------------------ | 71 | + public static Filter summaryFilter(String summary) |
72 | + { | ||
73 | + return new Filter().summary(summary); | ||
74 | + } | ||
75 | + | ||
76 | + public static Filter unresolvedFilter() | ||
77 | + { | ||
78 | + return new Filter().unresolved(); | ||
79 | + } | ||
80 | + | ||
81 | + public static Filter updatedFilter(String date) | ||
82 | + { | ||
83 | + return new Filter().updated(date); | ||
84 | + } | ||
37 | 85 | ||
38 | - private List<Condition> conditions = new ArrayList<Condition>(); | 86 | + public static Filter updatedFilter(DateValues date) |
87 | + { | ||
88 | + return new Filter().updated(date); | ||
89 | + } | ||
39 | 90 | ||
40 | - private long maxResults; | 91 | + public static Filter updaterFilter(String updater) |
92 | + { | ||
93 | + return new Filter().updater(updater); | ||
94 | + } | ||
41 | 95 | ||
42 | // --------------------------- CONSTRUCTORS --------------------------- | 96 | // --------------------------- CONSTRUCTORS --------------------------- |
43 | 97 | ||
44 | - private Filter() | ||
45 | - { | 98 | + private Filter() |
99 | + { | ||
46 | 100 | ||
47 | - } | 101 | + } |
48 | 102 | ||
49 | // ------------------------ CANONICAL METHODS ------------------------ | 103 | // ------------------------ CANONICAL METHODS ------------------------ |
50 | 104 | ||
51 | - @Override | ||
52 | - public String toString() | ||
53 | - { | ||
54 | - StringBuilder builder = new StringBuilder(); | ||
55 | - String space; | 105 | + @Override |
106 | + public String toString() | ||
107 | + { | ||
108 | + StringBuilder builder = new StringBuilder(); | ||
109 | + String space; | ||
110 | + try { | ||
111 | + space = URLEncoder.encode(" ", "UTF-8"); | ||
112 | + } catch (UnsupportedEncodingException e) { | ||
113 | + throw new RuntimeException(e); | ||
114 | + } | ||
115 | + for (Condition condition : conditions) { | ||
116 | + builder.append(space); | ||
117 | + if (condition.field != null) { | ||
118 | + builder.append(condition.field.getCommand()); | ||
119 | + builder.append(":"); | ||
120 | + } | ||
56 | try { | 121 | try { |
57 | - space = URLEncoder.encode(" ", "UTF-8"); | 122 | + builder.append(URLEncoder.encode(condition.value, "UTF-8")); |
58 | } catch (UnsupportedEncodingException e) { | 123 | } catch (UnsupportedEncodingException e) { |
59 | throw new RuntimeException(e); | 124 | throw new RuntimeException(e); |
60 | } | 125 | } |
61 | - for (Condition condition : conditions) { | ||
62 | - builder.append(space); | ||
63 | - if (condition.key != null) { | ||
64 | - builder.append(condition.key); | ||
65 | - builder.append(":"); | ||
66 | - } | ||
67 | - try { | ||
68 | - builder.append(URLEncoder.encode(condition.value, "UTF-8")); | ||
69 | - } catch (UnsupportedEncodingException e) { | ||
70 | - throw new RuntimeException(e); | ||
71 | - } | ||
72 | - } | ||
73 | - if (maxResults > 0) { | ||
74 | - builder.append("&max=").append(maxResults); | ||
75 | - } | ||
76 | - return builder.toString().trim(); | ||
77 | } | 126 | } |
127 | + if (maxResults > 0) { | ||
128 | + builder.append("&max=").append(maxResults); | ||
129 | + } | ||
130 | + return builder.length() > space.length() ? builder.substring(space.length()) : builder.toString(); | ||
131 | + } | ||
78 | 132 | ||
79 | // -------------------------- OTHER METHODS -------------------------- | 133 | // -------------------------- OTHER METHODS -------------------------- |
80 | 134 | ||
81 | - public Filter issueId(String issueId) | ||
82 | - { | ||
83 | - conditions.add(new Condition(Key.ISSUE_ID, issueId)); | ||
84 | - return this; | ||
85 | - } | 135 | + public Filter created(DateValues date) |
136 | + { | ||
137 | + return created(date.getFilterValue()); | ||
138 | + } | ||
86 | 139 | ||
87 | - public Filter maxResults(long maxResults) | ||
88 | - { | ||
89 | - this.maxResults = maxResults; | ||
90 | - return this; | ||
91 | - } | 140 | + public Filter created(String date) |
141 | + { | ||
142 | + conditions.add(new Condition(Fields.created, date)); | ||
143 | + return this; | ||
144 | + } | ||
92 | 145 | ||
93 | - public Filter summary(String summary) | ||
94 | - { | ||
95 | - conditions.add(new Condition(null, summary)); | ||
96 | - return this; | ||
97 | - } | 146 | + public Filter description(String description) |
147 | + { | ||
148 | + conditions.add(new Condition(Fields.description, description)); | ||
149 | + return this; | ||
150 | + } | ||
98 | 151 | ||
99 | - public Filter unresolved() | ||
100 | - { | ||
101 | - conditions.add(new Condition(Key.STATE, "Unresolved")); | ||
102 | - return this; | ||
103 | - } | 152 | + public Filter freeText(String text) |
153 | + { | ||
154 | + conditions.add(new Condition(null, text)); | ||
155 | + return this; | ||
156 | + } | ||
104 | 157 | ||
105 | -// -------------------------- ENUMERATIONS -------------------------- | 158 | + public Filter issueId(String issueId) |
159 | + { | ||
160 | + conditions.add(new Condition(Fields.issueId, issueId)); | ||
161 | + return this; | ||
162 | + } | ||
106 | 163 | ||
107 | - private enum Key { | ||
108 | - ISSUE_ID("issue id"), | ||
109 | - STATE("state"); | 164 | + public Filter maxResults(long maxResults) |
165 | + { | ||
166 | + this.maxResults = maxResults; | ||
167 | + return this; | ||
168 | + } | ||
110 | 169 | ||
111 | -// ------------------------------ FIELDS ------------------------------ | 170 | + public Filter project(String project) |
171 | + { | ||
172 | + conditions.add(new Condition(Fields.projectShortName, project)); | ||
173 | + return this; | ||
174 | + } | ||
112 | 175 | ||
113 | - private String key; | 176 | + public Filter reporter(String reporter) |
177 | + { | ||
178 | + conditions.add(new Condition(Fields.reporterName, reporter)); | ||
179 | + return this; | ||
180 | + } | ||
114 | 181 | ||
115 | -// --------------------------- CONSTRUCTORS --------------------------- | 182 | + public Filter resolved(DateValues date) |
116 | 183 | ||
117 | - Key(String key) | ||
118 | - { | ||
119 | - this.key = key; | ||
120 | - } | 184 | + { |
185 | + return resolved(date.getFilterValue()); | ||
186 | + } | ||
121 | 187 | ||
122 | -// ------------------------ CANONICAL METHODS ------------------------ | 188 | + public Filter resolved(String date) |
189 | + { | ||
190 | + conditions.add(new Condition(Fields.resolved, date)); | ||
191 | + return this; | ||
192 | + } | ||
123 | 193 | ||
124 | - @Override | ||
125 | - public String toString() | ||
126 | - { | ||
127 | - return key; | ||
128 | - } | ||
129 | - } | 194 | + public Filter state(StateValues state) |
195 | + { | ||
196 | + return state(state.getFilterValue()); | ||
197 | + } | ||
198 | + | ||
199 | + public Filter summary(String summary) | ||
200 | + { | ||
201 | + conditions.add(new Condition(Fields.summary, summary)); | ||
202 | + return this; | ||
203 | + } | ||
204 | + | ||
205 | + public Filter unresolved() | ||
206 | + { | ||
207 | + conditions.add(new Condition(Fields.state, StateValues.Unresolved.getFilterValue())); | ||
208 | + return this; | ||
209 | + } | ||
210 | + | ||
211 | + public Filter updated(DateValues date) | ||
212 | + { | ||
213 | + return updated(date.getFilterValue()); | ||
214 | + } | ||
215 | + | ||
216 | + public Filter updated(String date) | ||
217 | + { | ||
218 | + conditions.add(new Condition(Fields.updated, date)); | ||
219 | + return this; | ||
220 | + } | ||
221 | + | ||
222 | + public Filter updater(String updater) | ||
223 | + { | ||
224 | + conditions.add(new Condition(Fields.updaterName, updater)); | ||
225 | + return this; | ||
226 | + } | ||
227 | + | ||
228 | + private Filter state(String state) | ||
229 | + { | ||
230 | + conditions.add(new Condition(Fields.state, state)); | ||
231 | + return this; | ||
232 | + } | ||
130 | 233 | ||
131 | // -------------------------- INNER CLASSES -------------------------- | 234 | // -------------------------- INNER CLASSES -------------------------- |
132 | 235 | ||
133 | - private class Condition { | 236 | + private class Condition { |
134 | // ------------------------------ FIELDS ------------------------------ | 237 | // ------------------------------ FIELDS ------------------------------ |
135 | 238 | ||
136 | - private Key key; | 239 | + private Fields field; |
137 | 240 | ||
138 | - private String value; | 241 | + private String value; |
139 | 242 | ||
140 | // --------------------------- CONSTRUCTORS --------------------------- | 243 | // --------------------------- CONSTRUCTORS --------------------------- |
141 | 244 | ||
142 | - private Condition(Key key, String value) | ||
143 | - { | ||
144 | - this.key = key; | ||
145 | - this.value = value; | ||
146 | - } | 245 | + private Condition(Fields field, String value) |
246 | + { | ||
247 | + this.field = field; | ||
248 | + this.value = value; | ||
147 | } | 249 | } |
148 | } | 250 | } |
149 | } | 251 | } |
@@ -2,12 +2,14 @@ package pl.com.it_crowd.youtrack.api; | @@ -2,12 +2,14 @@ package pl.com.it_crowd.youtrack.api; | ||
2 | 2 | ||
3 | import org.apache.commons.logging.Log; | 3 | import org.apache.commons.logging.Log; |
4 | import org.apache.commons.logging.LogFactory; | 4 | import org.apache.commons.logging.LogFactory; |
5 | +import pl.com.it_crowd.youtrack.api.defaults.Fields; | ||
5 | import pl.com.it_crowd.youtrack.api.rest.Comment; | 6 | import pl.com.it_crowd.youtrack.api.rest.Comment; |
6 | import pl.com.it_crowd.youtrack.api.rest.Field; | 7 | import pl.com.it_crowd.youtrack.api.rest.Field; |
7 | import pl.com.it_crowd.youtrack.api.rest.Issue; | 8 | import pl.com.it_crowd.youtrack.api.rest.Issue; |
8 | 9 | ||
9 | import java.io.Serializable; | 10 | import java.io.Serializable; |
10 | import java.util.ArrayList; | 11 | import java.util.ArrayList; |
12 | +import java.util.Collections; | ||
11 | import java.util.HashMap; | 13 | import java.util.HashMap; |
12 | import java.util.List; | 14 | import java.util.List; |
13 | import java.util.Map; | 15 | import java.util.Map; |
@@ -33,7 +35,7 @@ public class IssueWrapper implements Serializable { | @@ -33,7 +35,7 @@ public class IssueWrapper implements Serializable { | ||
33 | for (Object o : issue.getFieldOrComment()) { | 35 | for (Object o : issue.getFieldOrComment()) { |
34 | if (o instanceof Field) { | 36 | if (o instanceof Field) { |
35 | Field field = (Field) o; | 37 | Field field = (Field) o; |
36 | - fieldMap.put(field.getName(), field); | 38 | + fieldMap.put(field.getName().toLowerCase(), field); |
37 | } else if (o instanceof Comment) { | 39 | } else if (o instanceof Comment) { |
38 | comments.add((Comment) o); | 40 | comments.add((Comment) o); |
39 | } else { | 41 | } else { |
@@ -44,6 +46,11 @@ public class IssueWrapper implements Serializable { | @@ -44,6 +46,11 @@ public class IssueWrapper implements Serializable { | ||
44 | 46 | ||
45 | // -------------------------- OTHER METHODS -------------------------- | 47 | // -------------------------- OTHER METHODS -------------------------- |
46 | 48 | ||
49 | + public List<Comment> getComments() | ||
50 | + { | ||
51 | + return Collections.unmodifiableList(comments); | ||
52 | + } | ||
53 | + | ||
47 | public Field getField(String field) | 54 | public Field getField(String field) |
48 | { | 55 | { |
49 | return fieldMap.get(field); | 56 | return fieldMap.get(field); |
@@ -51,7 +58,7 @@ public class IssueWrapper implements Serializable { | @@ -51,7 +58,7 @@ public class IssueWrapper implements Serializable { | ||
51 | 58 | ||
52 | public String getFieldValue(String fieldName) | 59 | public String getFieldValue(String fieldName) |
53 | { | 60 | { |
54 | - Field field = getField(fieldName); | 61 | + Field field = getField(fieldName.toLowerCase()); |
55 | if (field == null) { | 62 | if (field == null) { |
56 | return null; | 63 | return null; |
57 | } | 64 | } |
@@ -59,27 +66,13 @@ public class IssueWrapper implements Serializable { | @@ -59,27 +66,13 @@ public class IssueWrapper implements Serializable { | ||
59 | return values.isEmpty() ? null : values.get(0).getContent(); | 66 | return values.isEmpty() ? null : values.get(0).getContent(); |
60 | } | 67 | } |
61 | 68 | ||
62 | - public String getFieldValue(Fields fieldName) | 69 | + public String getFieldValue(Fields field) |
63 | { | 70 | { |
64 | - return getFieldValue(fieldName.name()); | 71 | + return getFieldValue(field.name()); |
65 | } | 72 | } |
66 | 73 | ||
67 | public String getId() | 74 | public String getId() |
68 | { | 75 | { |
69 | return issue.getId(); | 76 | return issue.getId(); |
70 | } | 77 | } |
71 | - | ||
72 | -// -------------------------- ENUMERATIONS -------------------------- | ||
73 | - | ||
74 | - public enum Fields { | ||
75 | - created, | ||
76 | - description, | ||
77 | - numberInProject, | ||
78 | - projectShortName, | ||
79 | - reporterName, | ||
80 | - resolved, | ||
81 | - summary, | ||
82 | - updated, | ||
83 | - updaterName | ||
84 | - } | ||
85 | } | 78 | } |
@@ -97,6 +97,11 @@ public class YoutrackAPI { | @@ -97,6 +97,11 @@ public class YoutrackAPI { | ||
97 | return new DefaultHttpClient(cm); | 97 | return new DefaultHttpClient(cm); |
98 | } | 98 | } |
99 | 99 | ||
100 | + private static boolean isBlank(String string) | ||
101 | + { | ||
102 | + return string != null && string.trim().length() > 0; | ||
103 | + } | ||
104 | + | ||
100 | // --------------------------- CONSTRUCTORS --------------------------- | 105 | // --------------------------- CONSTRUCTORS --------------------------- |
101 | 106 | ||
102 | public YoutrackAPI(String serviceLocation) | 107 | public YoutrackAPI(String serviceLocation) |
@@ -125,6 +130,37 @@ public class YoutrackAPI { | @@ -125,6 +130,37 @@ public class YoutrackAPI { | ||
125 | 130 | ||
126 | // -------------------------- OTHER METHODS -------------------------- | 131 | // -------------------------- OTHER METHODS -------------------------- |
127 | 132 | ||
133 | + public void command(String issueId, String command) throws IOException | ||
134 | + { | ||
135 | + command(issueId, command, null, null, null, null); | ||
136 | + } | ||
137 | + | ||
138 | + public void command(String issueId, Command command) throws IOException | ||
139 | + { | ||
140 | + command(issueId, command.toString()); | ||
141 | + } | ||
142 | + | ||
143 | + public void command(String issueId, String command, String comment, String group, Boolean disableNotifications, String runAs) throws IOException | ||
144 | + { | ||
145 | + final HttpPost request = new HttpPost(serviceLocation + "/rest/issue/" + issueId + "/execute"); | ||
146 | + final List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>(); | ||
147 | + parameters.add(new BasicNameValuePair("command", command)); | ||
148 | + if (isBlank(comment)) { | ||
149 | + parameters.add(new BasicNameValuePair("comment", comment)); | ||
150 | + } | ||
151 | + if (isBlank(group)) { | ||
152 | + parameters.add(new BasicNameValuePair("group", group)); | ||
153 | + } | ||
154 | + if (disableNotifications != null) { | ||
155 | + parameters.add(new BasicNameValuePair("disableNotifications", disableNotifications.toString())); | ||
156 | + } | ||
157 | + if (isBlank(runAs)) { | ||
158 | + parameters.add(new BasicNameValuePair("runAs", runAs)); | ||
159 | + } | ||
160 | + request.setEntity(new UrlEncodedFormEntity(parameters)); | ||
161 | + execute(request); | ||
162 | + } | ||
163 | + | ||
128 | /** | 164 | /** |
129 | * Creates new issue on Youtrack. | 165 | * Creates new issue on Youtrack. |
130 | * | 166 | * |
@@ -176,15 +212,9 @@ public class YoutrackAPI { | @@ -176,15 +212,9 @@ public class YoutrackAPI { | ||
176 | final String responseString; | 212 | final String responseString; |
177 | try { | 213 | try { |
178 | responseString = execute(new HttpGet(uri)); | 214 | responseString = execute(new HttpGet(uri)); |
179 | - } catch (HttpResponseException e) { | 215 | + } catch (YoutrackErrorException e) { |
180 | if (e.getStatusCode() == HttpStatus.SC_NOT_FOUND) { | 216 | if (e.getStatusCode() == HttpStatus.SC_NOT_FOUND) { |
181 | - try { | ||
182 | - final String error = ErrorUnmarshaller.unmarshal(e.getMessage()); | ||
183 | - throw new NoResultFoundException(error); | ||
184 | - } catch (JAXBException e1) { | ||
185 | - // TODO we should log on debug level the JAXBException | ||
186 | - throw e; | ||
187 | - } | 217 | + throw new NoResultFoundException(e.getMessage(), e); |
188 | } else { | 218 | } else { |
189 | throw e; | 219 | throw e; |
190 | } | 220 | } |
@@ -210,21 +240,7 @@ public class YoutrackAPI { | @@ -210,21 +240,7 @@ public class YoutrackAPI { | ||
210 | { | 240 | { |
211 | final HttpPost request = new HttpPost(serviceLocation + "/rest/user/login"); | 241 | final HttpPost request = new HttpPost(serviceLocation + "/rest/user/login"); |
212 | request.setEntity(new UrlEncodedFormEntity(Arrays.asList(new BasicNameValuePair("login", username), new BasicNameValuePair("password", password)))); | 242 | request.setEntity(new UrlEncodedFormEntity(Arrays.asList(new BasicNameValuePair("login", username), new BasicNameValuePair("password", password)))); |
213 | - try { | ||
214 | - execute(request); | ||
215 | - } catch (HttpResponseException e) { | ||
216 | - if (e.getStatusCode() == HttpStatus.SC_FORBIDDEN) { | ||
217 | - try { | ||
218 | - final String error = ErrorUnmarshaller.unmarshal(e.getMessage()); | ||
219 | - throw new YoutrackErrorException(error, e.getStatusCode()); | ||
220 | - } catch (JAXBException e1) { | ||
221 | - // TODO we should log on debug level the JAXBException | ||
222 | - throw e; | ||
223 | - } | ||
224 | - } else { | ||
225 | - throw e; | ||
226 | - } | ||
227 | - } | 243 | + execute(request); |
228 | } | 244 | } |
229 | 245 | ||
230 | public List<IssueWrapper> searchIssuesByProject(String project, Object filter) throws JAXBException, IOException | 246 | public List<IssueWrapper> searchIssuesByProject(String project, Object filter) throws JAXBException, IOException |
@@ -291,7 +307,13 @@ public class YoutrackAPI { | @@ -291,7 +307,13 @@ public class YoutrackAPI { | ||
291 | final HttpEntity entity = response.getEntity(); | 307 | final HttpEntity entity = response.getEntity(); |
292 | String responseText = entity == null ? null : EntityUtils.toString(entity); | 308 | String responseText = entity == null ? null : EntityUtils.toString(entity); |
293 | if (statusLine.getStatusCode() >= 300) { | 309 | if (statusLine.getStatusCode() >= 300) { |
294 | - throw new HttpResponseException(statusLine.getStatusCode(), responseText); | 310 | + try { |
311 | + final String error = ErrorUnmarshaller.unmarshal(responseText); | ||
312 | + throw new YoutrackErrorException(error, statusLine.getStatusCode()); | ||
313 | + } catch (JAXBException e) { | ||
314 | + // TODO we should log on debug level the JAXBException | ||
315 | + throw new HttpResponseException(statusLine.getStatusCode(), responseText); | ||
316 | + } | ||
295 | } | 317 | } |
296 | if (entity == null) { | 318 | if (entity == null) { |
297 | throw new ClientProtocolException("Response contains no content"); | 319 | throw new ClientProtocolException("Response contains no content"); |
1 | +package pl.com.it_crowd.youtrack.api.defaults; | ||
2 | + | ||
3 | +public enum DateValues { | ||
4 | + Today, Yesterday, Saturday, Friday, Thursday, Wednesday, Tuesday, Monday, Sunday, ThisWeek("{This week}"), LastWeek("{Last week}"), TwoWeeksAgo( | ||
5 | + "{Two weeks ago}"), ThreeWeeksAgo("{Three weeks ago}"), ThisMonth("{This month}"), LastMonth("{Last month}"); | ||
6 | + | ||
7 | +// ------------------------------ FIELDS ------------------------------ | ||
8 | + | ||
9 | + private String filterValue; | ||
10 | + | ||
11 | +// --------------------------- CONSTRUCTORS --------------------------- | ||
12 | + | ||
13 | + private DateValues() | ||
14 | + { | ||
15 | + filterValue = name(); | ||
16 | + } | ||
17 | + | ||
18 | + private DateValues(String filterValue) | ||
19 | + { | ||
20 | + this.filterValue = filterValue; | ||
21 | + } | ||
22 | + | ||
23 | +// --------------------- GETTER / SETTER METHODS --------------------- | ||
24 | + | ||
25 | + public String getFilterValue() | ||
26 | + { | ||
27 | + return filterValue; | ||
28 | + } | ||
29 | +} |
1 | +package pl.com.it_crowd.youtrack.api.defaults; | ||
2 | + | ||
3 | +public enum Fields { | ||
4 | + assignee, | ||
5 | + issueId("issue id"), | ||
6 | + state, | ||
7 | + created("created"), | ||
8 | + description, | ||
9 | + numberInProject(null), | ||
10 | + projectShortName("project"), | ||
11 | + reporterName("reporter"), | ||
12 | + resolved("resolved date"), | ||
13 | + summary, | ||
14 | + updated, | ||
15 | + updaterName("updated by"); | ||
16 | + | ||
17 | +// ------------------------------ FIELDS ------------------------------ | ||
18 | + | ||
19 | + private String command; | ||
20 | + | ||
21 | +// --------------------------- CONSTRUCTORS --------------------------- | ||
22 | + | ||
23 | + private Fields() | ||
24 | + { | ||
25 | + command = name(); | ||
26 | + } | ||
27 | + | ||
28 | + private Fields(String command) | ||
29 | + { | ||
30 | + this.command = command; | ||
31 | + } | ||
32 | + | ||
33 | +// --------------------- GETTER / SETTER METHODS --------------------- | ||
34 | + | ||
35 | + public String getCommand() | ||
36 | + { | ||
37 | + if (command == null) { | ||
38 | + throw new UnsupportedOperationException("There is no command for field: " + name()); | ||
39 | + } | ||
40 | + return command; | ||
41 | + } | ||
42 | +} |
1 | +package pl.com.it_crowd.youtrack.api.defaults; | ||
2 | + | ||
3 | +public enum StateValues { | ||
4 | + Submitted, Open, InProgress("{In Progress}", "In Progress"), ToBeDiscussed("{To be discussed}", "To be discussed"), Reopened, CantReproduce( | ||
5 | + "{Can't Reproduce}", "Can't Reproduce"), Duplicate, Fixed, WontFix("{Won't fix}", "Won't fix"), | ||
6 | + Incomplete, Obsolete, Verified, New, Resolved("Resolved", null), Unresolved("Unresolved", null); | ||
7 | + | ||
8 | +// ------------------------------ FIELDS ------------------------------ | ||
9 | + | ||
10 | + private String commandValue; | ||
11 | + | ||
12 | + private String filterValue; | ||
13 | + | ||
14 | +// --------------------------- CONSTRUCTORS --------------------------- | ||
15 | + | ||
16 | + private StateValues() | ||
17 | + { | ||
18 | + filterValue = name(); | ||
19 | + commandValue = name(); | ||
20 | + } | ||
21 | + | ||
22 | + private StateValues(String filterValue, String commandValue) | ||
23 | + { | ||
24 | + this.filterValue = filterValue; | ||
25 | + this.commandValue = commandValue; | ||
26 | + } | ||
27 | + | ||
28 | +// --------------------- GETTER / SETTER METHODS --------------------- | ||
29 | + | ||
30 | + public String getCommandValue() | ||
31 | + { | ||
32 | + return commandValue; | ||
33 | + } | ||
34 | + | ||
35 | + public String getFilterValue() | ||
36 | + { | ||
37 | + return filterValue; | ||
38 | + } | ||
39 | +} |
@@ -3,12 +3,8 @@ package pl.com.it_crowd.youtrack.api.exceptions; | @@ -3,12 +3,8 @@ package pl.com.it_crowd.youtrack.api.exceptions; | ||
3 | public class NoResultFoundException extends RuntimeException { | 3 | public class NoResultFoundException extends RuntimeException { |
4 | // --------------------------- CONSTRUCTORS --------------------------- | 4 | // --------------------------- CONSTRUCTORS --------------------------- |
5 | 5 | ||
6 | - public NoResultFoundException() | 6 | + public NoResultFoundException(String message, Throwable cause) |
7 | { | 7 | { |
8 | - } | ||
9 | - | ||
10 | - public NoResultFoundException(String message) | ||
11 | - { | ||
12 | - super(message); | 8 | + super(message, cause); |
13 | } | 9 | } |
14 | } | 10 | } |
1 | +package pl.com.it_crowd.youtrack.api.rest; | ||
2 | + | ||
3 | +import junit.framework.Assert; | ||
4 | +import org.junit.Test; | ||
5 | +import pl.com.it_crowd.youtrack.api.Command; | ||
6 | +import pl.com.it_crowd.youtrack.api.defaults.StateValues; | ||
7 | + | ||
8 | +public class CommandTest { | ||
9 | +// -------------------------- OTHER METHODS -------------------------- | ||
10 | + | ||
11 | + @Test | ||
12 | + public void assignee() | ||
13 | + { | ||
14 | + Assert.assertEquals("state Fixed assignee Tomek", Command.stateCommand("Fixed").assignee("Tomek").toString()); | ||
15 | + } | ||
16 | + | ||
17 | + @Test | ||
18 | + public void assigneeChaining() | ||
19 | + { | ||
20 | + Assert.assertEquals("assignee Jacek assignee Tomek assignee Bernard", | ||
21 | + Command.assigneeCommand("Jacek").assignee("Tomek").assignee("Bernard").toString()); | ||
22 | + } | ||
23 | + | ||
24 | + @Test | ||
25 | + public void assigneeCommand() | ||
26 | + { | ||
27 | + Assert.assertEquals("assignee Jacek", Command.assigneeCommand("Jacek").toString()); | ||
28 | + } | ||
29 | + | ||
30 | + @Test | ||
31 | + public void state() | ||
32 | + { | ||
33 | + Assert.assertEquals("assignee Tomek state Open", Command.assigneeCommand("Tomek").state("Open").toString()); | ||
34 | + Assert.assertEquals("assignee Tomek state To be discussed", Command.assigneeCommand("Tomek").state(StateValues.ToBeDiscussed).toString()); | ||
35 | + } | ||
36 | + | ||
37 | + @Test | ||
38 | + public void stateChaining() | ||
39 | + { | ||
40 | + Assert.assertEquals("state Fixed state Open state Obsolete", Command.stateCommand("Fixed").state("Open").state("Obsolete").toString()); | ||
41 | + Assert.assertEquals("state Fixed state Open state Obsolete", Command.stateCommand("Fixed").state(StateValues.Open).state("Obsolete").toString()); | ||
42 | + } | ||
43 | + | ||
44 | + @Test | ||
45 | + public void stateCommand() | ||
46 | + { | ||
47 | + Assert.assertEquals("state Fixed", Command.stateCommand("Fixed").toString()); | ||
48 | + Assert.assertEquals("state In Progress", Command.stateCommand(StateValues.InProgress).toString()); | ||
49 | + } | ||
50 | +} |
1 | +package pl.com.it_crowd.youtrack.api.rest; | ||
2 | + | ||
3 | +import junit.framework.Assert; | ||
4 | +import org.junit.Test; | ||
5 | +import pl.com.it_crowd.youtrack.api.Filter; | ||
6 | +import pl.com.it_crowd.youtrack.api.defaults.DateValues; | ||
7 | +import pl.com.it_crowd.youtrack.api.defaults.StateValues; | ||
8 | + | ||
9 | +import java.io.UnsupportedEncodingException; | ||
10 | +import java.net.URLEncoder; | ||
11 | + | ||
12 | +public class FilterTest { | ||
13 | +// -------------------------- STATIC METHODS -------------------------- | ||
14 | + | ||
15 | + private static String encodeURL(String s) | ||
16 | + { | ||
17 | + try { | ||
18 | + return URLEncoder.encode(s, "UTF-8"); | ||
19 | + } catch (UnsupportedEncodingException e) { | ||
20 | + throw new RuntimeException(e); | ||
21 | + } | ||
22 | + } | ||
23 | + | ||
24 | +// -------------------------- OTHER METHODS -------------------------- | ||
25 | + | ||
26 | + @Test | ||
27 | + public void chaining() | ||
28 | + { | ||
29 | + final String reporterBernard = "reporter:bernard"; | ||
30 | + final String updaterJacek = "updated by:Jacek"; | ||
31 | + final String projectTST_QA = "project:TST_QA"; | ||
32 | + final String resolvedSunday = "resolved date:Sunday"; | ||
33 | + final String updatedThreeWeeksAgo = "updated:" + encodeURL("{Three weeks ago}"); | ||
34 | + final String createdLastMonth = "created:" + encodeURL("{Last month}"); | ||
35 | + final String stateDuplicate = "state:" + encodeURL("Duplicate"); | ||
36 | + final String space = encodeURL(" "); | ||
37 | + Assert.assertEquals(stateDuplicate + space + createdLastMonth, Filter.stateFilter(StateValues.Duplicate).created(DateValues.LastMonth).toString()); | ||
38 | + Assert.assertEquals(createdLastMonth + space + stateDuplicate, Filter.createdFilter(DateValues.LastMonth).state(StateValues.Duplicate).toString()); | ||
39 | + Assert.assertEquals(createdLastMonth + space + stateDuplicate + space + "description:pikachu", | ||
40 | + Filter.createdFilter(DateValues.LastMonth).state(StateValues.Duplicate).description("pikachu").toString()); | ||
41 | + Assert.assertEquals(reporterBernard + space + projectTST_QA, Filter.reporterFilter("bernard").project("TST_QA").toString()); | ||
42 | + Assert.assertEquals(projectTST_QA + space + reporterBernard, Filter.projectFilter("TST_QA").reporter("bernard").toString()); | ||
43 | + Assert.assertEquals(resolvedSunday + space + updatedThreeWeeksAgo, Filter.resolvedFilter("Sunday").updated(DateValues.ThreeWeeksAgo).toString()); | ||
44 | + Assert.assertEquals(updatedThreeWeeksAgo + space + resolvedSunday, Filter.updatedFilter(DateValues.ThreeWeeksAgo).resolved("Sunday").toString()); | ||
45 | + Assert.assertEquals(updatedThreeWeeksAgo + space + updaterJacek, Filter.updatedFilter("{Three weeks ago}").updater("Jacek").toString()); | ||
46 | + Assert.assertEquals(updaterJacek + space + updatedThreeWeeksAgo, Filter.updaterFilter("Jacek").updated("{Three weeks ago}").toString()); | ||
47 | + } | ||
48 | + | ||
49 | + @Test | ||
50 | + public void createdFilter() | ||
51 | + { | ||
52 | + Assert.assertEquals("created:" + encodeURL("2012-01-01"), Filter.createdFilter("2012-01-01").toString()); | ||
53 | + Assert.assertEquals("created:" + encodeURL("{Last month}"), Filter.createdFilter(DateValues.LastMonth).toString()); | ||
54 | + Assert.assertEquals("created:" + encodeURL("{This month}"), Filter.createdFilter(DateValues.ThisMonth).toString()); | ||
55 | + Assert.assertEquals("created:" + encodeURL("{Two weeks ago}"), Filter.createdFilter(DateValues.TwoWeeksAgo).toString()); | ||
56 | + Assert.assertEquals("created:" + encodeURL("{Three weeks ago}"), Filter.createdFilter(DateValues.ThreeWeeksAgo).toString()); | ||
57 | + Assert.assertEquals("created:" + encodeURL("{Last week}"), Filter.createdFilter(DateValues.LastWeek).toString()); | ||
58 | + Assert.assertEquals("created:" + encodeURL("{This week}"), Filter.createdFilter(DateValues.ThisWeek).toString()); | ||
59 | + Assert.assertEquals("created:" + encodeURL("Saturday"), Filter.createdFilter(DateValues.Saturday).toString()); | ||
60 | + Assert.assertEquals("created:" + encodeURL("Friday"), Filter.createdFilter(DateValues.Friday).toString()); | ||
61 | + Assert.assertEquals("created:" + encodeURL("Thursday"), Filter.createdFilter(DateValues.Thursday).toString()); | ||
62 | + Assert.assertEquals("created:" + encodeURL("Wednesday"), Filter.createdFilter(DateValues.Wednesday).toString()); | ||
63 | + Assert.assertEquals("created:" + encodeURL("Tuesday"), Filter.createdFilter(DateValues.Tuesday).toString()); | ||
64 | + Assert.assertEquals("created:" + encodeURL("Monday"), Filter.createdFilter(DateValues.Monday).toString()); | ||
65 | + Assert.assertEquals("created:" + encodeURL("Sunday"), Filter.createdFilter(DateValues.Sunday).toString()); | ||
66 | + } | ||
67 | + | ||
68 | + @Test | ||
69 | + public void descriptionFilter() | ||
70 | + { | ||
71 | + Assert.assertEquals("description:" + encodeURL("Wacek Ramtamtamski's"), Filter.descriptionFilter("Wacek Ramtamtamski's").toString()); | ||
72 | + } | ||
73 | + | ||
74 | + @Test | ||
75 | + public void projectFilter() | ||
76 | + { | ||
77 | + Assert.assertEquals("project:TST", Filter.projectFilter("TST").toString()); | ||
78 | + } | ||
79 | + | ||
80 | + @Test | ||
81 | + public void reporterFilter() | ||
82 | + { | ||
83 | + Assert.assertEquals("reporter:bernard", Filter.reporterFilter("bernard").toString()); | ||
84 | + } | ||
85 | + | ||
86 | + @Test | ||
87 | + public void resolvedFilter() | ||
88 | + { | ||
89 | + Assert.assertEquals("resolved date:" + encodeURL("2012-01-01"), Filter.resolvedFilter("2012-01-01").toString()); | ||
90 | + Assert.assertEquals("resolved date:" + encodeURL("{Last month}"), Filter.resolvedFilter(DateValues.LastMonth).toString()); | ||
91 | + Assert.assertEquals("resolved date:" + encodeURL("{This month}"), Filter.resolvedFilter(DateValues.ThisMonth).toString()); | ||
92 | + Assert.assertEquals("resolved date:" + encodeURL("{Two weeks ago}"), Filter.resolvedFilter(DateValues.TwoWeeksAgo).toString()); | ||
93 | + Assert.assertEquals("resolved date:" + encodeURL("{Three weeks ago}"), Filter.resolvedFilter(DateValues.ThreeWeeksAgo).toString()); | ||
94 | + Assert.assertEquals("resolved date:" + encodeURL("{Last week}"), Filter.resolvedFilter(DateValues.LastWeek).toString()); | ||
95 | + Assert.assertEquals("resolved date:" + encodeURL("{This week}"), Filter.resolvedFilter(DateValues.ThisWeek).toString()); | ||
96 | + Assert.assertEquals("resolved date:" + encodeURL("Saturday"), Filter.resolvedFilter(DateValues.Saturday).toString()); | ||
97 | + Assert.assertEquals("resolved date:" + encodeURL("Friday"), Filter.resolvedFilter(DateValues.Friday).toString()); | ||
98 | + Assert.assertEquals("resolved date:" + encodeURL("Thursday"), Filter.resolvedFilter(DateValues.Thursday).toString()); | ||
99 | + Assert.assertEquals("resolved date:" + encodeURL("Wednesday"), Filter.resolvedFilter(DateValues.Wednesday).toString()); | ||
100 | + Assert.assertEquals("resolved date:" + encodeURL("Tuesday"), Filter.resolvedFilter(DateValues.Tuesday).toString()); | ||
101 | + Assert.assertEquals("resolved date:" + encodeURL("Monday"), Filter.resolvedFilter(DateValues.Monday).toString()); | ||
102 | + Assert.assertEquals("resolved date:" + encodeURL("Sunday"), Filter.resolvedFilter(DateValues.Sunday).toString()); | ||
103 | + } | ||
104 | + | ||
105 | + @Test | ||
106 | + public void stateFilter() | ||
107 | + { | ||
108 | + Assert.assertEquals("state:" + encodeURL("{Can't Reproduce}"), Filter.stateFilter(StateValues.CantReproduce).toString()); | ||
109 | + Assert.assertEquals("state:" + encodeURL("Verified"), Filter.stateFilter(StateValues.Verified).toString()); | ||
110 | + Assert.assertEquals("state:" + encodeURL("Submitted"), Filter.stateFilter(StateValues.Submitted).toString()); | ||
111 | + Assert.assertEquals("state:" + encodeURL("Reopened"), Filter.stateFilter(StateValues.Reopened).toString()); | ||
112 | + Assert.assertEquals("state:" + encodeURL("{To be discussed}"), Filter.stateFilter(StateValues.ToBeDiscussed).toString()); | ||
113 | + Assert.assertEquals("state:" + encodeURL("Duplicate"), Filter.stateFilter(StateValues.Duplicate).toString()); | ||
114 | + Assert.assertEquals("state:" + encodeURL("Resolved"), Filter.stateFilter(StateValues.Resolved).toString()); | ||
115 | + Assert.assertEquals("state:" + encodeURL("Fixed"), Filter.stateFilter(StateValues.Fixed).toString()); | ||
116 | + Assert.assertEquals("state:" + encodeURL("Incomplete"), Filter.stateFilter(StateValues.Incomplete).toString()); | ||
117 | + Assert.assertEquals("state:" + encodeURL("{In Progress}"), Filter.stateFilter(StateValues.InProgress).toString()); | ||
118 | + Assert.assertEquals("state:" + encodeURL("New"), Filter.stateFilter(StateValues.New).toString()); | ||
119 | + Assert.assertEquals("state:" + encodeURL("Obsolete"), Filter.stateFilter(StateValues.Obsolete).toString()); | ||
120 | + Assert.assertEquals("state:" + encodeURL("Open"), Filter.stateFilter(StateValues.Open).toString()); | ||
121 | + Assert.assertEquals("state:" + encodeURL("{Won't fix}"), Filter.stateFilter(StateValues.WontFix).toString()); | ||
122 | + } | ||
123 | + | ||
124 | + @Test | ||
125 | + public void updatedFilter() | ||
126 | + { | ||
127 | + Assert.assertEquals("updated:" + encodeURL("Today"), Filter.updatedFilter(DateValues.Today).toString()); | ||
128 | + Assert.assertEquals("updated:" + encodeURL("Yesterday"), Filter.updatedFilter(DateValues.Yesterday).toString()); | ||
129 | + Assert.assertEquals("updated:" + encodeURL("2012-01-01"), Filter.updatedFilter("2012-01-01").toString()); | ||
130 | + Assert.assertEquals("updated:" + encodeURL("{Last month}"), Filter.updatedFilter(DateValues.LastMonth).toString()); | ||
131 | + Assert.assertEquals("updated:" + encodeURL("{This month}"), Filter.updatedFilter(DateValues.ThisMonth).toString()); | ||
132 | + Assert.assertEquals("updated:" + encodeURL("{Two weeks ago}"), Filter.updatedFilter(DateValues.TwoWeeksAgo).toString()); | ||
133 | + Assert.assertEquals("updated:" + encodeURL("{Three weeks ago}"), Filter.updatedFilter(DateValues.ThreeWeeksAgo).toString()); | ||
134 | + Assert.assertEquals("updated:" + encodeURL("{Last week}"), Filter.updatedFilter(DateValues.LastWeek).toString()); | ||
135 | + Assert.assertEquals("updated:" + encodeURL("{This week}"), Filter.updatedFilter(DateValues.ThisWeek).toString()); | ||
136 | + Assert.assertEquals("updated:" + encodeURL("Saturday"), Filter.updatedFilter(DateValues.Saturday).toString()); | ||
137 | + Assert.assertEquals("updated:" + encodeURL("Friday"), Filter.updatedFilter(DateValues.Friday).toString()); | ||
138 | + Assert.assertEquals("updated:" + encodeURL("Thursday"), Filter.updatedFilter(DateValues.Thursday).toString()); | ||
139 | + Assert.assertEquals("updated:" + encodeURL("Wednesday"), Filter.updatedFilter(DateValues.Wednesday).toString()); | ||
140 | + Assert.assertEquals("updated:" + encodeURL("Tuesday"), Filter.updatedFilter(DateValues.Tuesday).toString()); | ||
141 | + Assert.assertEquals("updated:" + encodeURL("Monday"), Filter.updatedFilter(DateValues.Monday).toString()); | ||
142 | + Assert.assertEquals("updated:" + encodeURL("Sunday"), Filter.updatedFilter(DateValues.Sunday).toString()); | ||
143 | + } | ||
144 | + | ||
145 | + @Test | ||
146 | + | ||
147 | + public void updaterFilter() | ||
148 | + { | ||
149 | + Assert.assertEquals("updated by:bernard", Filter.updaterFilter("bernard").toString()); | ||
150 | + } | ||
151 | +} |
@@ -4,8 +4,11 @@ import junit.framework.Assert; | @@ -4,8 +4,11 @@ import junit.framework.Assert; | ||
4 | import org.apache.http.HttpStatus; | 4 | import org.apache.http.HttpStatus; |
5 | import org.apache.http.auth.AuthenticationException; | 5 | import org.apache.http.auth.AuthenticationException; |
6 | import org.junit.Test; | 6 | import org.junit.Test; |
7 | +import pl.com.it_crowd.youtrack.api.Command; | ||
7 | import pl.com.it_crowd.youtrack.api.IssueWrapper; | 8 | import pl.com.it_crowd.youtrack.api.IssueWrapper; |
8 | import pl.com.it_crowd.youtrack.api.YoutrackAPI; | 9 | import pl.com.it_crowd.youtrack.api.YoutrackAPI; |
10 | +import pl.com.it_crowd.youtrack.api.defaults.Fields; | ||
11 | +import pl.com.it_crowd.youtrack.api.defaults.StateValues; | ||
9 | import pl.com.it_crowd.youtrack.api.exceptions.NoResultFoundException; | 12 | import pl.com.it_crowd.youtrack.api.exceptions.NoResultFoundException; |
10 | import pl.com.it_crowd.youtrack.api.exceptions.YoutrackErrorException; | 13 | import pl.com.it_crowd.youtrack.api.exceptions.YoutrackErrorException; |
11 | 14 | ||
@@ -16,11 +19,72 @@ import java.util.List; | @@ -16,11 +19,72 @@ import java.util.List; | ||
16 | /** | 19 | /** |
17 | * This test requires Youtrack instance with "Test(TST)" project to be running and expects following JVM params: | 20 | * This test requires Youtrack instance with "Test(TST)" project to be running and expects following JVM params: |
18 | * youtrackLocation, youtrackUsername and youtrackPassword. | 21 | * youtrackLocation, youtrackUsername and youtrackPassword. |
22 | + * There should be no assigner "wacek" for project TST. | ||
23 | + * There should be following assigners for TST project: bernard,root. | ||
24 | + * Ticket TST-2 should be deleted. | ||
19 | */ | 25 | */ |
20 | public class YoutrackAPITest { | 26 | public class YoutrackAPITest { |
21 | // -------------------------- OTHER METHODS -------------------------- | 27 | // -------------------------- OTHER METHODS -------------------------- |
22 | 28 | ||
23 | @Test | 29 | @Test |
30 | + public void commandAllStatesTest() throws IOException, JAXBException | ||
31 | + { | ||
32 | + final YoutrackAPI api = new YoutrackAPI(getServiceLocation(), getUsername(), getPassword()); | ||
33 | + final String issueId = "TST-1"; | ||
34 | + IssueWrapper issue; | ||
35 | + final StateValues[] stateValueses = StateValues.values(); | ||
36 | + for (StateValues state : stateValueses) { | ||
37 | + if (state.getCommandValue() != null && !StateValues.Duplicate.equals(state)) { | ||
38 | + api.command(issueId, Command.stateCommand(state)); | ||
39 | + issue = api.getIssue(issueId); | ||
40 | + Assert.assertNotNull(issue); | ||
41 | + Assert.assertEquals(state.getCommandValue(), issue.getFieldValue(Fields.state)); | ||
42 | + } | ||
43 | + } | ||
44 | + } | ||
45 | + | ||
46 | + @Test | ||
47 | + public void commandTest() throws IOException, JAXBException | ||
48 | + { | ||
49 | + final YoutrackAPI api = new YoutrackAPI(getServiceLocation(), getUsername(), getPassword()); | ||
50 | + final String issueId = "TST-1"; | ||
51 | + IssueWrapper issue; | ||
52 | + try { | ||
53 | + api.command(issueId, Command.assigneeCommand("wacek").toString()); | ||
54 | + Assert.fail("Command should fail"); | ||
55 | + } catch (YoutrackErrorException e) { | ||
56 | +// There is no such assignee | ||
57 | + Assert.assertEquals(HttpStatus.SC_BAD_REQUEST, e.getStatusCode()); | ||
58 | + } | ||
59 | + api.command(issueId, Command.assigneeCommand("bernard").assignee("root")); | ||
60 | + issue = api.getIssue(issueId); | ||
61 | + Assert.assertNotNull(issue); | ||
62 | + Assert.assertEquals("root", issue.getFieldValue(Fields.assignee)); | ||
63 | + | ||
64 | + api.command(issueId, Command.assigneeCommand("bernard")); | ||
65 | + issue = api.getIssue(issueId); | ||
66 | + Assert.assertNotNull(issue); | ||
67 | + Assert.assertEquals("bernard", issue.getFieldValue(Fields.assignee)); | ||
68 | + | ||
69 | + api.command(issueId, Command.stateCommand(StateValues.InProgress)); | ||
70 | + issue = api.getIssue(issueId); | ||
71 | + Assert.assertNotNull(issue); | ||
72 | + Assert.assertEquals("In Progress", issue.getFieldValue(Fields.state)); | ||
73 | + | ||
74 | + api.command(issueId, Command.stateCommand(StateValues.InProgress).assignee("root")); | ||
75 | + issue = api.getIssue(issueId); | ||
76 | + Assert.assertNotNull(issue); | ||
77 | + Assert.assertEquals("In Progress", issue.getFieldValue(Fields.state)); | ||
78 | + Assert.assertEquals("root", issue.getFieldValue(Fields.assignee)); | ||
79 | + | ||
80 | + api.command(issueId, Command.assigneeCommand("bernard").state(StateValues.New)); | ||
81 | + issue = api.getIssue(issueId); | ||
82 | + Assert.assertNotNull(issue); | ||
83 | + Assert.assertEquals("New", issue.getFieldValue(Fields.state)); | ||
84 | + Assert.assertEquals("bernard", issue.getFieldValue(Fields.assignee)); | ||
85 | + } | ||
86 | + | ||
87 | + @Test | ||
24 | public void createIssueTest() throws IOException, AuthenticationException, JAXBException | 88 | public void createIssueTest() throws IOException, AuthenticationException, JAXBException |
25 | { | 89 | { |
26 | YoutrackAPI api = new YoutrackAPI(getServiceLocation(), getUsername(), getPassword()); | 90 | YoutrackAPI api = new YoutrackAPI(getServiceLocation(), getUsername(), getPassword()); |
@@ -35,6 +99,7 @@ public class YoutrackAPITest { | @@ -35,6 +99,7 @@ public class YoutrackAPITest { | ||
35 | YoutrackAPI api = new YoutrackAPI(getServiceLocation(), getUsername(), getPassword()); | 99 | YoutrackAPI api = new YoutrackAPI(getServiceLocation(), getUsername(), getPassword()); |
36 | final IssueWrapper issue = api.getIssue("TST-1"); | 100 | final IssueWrapper issue = api.getIssue("TST-1"); |
37 | Assert.assertNotNull(issue); | 101 | Assert.assertNotNull(issue); |
102 | + Assert.assertEquals("1", issue.getFieldValue(Fields.numberInProject)); | ||
38 | 103 | ||
39 | try { | 104 | try { |
40 | api.getIssue("TST-2"); | 105 | api.getIssue("TST-2"); |
@@ -81,7 +146,7 @@ public class YoutrackAPITest { | @@ -81,7 +146,7 @@ public class YoutrackAPITest { | ||
81 | List<IssueWrapper> issues = api.searchIssuesByProject("TST", null); | 146 | List<IssueWrapper> issues = api.searchIssuesByProject("TST", null); |
82 | Assert.assertTrue(!issues.isEmpty()); | 147 | Assert.assertTrue(!issues.isEmpty()); |
83 | for (IssueWrapper issue : issues) { | 148 | for (IssueWrapper issue : issues) { |
84 | - String summary = issue.getFieldValue(IssueWrapper.Fields.summary); | 149 | + String summary = issue.getFieldValue(Fields.summary); |
85 | Assert.assertNotNull(summary); | 150 | Assert.assertNotNull(summary); |
86 | Assert.assertTrue(!"".equals(summary.trim())); | 151 | Assert.assertTrue(!"".equals(summary.trim())); |
87 | } | 152 | } |
Please
register
or
login
to post a comment