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