From a213fbd6426fd6f750922ac8f2d204c659685ff6 Mon Sep 17 00:00:00 2001 From: Tomas Bjerre Date: Thu, 16 Apr 2015 00:15:15 +0200 Subject: [PATCH] Custom HTTP headers, proxy support, PULL_REQUEST_COMMENT_TEXT and PULL_REQUEST_VERSION variables Also: * Marking plugin as compatible with Stash Data Center * Replacing spaces in URL with %20 --- CHANGELOG.md | 6 + README.md | 4 + sandbox/all.png | Bin 78620 -> 35758 bytes sandbox/closer.png | Bin 52691 -> 28769 bytes .../se/bjurr/prnfs/admin/AdminFormValues.java | 2 +- .../PrnfsPullRequestEventListener.java | 43 +++- .../bjurr/prnfs/listener/PrnfsRenderer.java | 15 ++ .../se/bjurr/prnfs/listener/UrlInvoker.java | 151 ++++++++++-- .../java/se/bjurr/prnfs/settings/Header.java | 24 ++ .../prnfs/settings/PrnfsNotification.java | 35 ++- .../settings/PrnfsNotificationBuilder.java | 36 ++- .../bjurr/prnfs/settings/SettingsStorage.java | 71 ++++-- src/main/resources/admin.css | 10 + src/main/resources/admin.js | 47 ++++ src/main/resources/admin.vm | 47 +++- src/main/resources/atlassian-plugin.xml | 1 + .../PrnfsPullRequestEventListenerTest.java | 224 ++++++++++++++++-- .../prnfs/admin/utils/PrnfsTestBuilder.java | 157 +++++++----- .../admin/utils/PullRequestEventBuilder.java | 15 ++ .../listener/PrnfsPullRequestActionTest.java | 3 - .../bjurr/prnfs/listener/UrlInvokerTest.java | 52 ---- 21 files changed, 749 insertions(+), 194 deletions(-) create mode 100644 src/main/java/se/bjurr/prnfs/settings/Header.java delete mode 100644 src/test/java/se/bjurr/prnfs/listener/UrlInvokerTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 55476232..ad557613 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ Changelog of Pull Request Notifier for Stash. +## 1.11 +* Custom HTTP headers +* Proxy support +* Stash Data Center compatibility +* Adding PULL_REQUEST_COMMENT_TEXT and PULL_REQUEST_VERSION variables + ## 1.10 * Adding PULL_REQUEST_FROM_BRANCH and PULL_REQUEST_TO_BRANCH variables to make branch names available diff --git a/README.md b/README.md index 05543b82..971290d0 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,14 @@ The Pull Request Notifier for Stash can: * Be configured to trigger on any pull request event. Including source branch change (RESCOPED_FROM) and target branch change (RESCOPED_TO). * Be configured to only trigger if the pull request mathches a filter. A filter text is constructed with any combination of the variables and then a regexp is constructed to match that text. * Authenticate with HTTP basic authentication. +* Send custom HTTP headers +* Can optionally use proxy to connect The filter text as well as the URL support variables. These are: * ${PULL_REQUEST_ID} Example: 1 +* ${PULL_REQUEST_VERSION} Example: 1 +* ${PULL_REQUEST_COMMENT_TEXT} Example: A comment * ${PULL_REQUEST_ACTION} Example: OPENED * ${PULL_REQUEST_AUTHOR_DISPLAY_NAME} Example: Administrator * ${PULL_REQUEST_AUTHOR_EMAIL} Example: admin@example.com diff --git a/sandbox/all.png b/sandbox/all.png index fa6f4e5f37c6e7285e72a05f2675e2131c39a023..612766a5a0a66be523443d9108c39f6d4debdce1 100644 GIT binary patch literal 35758 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 Sl?l8smBG{1&t;ucLK6TY$fu?N literal 78620 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
  • ~_O8wxA_Y}JlBmG~ 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

    >Ao|Qw-N%pEL&b0c6w6vSM6(ZM4Hd2p| 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 literal 52691 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 { public static final String VALUE = "value"; public enum FIELDS { - user, password, events, FORM_IDENTIFIER, url, filter_string, filter_regexp, method, post_content + user, password, events, FORM_IDENTIFIER, url, filter_string, filter_regexp, method, post_content, proxy_user, proxy_password, proxy_server, proxy_port, header_name, header_value } } diff --git a/src/main/java/se/bjurr/prnfs/listener/PrnfsPullRequestEventListener.java b/src/main/java/se/bjurr/prnfs/listener/PrnfsPullRequestEventListener.java index dc0f1cb5..f3a39fa0 100644 --- a/src/main/java/se/bjurr/prnfs/listener/PrnfsPullRequestEventListener.java +++ b/src/main/java/se/bjurr/prnfs/listener/PrnfsPullRequestEventListener.java @@ -1,13 +1,18 @@ package se.bjurr.prnfs.listener; +import static com.google.common.base.Charsets.UTF_8; import static com.google.common.base.Optional.absent; import static java.util.regex.Pattern.compile; +import static javax.ws.rs.core.HttpHeaders.AUTHORIZATION; +import static javax.xml.bind.DatatypeConverter.printBase64Binary; import static se.bjurr.prnfs.listener.PrnfsPullRequestAction.fromPullRequestEvent; +import static se.bjurr.prnfs.listener.UrlInvoker.urlInvoker; import static se.bjurr.prnfs.settings.SettingsStorage.getPrnfsSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import se.bjurr.prnfs.settings.Header; import se.bjurr.prnfs.settings.PrnfsNotification; import se.bjurr.prnfs.settings.PrnfsSettings; import se.bjurr.prnfs.settings.ValidationException; @@ -29,17 +34,27 @@ public class PrnfsPullRequestEventListener { - private UrlInvoker urlInvoker = new UrlInvoker(); + public interface Invoker { + void invoke(UrlInvoker urlInvoker); + } + private final PluginSettingsFactory pluginSettingsFactory; private static final Logger logger = LoggerFactory.getLogger(PrnfsPullRequestEventListener.class); - public PrnfsPullRequestEventListener(PluginSettingsFactory pluginSettingsFactory) { - this.pluginSettingsFactory = pluginSettingsFactory; - } + private static Invoker invoker = new Invoker() { + @Override + public void invoke(UrlInvoker urlInvoker) { + urlInvoker.invoke(); + } + }; @VisibleForTesting - public void setUrlInvoker(UrlInvoker urlInvoker) { - this.urlInvoker = urlInvoker; + public static void setInvoker(Invoker invoker) { + PrnfsPullRequestEventListener.invoker = invoker; + } + + public PrnfsPullRequestEventListener(PluginSettingsFactory pluginSettingsFactory) { + this.pluginSettingsFactory = pluginSettingsFactory; } @EventListener @@ -102,7 +117,21 @@ public void handleEvent(PullRequestEvent o, PrnfsPullRequestAction action) { if (n.getPostContent().isPresent()) { postContent = Optional.of(renderer.render(n.getPostContent().get())); } - urlInvoker.ivoke(renderer.render(n.getUrl()), n.getUser(), n.getPassword(), n.getMethod(), postContent); + UrlInvoker urlInvoker = urlInvoker().withUrlParam(renderer.render(n.getUrl())).withMethod(n.getMethod()) + .withPostContent(postContent); + if (n.getUser().isPresent() && n.getPassword().isPresent()) { + final String userpass = n.getUser().get() + ":" + n.getPassword().get(); + final String basicAuth = "Basic " + new String(printBase64Binary(userpass.getBytes(UTF_8))); + urlInvoker.withHeader(AUTHORIZATION, basicAuth); + } + for (Header header : n.getHeaders()) { + urlInvoker.withHeader(header.getName(), renderer.render(header.getValue())); + } + urlInvoker.withProxyServer(n.getProxyServer()); + urlInvoker.withProxyPort(n.getProxyPort()); + urlInvoker.withProxyUser(n.getProxyUser()); + urlInvoker.withProxyPassword(n.getProxyPassword()); + invoker.invoke(urlInvoker); } } } catch (final ValidationException e) { diff --git a/src/main/java/se/bjurr/prnfs/listener/PrnfsRenderer.java b/src/main/java/se/bjurr/prnfs/listener/PrnfsRenderer.java index b586fc03..700271aa 100644 --- a/src/main/java/se/bjurr/prnfs/listener/PrnfsRenderer.java +++ b/src/main/java/se/bjurr/prnfs/listener/PrnfsRenderer.java @@ -2,6 +2,7 @@ import static se.bjurr.prnfs.listener.PrnfsPullRequestAction.fromPullRequestEvent; +import com.atlassian.stash.event.pull.PullRequestCommentAddedEvent; import com.atlassian.stash.event.pull.PullRequestEvent; import com.atlassian.stash.pull.PullRequestRef; @@ -58,6 +59,11 @@ public String resolve(PullRequestEvent pullRequestEvent) { public String resolve(PullRequestEvent pullRequestEvent) { return pullRequestEvent.getPullRequest().getId() + ""; } + }), PULL_REQUEST_VERSION(new Resolver() { + @Override + public String resolve(PullRequestEvent pullRequestEvent) { + return pullRequestEvent.getPullRequest().getVersion() + ""; + } }), PULL_REQUEST_AUTHOR_ID(new Resolver() { @Override public String resolve(PullRequestEvent pullRequestEvent) { @@ -123,6 +129,15 @@ public String resolve(PullRequestEvent pullRequestEvent) { public String resolve(PullRequestEvent pullRequestEvent) { return pullRequestEvent.getPullRequest().getToRef().getRepository().getSlug() + ""; } + }), PULL_REQUEST_COMMENT_TEXT(new Resolver() { + @Override + public String resolve(PullRequestEvent pullRequestEvent) { + if (pullRequestEvent instanceof PullRequestCommentAddedEvent) { + return ((PullRequestCommentAddedEvent) pullRequestEvent).getComment().getText(); + } else { + return ""; + } + } }); private Resolver resolver; diff --git a/src/main/java/se/bjurr/prnfs/listener/UrlInvoker.java b/src/main/java/se/bjurr/prnfs/listener/UrlInvoker.java index 0f421f59..1d8e0d95 100644 --- a/src/main/java/se/bjurr/prnfs/listener/UrlInvoker.java +++ b/src/main/java/se/bjurr/prnfs/listener/UrlInvoker.java @@ -2,41 +2,98 @@ import static com.google.common.base.Charsets.UTF_8; import static com.google.common.base.Joiner.on; +import static com.google.common.collect.Lists.newArrayList; import static com.google.common.io.CharStreams.readLines; import static java.lang.Boolean.TRUE; -import static javax.ws.rs.core.HttpHeaders.AUTHORIZATION; -import static javax.xml.bind.DatatypeConverter.printBase64Binary; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; +import java.net.Authenticator; import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.PasswordAuthentication; +import java.net.Proxy; import java.net.URL; -import java.net.URLConnection; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import se.bjurr.prnfs.settings.Header; + import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.io.Closeables; public class UrlInvoker { + private static final Logger logger = LoggerFactory.getLogger(UrlInvoker.class); + private String urlParam; + private String method; + private Optional postContent; + private final List

    headers = newArrayList(); + private Optional proxyUser; + private Optional proxyPassword; + private Optional proxyHost; + private Integer proxyPort; + + private UrlInvoker() { + } + + public static UrlInvoker urlInvoker() { + return new UrlInvoker(); + } + + public UrlInvoker withHeader(String name, String value) { + headers.add(new Header(name, value)); + return this; + } + + public UrlInvoker withMethod(String method) { + this.method = method; + return this; + } + + public UrlInvoker withPostContent(Optional postContent) { + this.postContent = postContent; + return this; + } - public void ivoke(String urlParam, Optional user, Optional password, String method, - Optional postContent) { + public UrlInvoker withUrlParam(String urlParam) { + this.urlParam = urlParam.replaceAll("\\s", "%20"); + return this; + } + + public void invoke() { InputStreamReader ir = null; DataOutputStream wr = null; try { logger.info("Url: \"" + urlParam + "\""); final URL url = new URL(urlParam); - final HttpURLConnection uc = (HttpURLConnection) url.openConnection(); + HttpURLConnection uc = null; + if (shouldUseProxy()) { + Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(getProxyHost().get(), getProxyPort())); + if (shouldAuthenticateProxy()) { + Authenticator authenticator = new Authenticator() { + @Override + public PasswordAuthentication getPasswordAuthentication() { + return (new PasswordAuthentication(getProxyUser().get(), getProxyPassword().get().toCharArray())); + } + }; + Authenticator.setDefault(authenticator); + } + uc = (HttpURLConnection) url.openConnection(proxy); + } else { + uc = (HttpURLConnection) url.openConnection(); + } uc.setRequestMethod(method); - setAuthorization(uc, user, password); + for (Header header : headers) { + logger.info("header: \"" + header.getName() + "\" value: \"" + header.getValue() + "\""); + uc.setRequestProperty(header.getName(), getHeaderValue(header)); + } uc.setDoOutput(true); - if (shouldPostContent(method, postContent)) { + if (shouldPostContent()) { logger.debug(method + " >\n" + postContent.get()); uc.setDoInput(true); uc.setRequestProperty("Content-Length", postContent.get().length() + ""); @@ -58,24 +115,78 @@ public void ivoke(String urlParam, Optional user, Optional passw } @VisibleForTesting - void setAuthorization(URLConnection uc, Optional user, Optional password) - throws UnsupportedEncodingException { - if (shouldUseBasicAuth(user, password)) { - logger.info("user: \"" + user.or("") + "\" password: \"" + password.or("") + "\""); - final String userpass = user.get() + ":" + password.get(); - final String basicAuth = "Basic " + new String(printBase64Binary(userpass.getBytes(UTF_8))); - uc.setRequestProperty(AUTHORIZATION, basicAuth); - } + public boolean shouldAuthenticateProxy() { + return getProxyUser().isPresent() && getProxyPassword().isPresent(); + } + + @VisibleForTesting + public static String getHeaderValue(Header header) { + return header.getValue(); + } + + public String getMethod() { + return method; + } + + public Optional getPostContent() { + return postContent; + } + public String getUrlParam() { + return urlParam; + } + + public static Logger getLogger() { + return logger; } @VisibleForTesting - public static boolean shouldPostContent(String method, Optional postContent) { + public boolean shouldPostContent() { return (method.equals("POST") || method.equals("PUT")) && postContent.isPresent(); } + public List
    getHeaders() { + return headers; + } + @VisibleForTesting - public static boolean shouldUseBasicAuth(Optional user, Optional password) { - return user.isPresent() && password.isPresent(); + public boolean shouldUseProxy() { + return getProxyHost().isPresent() && getProxyPort() > 0; + } + + public Optional getProxyUser() { + return proxyUser; + } + + public UrlInvoker withProxyUser(Optional proxyUser) { + this.proxyUser = proxyUser; + return this; + } + + public Optional getProxyPassword() { + return proxyPassword; + } + + public UrlInvoker withProxyPassword(Optional proxyPassword) { + this.proxyPassword = proxyPassword; + return this; + } + + public Optional getProxyHost() { + return proxyHost; + } + + public UrlInvoker withProxyServer(Optional proxyHost) { + this.proxyHost = proxyHost; + return this; + } + + public Integer getProxyPort() { + return proxyPort; + } + + public UrlInvoker withProxyPort(Integer proxyPort) { + this.proxyPort = proxyPort; + return this; } } diff --git a/src/main/java/se/bjurr/prnfs/settings/Header.java b/src/main/java/se/bjurr/prnfs/settings/Header.java new file mode 100644 index 00000000..e836605d --- /dev/null +++ b/src/main/java/se/bjurr/prnfs/settings/Header.java @@ -0,0 +1,24 @@ +package se.bjurr.prnfs.settings; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Strings.emptyToNull; +import static com.google.common.base.Strings.nullToEmpty; + +public class Header { + + private final String name; + private final String value; + + public Header(String name, String value) { + this.name = checkNotNull(emptyToNull(nullToEmpty(name).trim())); + this.value = checkNotNull(emptyToNull(nullToEmpty(value).trim())); + } + + public String getName() { + return name; + } + + public String getValue() { + return value; + } +} \ No newline at end of file diff --git a/src/main/java/se/bjurr/prnfs/settings/PrnfsNotification.java b/src/main/java/se/bjurr/prnfs/settings/PrnfsNotification.java index aae54b73..2946a39b 100644 --- a/src/main/java/se/bjurr/prnfs/settings/PrnfsNotification.java +++ b/src/main/java/se/bjurr/prnfs/settings/PrnfsNotification.java @@ -24,10 +24,20 @@ public class PrnfsNotification { private final String user; private final String method; private final String postContent; + private final List
    headers; + private final String proxyUser; + private final String proxyPassword; + private final String proxyServer; + private final Integer proxyPort; public PrnfsNotification(List triggers, String url, String user, String password, - String filterString, String filterRegexp, String method, String postContent) throws ValidationException { - this.password = emptyToNull(nullToEmpty(password).trim()); + String filterString, String filterRegexp, String method, String postContent, List
    headers, String proxyUser, + String proxyPassword, String proxyServer, String proxyPort) throws ValidationException { + this.proxyUser = emptyToNull(nullToEmpty(proxyUser).trim()); + this.proxyPassword = emptyToNull(nullToEmpty(proxyPassword).trim()); + this.proxyServer = emptyToNull(nullToEmpty(proxyServer).trim()); + this.proxyPort = Integer.valueOf(firstNonNull(emptyToNull(nullToEmpty(proxyPort).trim()), "-1")); + this.headers = checkNotNull(headers); this.postContent = emptyToNull(nullToEmpty(postContent).trim()); this.method = firstNonNull(emptyToNull(nullToEmpty(method).trim()), "GET"); if (nullToEmpty(url).trim().isEmpty()) { @@ -52,6 +62,7 @@ public PrnfsNotification(List triggers, String url, Stri } this.url = url; this.user = emptyToNull(nullToEmpty(user).trim()); + this.password = emptyToNull(nullToEmpty(password).trim()); this.triggers = checkNotNull(triggers); this.filterString = filterString; this.filterRegexp = filterRegexp; @@ -69,6 +80,22 @@ public Optional getPassword() { return fromNullable(password); } + public Optional getProxyPassword() { + return fromNullable(proxyPassword); + } + + public Integer getProxyPort() { + return proxyPort; + } + + public Optional getProxyServer() { + return fromNullable(proxyServer); + } + + public Optional getProxyUser() { + return fromNullable(proxyUser); + } + public List getTriggers() { return triggers; } @@ -88,4 +115,8 @@ public String getMethod() { public Optional getPostContent() { return fromNullable(postContent); } + + public List
    getHeaders() { + return headers; + } } diff --git a/src/main/java/se/bjurr/prnfs/settings/PrnfsNotificationBuilder.java b/src/main/java/se/bjurr/prnfs/settings/PrnfsNotificationBuilder.java index 8ae88651..d939ff99 100644 --- a/src/main/java/se/bjurr/prnfs/settings/PrnfsNotificationBuilder.java +++ b/src/main/java/se/bjurr/prnfs/settings/PrnfsNotificationBuilder.java @@ -8,6 +8,9 @@ import se.bjurr.prnfs.listener.PrnfsPullRequestAction; public class PrnfsNotificationBuilder { + public static final String YES = "YES"; + public static final String NO = "NO"; + public static PrnfsNotificationBuilder prnfsNotificationBuilder() { return new PrnfsNotificationBuilder(); } @@ -20,12 +23,18 @@ public static PrnfsNotificationBuilder prnfsNotificationBuilder() { private String filterString; private String method; private String postContent; + private final List
    headers = newArrayList(); + private String proxyUser; + private String proxyPassword; + private String proxyServer; + private String proxyPort; private PrnfsNotificationBuilder() { } public PrnfsNotification build() throws ValidationException { - return new PrnfsNotification(triggers, url, user, password, filterString, filterRegexp, method, postContent); + return new PrnfsNotification(triggers, url, user, password, filterString, filterRegexp, method, postContent, headers, + proxyUser, proxyPassword, proxyServer, proxyPort); } public PrnfsNotificationBuilder withPassword(String password) { @@ -67,4 +76,29 @@ public PrnfsNotificationBuilder withPostContent(String postContent) { this.postContent = checkNotNull(postContent); return this; } + + public PrnfsNotificationBuilder withHeader(String name, String value) { + headers.add(new Header(checkNotNull(name), checkNotNull(value))); + return this; + } + + public PrnfsNotificationBuilder withProxyServer(String s) { + this.proxyServer = checkNotNull(s); + return this; + } + + public PrnfsNotificationBuilder withProxyPort(String s) { + this.proxyPort = checkNotNull(s); + return this; + } + + public PrnfsNotificationBuilder withProxyUser(String s) { + this.proxyUser = checkNotNull(s); + return this; + } + + public PrnfsNotificationBuilder withProxyPassword(String s) { + this.proxyPassword = checkNotNull(s); + return this; + } } diff --git a/src/main/java/se/bjurr/prnfs/settings/SettingsStorage.java b/src/main/java/se/bjurr/prnfs/settings/SettingsStorage.java index ea1511da..82defce8 100644 --- a/src/main/java/se/bjurr/prnfs/settings/SettingsStorage.java +++ b/src/main/java/se/bjurr/prnfs/settings/SettingsStorage.java @@ -1,6 +1,7 @@ package se.bjurr.prnfs.settings; import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Strings.isNullOrEmpty; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.find; import static com.google.common.collect.Iterables.removeIf; @@ -14,6 +15,7 @@ import static se.bjurr.prnfs.settings.PrnfsPredicates.predicate; import static se.bjurr.prnfs.settings.PrnfsSettingsBuilder.prnfsSettingsBuilder; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -78,8 +80,8 @@ private static Map getNotificationsMap(PluginSettings p return allNotificationsMap; } - public static PrnfsNotification getPrnfsNotification(AdminFormValues a) throws ValidationException { - for (final Map m : a) { + public static PrnfsNotification getPrnfsNotification(AdminFormValues adminFormValues) throws ValidationException { + for (final Map m : adminFormValues) { for (final Entry entry : m.entrySet()) { if (entry.getKey().equals(NAME)) { if (AdminFormValues.FIELDS.valueOf(entry.getValue()) == null) { @@ -90,34 +92,65 @@ public static PrnfsNotification getPrnfsNotification(AdminFormValues a) throws V } } } - final Optional> urlOpt = tryFind(a, predicate(AdminFormValues.FIELDS.url.name())); + final Optional> urlOpt = tryFind(adminFormValues, predicate(AdminFormValues.FIELDS.url.name())); if (!urlOpt.isPresent()) { throw new ValidationException("url", "URL not set"); } final PrnfsNotificationBuilder prnfsNotificationBuilder = prnfsNotificationBuilder().withUrl(urlOpt.get().get(VALUE)); - final Iterable> events = filter(a, predicate("events")); - for (final Map event : events) { + for (final Map event : filter(adminFormValues, predicate(AdminFormValues.FIELDS.events.name()))) { prnfsNotificationBuilder.withTrigger(PrnfsPullRequestAction.valueOf(event.get(VALUE))); } - if (tryFind(a, predicate(AdminFormValues.FIELDS.user.name())).isPresent()) { - prnfsNotificationBuilder.withUser(find(a, predicate(AdminFormValues.FIELDS.user.name())).get(VALUE)); - } - if (tryFind(a, predicate(AdminFormValues.FIELDS.password.name())).isPresent()) { - prnfsNotificationBuilder.withPassword(find(a, predicate(AdminFormValues.FIELDS.password.name())).get(VALUE)); + Iterator> headerValues = filter(adminFormValues, + predicate(AdminFormValues.FIELDS.header_value.name())).iterator(); + for (final Map headerName : filter(adminFormValues, + predicate(AdminFormValues.FIELDS.header_name.name()))) { + if (headerName.get(VALUE).trim().isEmpty()) { + continue; + } + String headerValue = headerValues.next().get(VALUE); + if (isNullOrEmpty(headerValue)) { + throw new ValidationException(AdminFormValues.FIELDS.header_value.name(), "Value cannot be null"); + } + prnfsNotificationBuilder.withHeader(headerName.get(VALUE), headerValue); } - if (tryFind(a, predicate(AdminFormValues.FIELDS.filter_string.name())).isPresent()) { + if (tryFind(adminFormValues, predicate(AdminFormValues.FIELDS.proxy_server.name())).isPresent()) { prnfsNotificationBuilder - .withFilterString(find(a, predicate(AdminFormValues.FIELDS.filter_string.name())).get(VALUE)); + .withProxyServer(find(adminFormValues, predicate(AdminFormValues.FIELDS.proxy_server.name())).get(VALUE)); } - if (tryFind(a, predicate(AdminFormValues.FIELDS.filter_regexp.name())).isPresent()) { - prnfsNotificationBuilder - .withFilterRegexp(find(a, predicate(AdminFormValues.FIELDS.filter_regexp.name())).get(VALUE)); + if (tryFind(adminFormValues, predicate(AdminFormValues.FIELDS.proxy_port.name())).isPresent()) { + prnfsNotificationBuilder.withProxyPort(find(adminFormValues, predicate(AdminFormValues.FIELDS.proxy_port.name())) + .get(VALUE)); + } + if (tryFind(adminFormValues, predicate(AdminFormValues.FIELDS.proxy_user.name())).isPresent()) { + prnfsNotificationBuilder.withProxyUser(find(adminFormValues, predicate(AdminFormValues.FIELDS.proxy_user.name())) + .get(VALUE)); + } + if (tryFind(adminFormValues, predicate(AdminFormValues.FIELDS.proxy_password.name())).isPresent()) { + prnfsNotificationBuilder.withProxyPassword(find(adminFormValues, + predicate(AdminFormValues.FIELDS.proxy_password.name())).get(VALUE)); } - if (tryFind(a, predicate(AdminFormValues.FIELDS.method.name())).isPresent()) { - prnfsNotificationBuilder.withMethod(find(a, predicate(AdminFormValues.FIELDS.method.name())).get(VALUE)); + if (tryFind(adminFormValues, predicate(AdminFormValues.FIELDS.user.name())).isPresent()) { + prnfsNotificationBuilder.withUser(find(adminFormValues, predicate(AdminFormValues.FIELDS.user.name())).get(VALUE)); } - if (tryFind(a, predicate(AdminFormValues.FIELDS.post_content.name())).isPresent()) { - prnfsNotificationBuilder.withPostContent(find(a, predicate(AdminFormValues.FIELDS.post_content.name())).get(VALUE)); + if (tryFind(adminFormValues, predicate(AdminFormValues.FIELDS.password.name())).isPresent()) { + prnfsNotificationBuilder.withPassword(find(adminFormValues, predicate(AdminFormValues.FIELDS.password.name())).get( + VALUE)); + } + if (tryFind(adminFormValues, predicate(AdminFormValues.FIELDS.filter_string.name())).isPresent()) { + prnfsNotificationBuilder.withFilterString(find(adminFormValues, + predicate(AdminFormValues.FIELDS.filter_string.name())).get(VALUE)); + } + if (tryFind(adminFormValues, predicate(AdminFormValues.FIELDS.filter_regexp.name())).isPresent()) { + prnfsNotificationBuilder.withFilterRegexp(find(adminFormValues, + predicate(AdminFormValues.FIELDS.filter_regexp.name())).get(VALUE)); + } + if (tryFind(adminFormValues, predicate(AdminFormValues.FIELDS.method.name())).isPresent()) { + prnfsNotificationBuilder.withMethod(find(adminFormValues, predicate(AdminFormValues.FIELDS.method.name())) + .get(VALUE)); + } + if (tryFind(adminFormValues, predicate(AdminFormValues.FIELDS.post_content.name())).isPresent()) { + prnfsNotificationBuilder + .withPostContent(find(adminFormValues, predicate(AdminFormValues.FIELDS.post_content.name())).get(VALUE)); } return prnfsNotificationBuilder.build(); } diff --git a/src/main/resources/admin.css b/src/main/resources/admin.css index b42da21f..4df15e70 100644 --- a/src/main/resources/admin.css +++ b/src/main/resources/admin.css @@ -47,3 +47,13 @@ input[type="password"] { .visibleif { display:none; } + +th { + text-align: left; +} + +td > input[type="text"] { + width: 90%; + margin: 0 10% 0 0; + float:left +} diff --git a/src/main/resources/admin.js b/src/main/resources/admin.js index 232d0c43..471f8928 100644 --- a/src/main/resources/admin.js +++ b/src/main/resources/admin.js @@ -1,6 +1,31 @@ (function ($) { var config_resource = AJS.contextPath() + "/rest/prnfs-admin/1.0/"; $(document).ready(function() { + function getEmpties($headers) { + var empties = []; + $('.header', $headers).each(function(iheader,$header){ + var allValue = ""; + $('input[type="text"]',$header).each(function(iinput,$input){ + allValue += $input.value.trim(); + }); + if (allValue === "") { + empties.push($header); + } + }); + return empties; + } + + function adjustHeaders($headers) { + var empties = getEmpties($headers) + if (empties.length == 0) { + $headers.append($(".prnfs-template .header")[0].outerHTML); + } + + if (empties.length > 1) { + empties[1].remove(); + } + } + function setEvents() { $('input[name="delete"]').click(function(e) { var $form = $(this).closest('form'); @@ -19,6 +44,11 @@ } }); }); + + $('.headers').keyup(function(e) { + var $headers = $(this); + adjustHeaders($headers); + }); $('input[name="save"]').click(function(e) { var $form = $(this).closest('form'); @@ -58,12 +88,29 @@ var $template = $(".prnfs-template").clone(); $.each(config, function(fieldIndex,field_map) { $('input[type="text"][name="'+field_map.name+'"]', $template).attr('value', field_map.value); + $('input[type="password"][name="'+field_map.name+'"]', $template).attr('value', field_map.value); $('textarea[name="'+field_map.name+'"]', $template).text(field_map.value); $('input[type="hidden"][name="'+field_map.name+'"]', $template).attr('value', field_map.value); $('input[type="checkbox"][name="'+field_map.name+'"][value="'+field_map.value+'"]', $template).attr('checked','checked'); $('input[type="radio"][name="'+field_map.name+'"][value="'+field_map.value+'"]', $template).attr('checked','checked'); $('.visibleif.'+field_map.name+'_'+field_map.value.replace(/[^a-zA-Z]/g,''), $template).show(); }); + + var header_names = []; + var header_values = []; + $.each(config, function(fieldIndex,field_map) { + if (field_map.name == 'header_name') { + header_names.push(field_map.value); + } else if (field_map.name == 'header_value') { + header_values.push(field_map.value); + } + }); + for (var i = 0; i < header_names.length; i++) { + $('input[type="text"][name="header_name"]', $template).last().attr('value', header_names[i]); + $('input[type="text"][name="header_value"]', $template).last().attr('value', header_values[i]); + adjustHeaders($(".headers", $template)); + } + if (!$('input[name=method]:checked', $template).val()) { $('input[name=method][value=GET]', $template).attr('checked','checked'); } diff --git a/src/main/resources/admin.vm b/src/main/resources/admin.vm index deb22fa7..ebc76df1 100644 --- a/src/main/resources/admin.vm +++ b/src/main/resources/admin.vm @@ -7,7 +7,7 @@
    - You can use variables when invoking the URL, when forming the filter string or in POST content. + You can use variables when invoking the URL, when forming the filter string, custom header values or in POST content.
    • ${PULL_REQUEST_ID} Example: 1
    • ${PULL_REQUEST_ACTION} Example: OPENED
    • @@ -26,12 +26,14 @@
    • ${PULL_REQUEST_FROM_REPO_SLUG} Example: rep_1
    • ${PULL_REQUEST_TO_HASH} Example: d6edcbf924697ab811a867421dab60d954ccad99
    • ${PULL_REQUEST_TO_ID} Example: refs/heads/basic_branching
    • +
    • ${PULL_REQUEST_VERSION} Example: 1
    • ${PULL_REQUEST_TO_BRANCH} Example: basic_branching
    • ${PULL_REQUEST_TO_REPO_ID} Example: 1
    • ${PULL_REQUEST_TO_REPO_NAME} Example: rep_1
    • ${PULL_REQUEST_TO_REPO_PROJECT_ID} Example: 1
    • ${PULL_REQUEST_TO_REPO_PROJECT_KEY} Example: PROJECT_1
    • ${PULL_REQUEST_TO_REPO_SLUG} Example: rep_1
    • +
    • ${PULL_REQUEST_COMMENT_TEXT} Example: A comment
    @@ -90,8 +92,51 @@ Basic authentication (Optional)
    +
    +
    + + +
    +
    + Proxy (Optional) + +
    +
    + + +
    + + +
    + + +
    +
    +
    +
    +
    + Headers (Optional) + + + + + + + + + +
    + Name + + Value +
    + + + +
    +
    diff --git a/src/main/resources/atlassian-plugin.xml b/src/main/resources/atlassian-plugin.xml index 82e01178..b4792699 100644 --- a/src/main/resources/atlassian-plugin.xml +++ b/src/main/resources/atlassian-plugin.xml @@ -3,6 +3,7 @@ ${project.description} ${project.version} + true images/pluginIcon.png images/pluginLogo.png /plugins/servlet/prnfs/admin diff --git a/src/test/java/se/bjurr/prnfs/admin/PrnfsPullRequestEventListenerTest.java b/src/test/java/se/bjurr/prnfs/admin/PrnfsPullRequestEventListenerTest.java index 06744604..e6df9521 100644 --- a/src/test/java/se/bjurr/prnfs/admin/PrnfsPullRequestEventListenerTest.java +++ b/src/test/java/se/bjurr/prnfs/admin/PrnfsPullRequestEventListenerTest.java @@ -1,5 +1,6 @@ package se.bjurr.prnfs.admin; +import static com.atlassian.stash.pull.PullRequestAction.COMMENTED; import static com.atlassian.stash.pull.PullRequestAction.MERGED; import static com.atlassian.stash.pull.PullRequestAction.OPENED; import static com.atlassian.stash.pull.PullRequestAction.RESCOPED; @@ -8,6 +9,7 @@ import static com.google.common.collect.Lists.newArrayList; import static com.google.common.io.Resources.getResource; import static java.util.Collections.sort; +import static javax.ws.rs.core.HttpHeaders.AUTHORIZATION; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static se.bjurr.prnfs.admin.utils.NotificationBuilder.notificationBuilder; @@ -58,6 +60,7 @@ public void testThatAUrlCanHaveSeveralVariables() { .withToRef(pullRequestRefBuilder().withHash("asd123").withRepositorySlug("toslug")) // .withId(10L).withPullRequestAction(OPENED).build()) .invokedUrl( + 0, "http://bjurr.se/?PULL_REQUEST_FROM_HASH=cde456&PULL_REQUEST_TO_HASH=asd123&PULL_REQUEST_FROM_REPO_SLUG=fromslug&PULL_REQUEST_TO_REPO_SLUG=toslug") .invokedMethod("GET"); } @@ -81,7 +84,7 @@ public void testThatAUrlWithoutVariablesCanBeInvoked() { .withNotification( notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()).build()).store() - .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl("http://bjurr.se/"); + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/"); } @Test @@ -102,7 +105,7 @@ public void testThatAUrlWithVariablesFromCanBeInvoked() { .withFromRef( pullRequestRefBuilder().withHash("10").withId("10").withProjectId(10).withProjectKey("10") .withRepositoryId(10).withRepositoryName("10").withRepositorySlug("10")) // - .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl("http://bjurr.se/10"); + .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/10"); } } @@ -124,10 +127,24 @@ public void testThatAUrlWithVariablesToCanBeInvoked() { .withToRef( pullRequestRefBuilder().withHash("10").withId("10").withProjectId(10).withProjectKey("10") .withRepositoryId(10).withRepositoryName("10").withRepositorySlug("10")) // - .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl("http://bjurr.se/10"); + .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/10"); } } + @Test + public void testThatAUrlWithCommentVariableHasSpacesReplaced() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder() + .withFieldValue(AdminFormValues.FIELDS.url, + "http://bjurr.se/${" + PrnfsVariable.PULL_REQUEST_COMMENT_TEXT.name() + "}") + .withFieldValue(AdminFormValues.FIELDS.events, COMMENTED.name()).build()) + .store() + .trigger(pullRequestEventBuilder().withPullRequestAction(COMMENTED).withCommentText("a text with\nnewline").build()) + .invokedUrl(0, "http://bjurr.se/a%20text%20with%20newline"); + } + @Test public void testThatAUrlWithVariableFromBranchCanBeInvokedWhenBranchIdContainsSlashes() { prnfsTestBuilder() @@ -139,7 +156,7 @@ public void testThatAUrlWithVariableFromBranchCanBeInvokedWhenBranchIdContainsSl .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()).build()).store() .trigger(pullRequestEventBuilder() // .withFromRef(pullRequestRefBuilder().withId("refs/heads/branchmodmerge")) // - .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl("http://bjurr.se/branchmodmerge"); + .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/branchmodmerge"); } @Test @@ -153,7 +170,7 @@ public void testThatAUrlWithVariableFromBranchCanBeInvokedWhenBranchIdContainsOn .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()).build()).store() .trigger(pullRequestEventBuilder() // .withFromRef(pullRequestRefBuilder().withId("branchmodmerge")) // - .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl("http://bjurr.se/branchmodmerge"); + .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/branchmodmerge"); } @Test @@ -181,6 +198,7 @@ public void testThatAUrlWithVariablesExceptFromAndToCanBeInvoked() { prnfsParticipantBuilder().withDisplayName("authorDisplayName").withEmail("authorEmail").withId(100) .withName("authorName").withSlug("authorSlug").build()).build()) .invokedUrl( + 0, "http://bjurr.se/id=10&action=OPENED&displayName=authorDisplayName&authorEmail=authorEmail&authorId=100&authorName=authorName&authorSlug=authorSlug"); } @@ -193,7 +211,7 @@ public void testThatPostContentIsNotSentIfMethodIsNotSet() { .withFieldValue(AdminFormValues.FIELDS.post_content, "should not be sent") // .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) // .build()).store().trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()) - .invokedUrl("http://bjurr.se/").invokedMethod("GET").didNotSendPostContentAt(0); + .invokedUrl(0, "http://bjurr.se/").invokedMethod("GET").didNotSendPostContentAt(0); } @Test @@ -206,7 +224,7 @@ public void testThatPostContentIsNotSentIfMethodIsPOSTButThereIsNotPostContent() .withFieldValue(AdminFormValues.FIELDS.post_content, " ") // .withFieldValue(AdminFormValues.FIELDS.method, "POST") // .build()).store().trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()) - .invokedUrl("http://bjurr.se/").invokedMethod("POST").didNotSendPostContentAt(0); + .invokedUrl(0, "http://bjurr.se/").invokedMethod("POST").didNotSendPostContentAt(0); } @Test @@ -219,7 +237,7 @@ public void testThatPostContentIsNotSentIfMethodIsGETAndThereIsPostContent() { .withFieldValue(AdminFormValues.FIELDS.post_content, "some content") // .withFieldValue(AdminFormValues.FIELDS.method, "GET") // .build()).store().trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()) - .invokedUrl("http://bjurr.se/").invokedMethod("GET").didNotSendPostContentAt(0); + .invokedUrl(0, "http://bjurr.se/").invokedMethod("GET").didNotSendPostContentAt(0); } @Test @@ -232,7 +250,7 @@ public void testThatPostContentIsNotSentIfMethodIsDELETEAndThereIsPostContent() .withFieldValue(AdminFormValues.FIELDS.post_content, "some content") // .withFieldValue(AdminFormValues.FIELDS.method, "DELETE") // .build()).store().trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()) - .invokedUrl("http://bjurr.se/").invokedMethod("DELETE").didNotSendPostContentAt(0); + .invokedUrl(0, "http://bjurr.se/").invokedMethod("DELETE").didNotSendPostContentAt(0); } @Test @@ -245,7 +263,7 @@ public void testThatPostContentIsSentIfMethodIsPOSTAndThereIsPostContent() { .withFieldValue(AdminFormValues.FIELDS.post_content, "some content") // .withFieldValue(AdminFormValues.FIELDS.method, "POST") // .build()).store().trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()) - .invokedUrl("http://bjurr.se/").didSendPostContentAt(0, "some content"); + .invokedUrl(0, "http://bjurr.se/").didSendPostContentAt(0, "some content"); } @Test @@ -258,7 +276,7 @@ public void testThatPostContentIsSentIfMethodIsPUTAndThereIsPostContent() { .withFieldValue(AdminFormValues.FIELDS.post_content, "some content") // .withFieldValue(AdminFormValues.FIELDS.method, "PUT") // .build()).store().trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()) - .invokedUrl("http://bjurr.se/").didSendPostContentAt(0, "some content"); + .invokedUrl(0, "http://bjurr.se/").didSendPostContentAt(0, "some content"); } @Test @@ -273,7 +291,48 @@ public void testThatPostContentIsSentAndRenderedIfMethodIsPOSTAndThereIsPostCont "some ${" + PrnfsVariable.PULL_REQUEST_ACTION.name() + "} content") // .withFieldValue(AdminFormValues.FIELDS.method, "POST") // .build()).store().trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()) - .invokedUrl("http://bjurr.se/").didSendPostContentAt(0, "some OPENED content"); + .invokedUrl(0, "http://bjurr.se/").didSendPostContentAt(0, "some OPENED content"); + } + + @Test + public void testThatCustomHeaderCanBeSent() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") + .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) + .withFieldValue(AdminFormValues.FIELDS.header_name, "CustomHeader") + .withFieldValue(AdminFormValues.FIELDS.header_value, "custom value").build()).store() + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .usedHeader(0, "CustomHeader", "custom value"); + } + + @Test + public void testThatCustomHeaderCanBeSentWithVariables() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder() + .withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") + .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) + .withFieldValue(AdminFormValues.FIELDS.header_name, "CustomHeader") + .withFieldValue(AdminFormValues.FIELDS.header_value, + "custom ${" + PrnfsRenderer.PrnfsVariable.PULL_REQUEST_ACTION.name() + "} value").build()).store() + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .usedHeader(0, "CustomHeader", "custom OPENED value"); + } + + @Test + public void testThatEmptyHeaderNameIsIgnored() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") + .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) + .withFieldValue(AdminFormValues.FIELDS.header_name, " ") + .withFieldValue(AdminFormValues.FIELDS.header_value, "custom value").build()).store() + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .didNotSendHeaders(); } @Test @@ -285,8 +344,26 @@ public void testThatBasicAuthenticationHeaderIsSentIfThereIsAUser() { .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) .withFieldValue(AdminFormValues.FIELDS.user, "theuser") .withFieldValue(AdminFormValues.FIELDS.password, "thepassword").build()).store() - .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl("http://bjurr.se/") - .invokedUser("theuser").invokedPassword("thepassword"); + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .usedHeader(0, AUTHORIZATION, "Basic dGhldXNlcjp0aGVwYXNzd29yZA=="); + } + + @Test + public void testThatBasicAuthenticationHeaderIsSentAlongWithCustomHeaders() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") + .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) + .withFieldValue(AdminFormValues.FIELDS.user, "theuser") + .withFieldValue(AdminFormValues.FIELDS.password, "thepassword") + .withFieldValue(AdminFormValues.FIELDS.header_name, "CustomHeader1") + .withFieldValue(AdminFormValues.FIELDS.header_value, "custom value1") + .withFieldValue(AdminFormValues.FIELDS.header_name, "CustomHeader2") + .withFieldValue(AdminFormValues.FIELDS.header_value, "theuser:thepassword").build()).store() + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .usedHeader(0, AUTHORIZATION, "Basic dGhldXNlcjp0aGVwYXNzd29yZA==").usedHeader(0, "CustomHeader1", "custom value1") + .usedHeader(0, "CustomHeader2", "theuser:thepassword"); } @Test @@ -297,8 +374,8 @@ public void testThatBasicAuthenticationHeaderIsNotSentIfThereIsNoUser() { notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()).withFieldValue(AdminFormValues.FIELDS.user, "") .withFieldValue(AdminFormValues.FIELDS.password, "thepassword").build()).store() - .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl("http://bjurr.se/") - .didNotUseBasicAuth(); + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .didNotSendHeaders(); } @Test @@ -310,7 +387,8 @@ public void testThatBasicAuthenticationHeaderIsNotSentIfThereIsNoPassword() { .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) .withFieldValue(AdminFormValues.FIELDS.user, "theuser").withFieldValue(AdminFormValues.FIELDS.password, "") .build()).store().trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()) - .invokedUrl("http://bjurr.se/").didNotUseBasicAuth(); + .invokedUrl(0, "http://bjurr.se/").didNotSendHeaders(); + ; } @Test @@ -321,8 +399,8 @@ public void testThatBasicAuthenticationHeaderIsNotSentIfTheUserContainsOnlySpace notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()).withFieldValue(AdminFormValues.FIELDS.user, " ") .withFieldValue(AdminFormValues.FIELDS.password, "thepassword").build()).store() - .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl("http://bjurr.se/") - .didNotUseBasicAuth(); + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .didNotSendHeaders(); } @Test @@ -334,7 +412,7 @@ public void testThatBasicAuthenticationHeaderIsNotSentIfThePasswordContainsOnlyS .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) .withFieldValue(AdminFormValues.FIELDS.user, "theuser").withFieldValue(AdminFormValues.FIELDS.password, " ") .build()).store().trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()) - .invokedUrl("http://bjurr.se/").didNotUseBasicAuth(); + .invokedUrl(0, "http://bjurr.se/").didNotSendHeaders(); } @Test @@ -371,7 +449,7 @@ public void testThatFilterCanIncludeRescopedFrom() { .withFieldValue(FIELDS.filter_regexp, RESCOPED_FROM).build()).store().trigger(pullRequestEventBuilder() // .withFromRef(pullRequestRefBuilder().withHash("from")) // .withToRef(pullRequestRefBuilder().withHash("previousToHash")) // - .withId(10L).withPullRequestAction(RESCOPED).build()).invokedUrl("http://bjurr.se/"); + .withId(10L).withPullRequestAction(RESCOPED).build()).invokedUrl(0, "http://bjurr.se/"); } @Test @@ -386,7 +464,7 @@ public void testThatURLCanIncludeRescopedFrom() { .trigger(pullRequestEventBuilder() // .withFromRef(pullRequestRefBuilder().withHash("from")) // .withToRef(pullRequestRefBuilder().withHash("previousToHash")) // - .withPullRequestAction(RESCOPED).build()).invokedUrl("http://bjurr.se/RESCOPED_FROM"); + .withPullRequestAction(RESCOPED).build()).invokedUrl(0, "http://bjurr.se/RESCOPED_FROM"); } @Test @@ -412,7 +490,7 @@ public void testThatFilterCanBeUsedToTriggerEventsThatAreOnAnotherProject() { .withFieldValue(FIELDS.filter_string, "${PULL_REQUEST_FROM_REPO_PROJECT_KEY}") .withFieldValue(FIELDS.filter_regexp, "EXP").build()).store().trigger(pullRequestEventBuilder() // .withFromRef(pullRequestRefBuilder().withProjectKey("EXP")) // - .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl("http://bjurr.se/"); + .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/"); } @Test @@ -425,7 +503,7 @@ public void testThatFilterCanBeUsedToTriggerOnEventsThatAreOnAnotherProjectAnBra .withFieldValue(FIELDS.filter_string, "${PULL_REQUEST_FROM_REPO_PROJECT_KEY} ${PULL_REQUEST_FROM_ID}") .withFieldValue(FIELDS.filter_regexp, "EXP my_branch").build()).store().trigger(pullRequestEventBuilder() // .withFromRef(pullRequestRefBuilder().withProjectKey("EXP").withId("my_branch")) // - .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl("http://bjurr.se/"); + .withId(10L).withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/"); } @Test @@ -440,7 +518,102 @@ public void testThatMultipleUrlsCanBeInvoked() { .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()).build()).store() .trigger(pullRequestEventBuilder() // .withToRef(pullRequestRefBuilder()) // - .withId(10L).withPullRequestAction(MERGED).build()).invokedOnlyUrl("http://merged.se/").didNotUseBasicAuth(); + .withId(10L).withPullRequestAction(MERGED).build()).invokedOnlyUrl("http://merged.se/").didNotSendHeaders(); + } + + @Test + public void testThatProxyCanBeUsedWhenInvokingUrl() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") + .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) + .withFieldValue(AdminFormValues.FIELDS.proxy_server, "proxyhost") + .withFieldValue(AdminFormValues.FIELDS.proxy_port, " 1234 ").build()).store() + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .usedNoProxyUser(0).usedNoProxyPassword(0).usedProxyHost(0, "proxyhost").usedProxyPort(0, 1234); + } + + @Test + public void testThatProxyPortIsNeeded() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") + .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) + .withFieldValue(AdminFormValues.FIELDS.proxy_server, "proxyhost") + .withFieldValue(AdminFormValues.FIELDS.proxy_port, " ").build()).store() + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .usedNoProxy(0); + } + + @Test + public void testThatProxyHostIsNeeded() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") + .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) + .withFieldValue(AdminFormValues.FIELDS.proxy_server, "") + .withFieldValue(AdminFormValues.FIELDS.proxy_port, "123").build()).store() + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .usedNoProxy(0); + } + + @Test + public void testThatProxyCanUseUserAndPassword() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") + .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) + .withFieldValue(AdminFormValues.FIELDS.proxy_server, "proxyhost") + .withFieldValue(AdminFormValues.FIELDS.proxy_port, "123") + .withFieldValue(AdminFormValues.FIELDS.proxy_user, "proxyuser") + .withFieldValue(AdminFormValues.FIELDS.proxy_password, "proxypassword").build()).store() + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .usedProxyUser(0, "proxyuser").usedProxyPassword(0, "proxypassword"); + } + + @Test + public void testThatProxyDoesNotAuthenticateIfNoUser() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") + .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) + .withFieldValue(AdminFormValues.FIELDS.proxy_server, "proxyhost") + .withFieldValue(AdminFormValues.FIELDS.proxy_port, "123") + .withFieldValue(AdminFormValues.FIELDS.proxy_user, " ") + .withFieldValue(AdminFormValues.FIELDS.proxy_password, "proxypassword").build()).store() + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .usedNoProxyAuthentication(0); + } + + @Test + public void testThatProxyDoesNotAuthenticateIfNoPassword() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") + .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()) + .withFieldValue(AdminFormValues.FIELDS.proxy_server, "proxyhost") + .withFieldValue(AdminFormValues.FIELDS.proxy_port, "123") + .withFieldValue(AdminFormValues.FIELDS.proxy_user, "user") + .withFieldValue(AdminFormValues.FIELDS.proxy_password, " ").build()).store() + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .usedNoProxyAuthentication(0); + } + + @Test + public void testThatProxyMayNotBeUsedWhenInvokingUrl() { + prnfsTestBuilder() + .isLoggedInAsAdmin() + .withNotification( + notificationBuilder().withFieldValue(AdminFormValues.FIELDS.url, "http://bjurr.se/") + .withFieldValue(AdminFormValues.FIELDS.events, OPENED.name()).build()).store() + .trigger(pullRequestEventBuilder().withPullRequestAction(OPENED).build()).invokedUrl(0, "http://bjurr.se/") + .usedNoProxy(0); } @Test @@ -476,4 +649,5 @@ public void testThatEventsAreMentionedInAdminGUI() throws IOException { assertTrue(prnfsAction.getName() + " in " + resource.toString(), adminVmContent.contains(prnfsAction.getName())); } } + } diff --git a/src/test/java/se/bjurr/prnfs/admin/utils/PrnfsTestBuilder.java b/src/test/java/se/bjurr/prnfs/admin/utils/PrnfsTestBuilder.java index fef6c291..73651ce0 100644 --- a/src/test/java/se/bjurr/prnfs/admin/utils/PrnfsTestBuilder.java +++ b/src/test/java/se/bjurr/prnfs/admin/utils/PrnfsTestBuilder.java @@ -1,6 +1,5 @@ package se.bjurr.prnfs.admin.utils; -import static com.google.common.base.Joiner.on; import static com.google.common.base.Optional.fromNullable; import static com.google.common.collect.Iterables.find; import static com.google.common.collect.Iterables.tryFind; @@ -17,8 +16,8 @@ import static se.bjurr.prnfs.admin.AdminFormValues.NAME; import static se.bjurr.prnfs.admin.AdminFormValues.VALUE; import static se.bjurr.prnfs.listener.PrnfsPullRequestAction.fromPullRequestEvent; -import static se.bjurr.prnfs.listener.UrlInvoker.shouldPostContent; -import static se.bjurr.prnfs.listener.UrlInvoker.shouldUseBasicAuth; +import static se.bjurr.prnfs.listener.PrnfsPullRequestEventListener.setInvoker; +import static se.bjurr.prnfs.listener.UrlInvoker.getHeaderValue; import static se.bjurr.prnfs.settings.PrnfsPredicates.predicate; import static se.bjurr.prnfs.settings.SettingsStorage.FORM_IDENTIFIER_NAME; import static se.bjurr.prnfs.settings.SettingsStorage.fakeRandom; @@ -38,7 +37,9 @@ import se.bjurr.prnfs.admin.ConfigResource; import se.bjurr.prnfs.admin.data.PluginSettingsImpl; import se.bjurr.prnfs.listener.PrnfsPullRequestEventListener; +import se.bjurr.prnfs.listener.PrnfsPullRequestEventListener.Invoker; import se.bjurr.prnfs.listener.UrlInvoker; +import se.bjurr.prnfs.settings.Header; import com.atlassian.sal.api.pluginsettings.PluginSettings; import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory; @@ -49,9 +50,8 @@ import com.atlassian.sal.api.user.UserProfile; import com.atlassian.stash.event.pull.PullRequestEvent; import com.google.common.base.Function; +import com.google.common.base.Joiner; import com.google.common.base.Optional; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; public class PrnfsTestBuilder { public class FakeRandom extends Random { @@ -65,8 +65,6 @@ public long nextLong() { private static Long fakeRandomCounter = null; - private static Gson gson = new GsonBuilder().setPrettyPrinting().create(); - private static final Logger logger = LoggerFactory.getLogger(PrnfsTestBuilder.class); public static PrnfsTestBuilder prnfsTestBuilder() { @@ -79,25 +77,17 @@ public static PrnfsTestBuilder prnfsTestBuilder() { private final ConfigResource configResource; - private final List invokedUrl = newArrayList(); - private PrnfsPullRequestEventListener listener; private final PluginSettings pluginSettings; + private final PluginSettingsFactory pluginSettingsFactory; - private List postResponses; private HttpServletRequest request; private TransactionTemplate transactionTemplate; - private final List> usedPassword = newArrayList(); - - private final List> usedUser = newArrayList(); - - private final List method = newArrayList(); - - private final List> postContent = newArrayList(); + private final List urlInvokers = newArrayList(); private final UserKey userKey; @@ -105,6 +95,8 @@ public static PrnfsTestBuilder prnfsTestBuilder() { private final UserProfile userProfile; + private List postResponses; + private PrnfsTestBuilder() { fakeRandomCounter = 0L; fakeRandom(new FakeRandom()); @@ -129,11 +121,35 @@ public PrnfsTestBuilder delete(String id) { return this; } - public void didNotUseBasicAuth() { - for (int i = 0; i < usedUser.size(); i++) { - assertFalse("user" + i + " \"" + usedUser.get(i).orNull() + "\" password" + i + " \"" + usedUser.get(i).orNull() - + "\"", shouldUseBasicAuth(usedUser.get(i), usedPassword.get(i))); + public PrnfsTestBuilder didNotSendHeaders() { + for (UrlInvoker u : urlInvokers) { + assertTrue(toMap(u.getHeaders()).isEmpty()); } + return this; + } + + public PrnfsTestBuilder didNotSendHeader(int index, String name) { + assertFalse(index + " " + name, toMap(urlInvokers.get(index).getHeaders()).containsKey(name)); + return this; + } + + public PrnfsTestBuilder usedHeader(int index, String name, String value) { + Map headerMap = toMap(urlInvokers.get(index).getHeaders()); + if (headerMap.containsKey(name)) { + assertEquals(index + " " + name, value, getHeaderValue(headerMap.get(name))); + } else { + fail(Joiner.on(", ").join(headerMap.keySet())); + } + return this; + } + + private Map toMap(List
    headers) { + return uniqueIndex(headers, new Function() { + @Override + public String apply(Header input) { + return input.getName(); + } + }); } @SuppressWarnings("unchecked") @@ -189,52 +205,28 @@ public void hasValidationError(AdminFormValues.FIELDS field, String value) { } public PrnfsTestBuilder invokedNoUrl() { - assertEquals(0, invokedUrl.size()); + assertEquals(0, urlInvokers.size()); return this; } public PrnfsTestBuilder invokedOnlyUrl(String url) { - assertEquals(1, invokedUrl.size()); - assertTrue(invokedUrl.get(0).equals(url)); + assertEquals(1, urlInvokers.size()); + assertTrue(urlInvokers.get(0).getUrlParam().equals(url)); return this; } - public PrnfsTestBuilder invokedPassword(String password) { - for (Optional opt : usedPassword) { - if (password.equals(opt.orNull())) { - return this; - } - } - fail("Found: " + on(" ").join(usedPassword)); - return this; - } - - public PrnfsTestBuilder invokedUrl(String url) { - if (invokedUrl.size() == 1) { - assertEquals(url, invokedUrl.get(0)); - } else { - assertTrue(gson.toJson(invokedUrl), invokedUrl.contains(url)); - } - return this; - } - - public PrnfsTestBuilder invokedUser(String user) { - for (Optional opt : usedUser) { - if (user.equals(opt.orNull())) { - return this; - } - } - fail("Found: " + on(" ").join(usedUser)); + public PrnfsTestBuilder invokedUrl(int index, String url) { + assertEquals(url, urlInvokers.get(index).getUrlParam()); return this; } public PrnfsTestBuilder invokedMethod(String method) { - for (String m : this.method) { - if (method.equals(m)) { + for (UrlInvoker u : urlInvokers) { + if (method.equals(u.getMethod())) { return this; } } - fail("Found: " + on(" ").join(this.method)); + fail(method); return this; } @@ -262,15 +254,10 @@ public PrnfsTestBuilder store() { } public PrnfsTestBuilder trigger(PullRequestEvent event) { - listener.setUrlInvoker(new UrlInvoker() { + setInvoker(new Invoker() { @Override - public void ivoke(String url, Optional userParam, Optional passwordParam, String methodParam, - Optional postContentParam) { - invokedUrl.add(url); - usedUser.add(userParam); - usedPassword.add(passwordParam); - method.add(methodParam); - postContent.add(postContentParam); + public void invoke(UrlInvoker urlInvoker) { + urlInvokers.add(urlInvoker); } }); listener.handleEvent(event, fromPullRequestEvent(event)); @@ -288,10 +275,54 @@ public PrnfsTestBuilder withNotification(AdminFormValues adminFormValues) { } public void didNotSendPostContentAt(int i) { - assertFalse(shouldPostContent(method.get(i), postContent.get(i))); + assertFalse(urlInvokers.get(i).shouldPostContent()); } public void didSendPostContentAt(int i, String string) { - assertEquals(string, postContent.get(i).get()); + assertEquals(string, urlInvokers.get(i).getPostContent().get()); + } + + public PrnfsTestBuilder usedNoProxy(int index) { + assertFalse(urlInvokers.get(index).shouldUseProxy()); + return this; + } + + public PrnfsTestBuilder usedNoProxyUser(int index) { + assertFalse(urlInvokers.get(index).getProxyUser().isPresent()); + assertFalse(urlInvokers.get(index).shouldAuthenticateProxy()); + return this; + } + + public PrnfsTestBuilder usedNoProxyPassword(int index) { + assertFalse(urlInvokers.get(index).getProxyPassword().isPresent()); + assertFalse(urlInvokers.get(index).shouldAuthenticateProxy()); + return this; + } + + public PrnfsTestBuilder usedNoProxyAuthentication(int index) { + assertFalse(urlInvokers.get(index).shouldAuthenticateProxy()); + return this; + } + + public PrnfsTestBuilder usedProxyHost(int index, String host) { + assertEquals(host, urlInvokers.get(index).getProxyHost().get()); + return this; + } + + public PrnfsTestBuilder usedProxyPort(int index, Integer port) { + assertEquals(port, urlInvokers.get(index).getProxyPort()); + return this; + } + + public PrnfsTestBuilder usedProxyUser(int i, String user) { + assertEquals(user, urlInvokers.get(i).getProxyUser().get()); + assertTrue(urlInvokers.get(i).shouldAuthenticateProxy()); + return this; + } + + public PrnfsTestBuilder usedProxyPassword(int i, String password) { + assertEquals(password, urlInvokers.get(i).getProxyPassword().get()); + assertTrue(urlInvokers.get(i).shouldAuthenticateProxy()); + return this; } } diff --git a/src/test/java/se/bjurr/prnfs/admin/utils/PullRequestEventBuilder.java b/src/test/java/se/bjurr/prnfs/admin/utils/PullRequestEventBuilder.java index 3e93bf45..ec5ded91 100644 --- a/src/test/java/se/bjurr/prnfs/admin/utils/PullRequestEventBuilder.java +++ b/src/test/java/se/bjurr/prnfs/admin/utils/PullRequestEventBuilder.java @@ -1,9 +1,12 @@ package se.bjurr.prnfs.admin.utils; +import static com.atlassian.stash.pull.PullRequestAction.COMMENTED; import static com.atlassian.stash.pull.PullRequestAction.RESCOPED; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import com.atlassian.stash.comment.Comment; +import com.atlassian.stash.event.pull.PullRequestCommentAddedEvent; import com.atlassian.stash.event.pull.PullRequestEvent; import com.atlassian.stash.event.pull.PullRequestRescopedEvent; import com.atlassian.stash.pull.PullRequest; @@ -16,6 +19,7 @@ public class PullRequestEventBuilder { private PullRequestRefBuilder fromRef; private Long id; private PullRequestParticipant author; + private String commentText; private PullRequestEventBuilder() { } @@ -49,6 +53,11 @@ public PullRequestEventBuilder withId(Long id) { return this; } + public PullRequestEventBuilder withCommentText(String commentText) { + this.commentText = commentText; + return this; + } + public PullRequestEvent build() { PullRequestEvent pullRequestEvent = mock(PullRequestEvent.class); if (pullRequestAction == RESCOPED) { @@ -56,6 +65,12 @@ public PullRequestEvent build() { when(event.getPreviousFromHash()).thenReturn("previousFromHash"); when(event.getPreviousToHash()).thenReturn("previousToHash"); pullRequestEvent = event; + } else if (pullRequestAction == COMMENTED) { + PullRequestCommentAddedEvent event = mock(PullRequestCommentAddedEvent.class); + Comment comment = mock(Comment.class); + when(event.getComment()).thenReturn(comment); + when(event.getComment().getText()).thenReturn(commentText); + pullRequestEvent = event; } final PullRequest pullRequest = mock(PullRequest.class); when(pullRequestEvent.getAction()).thenReturn(pullRequestAction); diff --git a/src/test/java/se/bjurr/prnfs/listener/PrnfsPullRequestActionTest.java b/src/test/java/se/bjurr/prnfs/listener/PrnfsPullRequestActionTest.java index 85e7e553..d96b5e94 100644 --- a/src/test/java/se/bjurr/prnfs/listener/PrnfsPullRequestActionTest.java +++ b/src/test/java/se/bjurr/prnfs/listener/PrnfsPullRequestActionTest.java @@ -45,7 +45,6 @@ public void testThatAllPullRequestActionEventsAreMapped() { } } - @SuppressWarnings("deprecation") @Test public void testThatRescopedEventsAreCalculatedCorrectlyWhenFromAndToChanges() { when(event.getPreviousFromHash()).thenReturn("FROM"); @@ -55,7 +54,6 @@ public void testThatRescopedEventsAreCalculatedCorrectlyWhenFromAndToChanges() { assertEquals(RESCOPED.name(), fromPullRequestEvent(event).getName()); } - @SuppressWarnings("deprecation") @Test public void testThatRescopedEventsAreCalculatedCorrectlyWhenOnlyFromChanges() { when(event.getPreviousFromHash()).thenReturn("FROM"); @@ -65,7 +63,6 @@ public void testThatRescopedEventsAreCalculatedCorrectlyWhenOnlyFromChanges() { assertEquals(RESCOPED_FROM, fromPullRequestEvent(event).getName()); } - @SuppressWarnings("deprecation") @Test public void testThatRescopedEventsAreCalculatedCorrectlyWhenOnlyToChanges() { when(event.getPreviousFromHash()).thenReturn("FROM"); diff --git a/src/test/java/se/bjurr/prnfs/listener/UrlInvokerTest.java b/src/test/java/se/bjurr/prnfs/listener/UrlInvokerTest.java deleted file mode 100644 index 37667398..00000000 --- a/src/test/java/se/bjurr/prnfs/listener/UrlInvokerTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package se.bjurr.prnfs.listener; - -import static javax.ws.rs.core.HttpHeaders.AUTHORIZATION; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -import org.junit.Before; -import org.junit.Test; - -import com.google.common.base.Optional; - -public class UrlInvokerTest { - private URLConnection uc; - - @Before - public void before() throws MalformedURLException { - uc = new URLConnection(new URL("http://bjurr.se/")) { - @Override - public void connect() throws IOException { - - } - }; - } - - @Test - public void testThatAuthenticationRequestPropertyIsAddedIfPasswordAndUserIsSet() throws UnsupportedEncodingException { - new UrlInvoker().setAuthorization(uc, Optional.of("theuser"), Optional.of("thepassword")); - assertEquals("Basic dGhldXNlcjp0aGVwYXNzd29yZA==", uc.getRequestProperty(AUTHORIZATION)); - assertEquals(1, uc.getRequestProperties().size()); - } - - @Test - public void testThatAuthenticationRequestPropertyIsNotAddedIfPasswordIsMissing() throws UnsupportedEncodingException { - new UrlInvoker().setAuthorization(uc, Optional.of("theuser"), Optional. absent()); - assertNull(uc.getRequestProperty(AUTHORIZATION)); - assertEquals(0, uc.getHeaderFields().size()); - } - - @Test - public void testThatAuthenticationRequestPropertyIsNotAddedIfUserIsMissing() throws UnsupportedEncodingException { - new UrlInvoker().setAuthorization(uc, Optional. absent(), Optional.of("thepassword")); - assertEquals(null, uc.getRequestProperty(AUTHORIZATION)); - assertEquals(0, uc.getHeaderFields().size()); - } - -}