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 | 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 | 7 | import java.io.UnsupportedEncodingException; |
4 | 8 | import java.net.URLEncoder; |
5 | 9 | import java.util.ArrayList; |
6 | 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 | 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 | 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 | 96 | // --------------------------- CONSTRUCTORS --------------------------- |
43 | 97 | |
44 | - private Filter() | |
45 | - { | |
98 | + private Filter() | |
99 | + { | |
46 | 100 | |
47 | - } | |
101 | + } | |
48 | 102 | |
49 | 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 | 121 | try { |
57 | - space = URLEncoder.encode(" ", "UTF-8"); | |
122 | + builder.append(URLEncoder.encode(condition.value, "UTF-8")); | |
58 | 123 | } catch (UnsupportedEncodingException e) { |
59 | 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 | 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 | 234 | // -------------------------- INNER CLASSES -------------------------- |
132 | 235 | |
133 | - private class Condition { | |
236 | + private class Condition { | |
134 | 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 | 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 | 2 | |
3 | 3 | import org.apache.commons.logging.Log; |
4 | 4 | import org.apache.commons.logging.LogFactory; |
5 | +import pl.com.it_crowd.youtrack.api.defaults.Fields; | |
5 | 6 | import pl.com.it_crowd.youtrack.api.rest.Comment; |
6 | 7 | import pl.com.it_crowd.youtrack.api.rest.Field; |
7 | 8 | import pl.com.it_crowd.youtrack.api.rest.Issue; |
8 | 9 | |
9 | 10 | import java.io.Serializable; |
10 | 11 | import java.util.ArrayList; |
12 | +import java.util.Collections; | |
11 | 13 | import java.util.HashMap; |
12 | 14 | import java.util.List; |
13 | 15 | import java.util.Map; |
... | ... | @@ -33,7 +35,7 @@ public class IssueWrapper implements Serializable { |
33 | 35 | for (Object o : issue.getFieldOrComment()) { |
34 | 36 | if (o instanceof Field) { |
35 | 37 | Field field = (Field) o; |
36 | - fieldMap.put(field.getName(), field); | |
38 | + fieldMap.put(field.getName().toLowerCase(), field); | |
37 | 39 | } else if (o instanceof Comment) { |
38 | 40 | comments.add((Comment) o); |
39 | 41 | } else { |
... | ... | @@ -44,6 +46,11 @@ public class IssueWrapper implements Serializable { |
44 | 46 | |
45 | 47 | // -------------------------- OTHER METHODS -------------------------- |
46 | 48 | |
49 | + public List<Comment> getComments() | |
50 | + { | |
51 | + return Collections.unmodifiableList(comments); | |
52 | + } | |
53 | + | |
47 | 54 | public Field getField(String field) |
48 | 55 | { |
49 | 56 | return fieldMap.get(field); |
... | ... | @@ -51,7 +58,7 @@ public class IssueWrapper implements Serializable { |
51 | 58 | |
52 | 59 | public String getFieldValue(String fieldName) |
53 | 60 | { |
54 | - Field field = getField(fieldName); | |
61 | + Field field = getField(fieldName.toLowerCase()); | |
55 | 62 | if (field == null) { |
56 | 63 | return null; |
57 | 64 | } |
... | ... | @@ -59,27 +66,13 @@ public class IssueWrapper implements Serializable { |
59 | 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 | 74 | public String getId() |
68 | 75 | { |
69 | 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 | 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 | 105 | // --------------------------- CONSTRUCTORS --------------------------- |
101 | 106 | |
102 | 107 | public YoutrackAPI(String serviceLocation) |
... | ... | @@ -125,6 +130,37 @@ public class YoutrackAPI { |
125 | 130 | |
126 | 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 | 165 | * Creates new issue on Youtrack. |
130 | 166 | * |
... | ... | @@ -176,15 +212,9 @@ public class YoutrackAPI { |
176 | 212 | final String responseString; |
177 | 213 | try { |
178 | 214 | responseString = execute(new HttpGet(uri)); |
179 | - } catch (HttpResponseException e) { | |
215 | + } catch (YoutrackErrorException e) { | |
180 | 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 | 218 | } else { |
189 | 219 | throw e; |
190 | 220 | } |
... | ... | @@ -210,21 +240,7 @@ public class YoutrackAPI { |
210 | 240 | { |
211 | 241 | final HttpPost request = new HttpPost(serviceLocation + "/rest/user/login"); |
212 | 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 | 246 | public List<IssueWrapper> searchIssuesByProject(String project, Object filter) throws JAXBException, IOException |
... | ... | @@ -291,7 +307,13 @@ public class YoutrackAPI { |
291 | 307 | final HttpEntity entity = response.getEntity(); |
292 | 308 | String responseText = entity == null ? null : EntityUtils.toString(entity); |
293 | 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 | 318 | if (entity == null) { |
297 | 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 | 3 | public class NoResultFoundException extends RuntimeException { |
4 | 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 | 4 | import org.apache.http.HttpStatus; |
5 | 5 | import org.apache.http.auth.AuthenticationException; |
6 | 6 | import org.junit.Test; |
7 | +import pl.com.it_crowd.youtrack.api.Command; | |
7 | 8 | import pl.com.it_crowd.youtrack.api.IssueWrapper; |
8 | 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 | 12 | import pl.com.it_crowd.youtrack.api.exceptions.NoResultFoundException; |
10 | 13 | import pl.com.it_crowd.youtrack.api.exceptions.YoutrackErrorException; |
11 | 14 | |
... | ... | @@ -16,11 +19,72 @@ import java.util.List; |
16 | 19 | /** |
17 | 20 | * This test requires Youtrack instance with "Test(TST)" project to be running and expects following JVM params: |
18 | 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 | 26 | public class YoutrackAPITest { |
21 | 27 | // -------------------------- OTHER METHODS -------------------------- |
22 | 28 | |
23 | 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 | 88 | public void createIssueTest() throws IOException, AuthenticationException, JAXBException |
25 | 89 | { |
26 | 90 | YoutrackAPI api = new YoutrackAPI(getServiceLocation(), getUsername(), getPassword()); |
... | ... | @@ -35,6 +99,7 @@ public class YoutrackAPITest { |
35 | 99 | YoutrackAPI api = new YoutrackAPI(getServiceLocation(), getUsername(), getPassword()); |
36 | 100 | final IssueWrapper issue = api.getIssue("TST-1"); |
37 | 101 | Assert.assertNotNull(issue); |
102 | + Assert.assertEquals("1", issue.getFieldValue(Fields.numberInProject)); | |
38 | 103 | |
39 | 104 | try { |
40 | 105 | api.getIssue("TST-2"); |
... | ... | @@ -81,7 +146,7 @@ public class YoutrackAPITest { |
81 | 146 | List<IssueWrapper> issues = api.searchIssuesByProject("TST", null); |
82 | 147 | Assert.assertTrue(!issues.isEmpty()); |
83 | 148 | for (IssueWrapper issue : issues) { |
84 | - String summary = issue.getFieldValue(IssueWrapper.Fields.summary); | |
149 | + String summary = issue.getFieldValue(Fields.summary); | |
85 | 150 | Assert.assertNotNull(summary); |
86 | 151 | Assert.assertTrue(!"".equals(summary.trim())); |
87 | 152 | } | ... | ... |
Please
register
or
login
to post a comment