diff options
author | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2019-04-16 16:26:16 +0200 |
---|---|---|
committer | SonarTech <sonartech@sonarsource.com> | 2019-04-26 20:21:06 +0200 |
commit | 0619f3cd296045ab29ff44b48768c34a8dd2bcde (patch) | |
tree | 6bb3ef7b31e33b4d3a6cb04292760bd8ee3c9cf0 /sonar-testing-harness | |
parent | c58d901db830ca847311520104ad551bd680de26 (diff) | |
download | sonarqube-0619f3cd296045ab29ff44b48768c34a8dd2bcde.tar.gz sonarqube-0619f3cd296045ab29ff44b48768c34a8dd2bcde.zip |
SONAR-10725 portfolio PDF email is HTML with details
Diffstat (limited to 'sonar-testing-harness')
3 files changed, 110 insertions, 11 deletions
diff --git a/sonar-testing-harness/src/main/java/org/sonar/test/html/HtmlBlockAssert.java b/sonar-testing-harness/src/main/java/org/sonar/test/html/HtmlBlockAssert.java index c0471077e18..df07debaef4 100644 --- a/sonar-testing-harness/src/main/java/org/sonar/test/html/HtmlBlockAssert.java +++ b/sonar-testing-harness/src/main/java/org/sonar/test/html/HtmlBlockAssert.java @@ -57,7 +57,7 @@ public abstract class HtmlBlockAssert<T extends HtmlBlockAssert<T>> extends Abst long count = as.stream().filter(t -> linkText.equals(t.text())).count(); if (count != times) { - failWithMessage("link on text \"%s\" found %s times in bloc (expected %s). \n Got: %s", linkText, count, times, asyncToString(as)); + failWithMessage("link on text \"%s\" found %s times in bloc (expected %s). \n Got: %s", linkText, count, times, asyncLinksToString(as)); } return myself; @@ -71,13 +71,13 @@ public abstract class HtmlBlockAssert<T extends HtmlBlockAssert<T>> extends Abst Elements as = actual.select("a"); Assertions.assertThat(as) - .describedAs(NO_LINK_IN_BLOC) + .describedAs(NO_LINK_IN_BLOC + PRINT_FRAGMENT_TEMPLATE, actual) .isNotEmpty(); if (as.stream().noneMatch(t -> linkText.equals(t.text()) && href.equals(t.attr("href")))) { failWithMessage( - "link with text \"%s\" and href \"%s\" not found in block. \n Got: %s", - linkText, href, asyncToString(as)); + "link with text \"%s\" and href \"%s\" not found in block. \n Got: %s" + PRINT_FRAGMENT_TEMPLATE, + linkText, href, asyncLinksToString(as), actual); } return myself; @@ -91,12 +91,12 @@ public abstract class HtmlBlockAssert<T extends HtmlBlockAssert<T>> extends Abst return myself; } - private static Object asyncToString(Elements as) { + private static Object asyncLinksToString(Elements linkElements) { return new Object() { @Override public String toString() { - return as.stream() - .map(a -> "< href=\"" + a.attr("href") + "\">" + a.text() + "<a>") + return linkElements.stream() + .map(a -> "<a href=\"" + a.attr("href") + "\">" + a.text() + "<a>") .collect(Collectors.joining("\n")); } }; diff --git a/sonar-testing-harness/src/main/java/org/sonar/test/html/MimeMessageAssert.java b/sonar-testing-harness/src/main/java/org/sonar/test/html/MimeMessageAssert.java index faa654b562a..0ca6aaede72 100644 --- a/sonar-testing-harness/src/main/java/org/sonar/test/html/MimeMessageAssert.java +++ b/sonar-testing-harness/src/main/java/org/sonar/test/html/MimeMessageAssert.java @@ -36,25 +36,34 @@ public final class MimeMessageAssert extends AbstractAssert<MimeMessageAssert, M return new MimeMessageAssert(m); } - public HtmlFragmentAssert isHtml() { + public MultipartMessageAssert isMultipart() { isNotNull(); try { Object content = actual.getContent(); Assertions.assertThat(content).isInstanceOf(MimeMultipart.class); MimeMultipart m = (MimeMultipart) content; - Assertions.assertThat(m.getCount()).isEqualTo(1); - return new HtmlFragmentAssert((String) m.getBodyPart(0).getContent()); + return new MultipartMessageAssert(m); } catch (MessagingException | IOException e) { throw new IllegalStateException(e); } } + /** + * Convenience method for {@code isMultipart().isHtml()}. + */ + public HtmlFragmentAssert isHtml() { + return isMultipart() + .isHtml(); + } + public MimeMessageAssert hasRecipient(String userEmail) { isNotNull(); try { - Assertions.assertThat(actual.getHeader("To", null)).isEqualTo(String.format("<%s>", userEmail)); + Assertions + .assertThat(actual.getHeader("To", null)) + .isEqualTo(String.format("<%s>", userEmail)); } catch (MessagingException e) { throw new IllegalStateException(e); } diff --git a/sonar-testing-harness/src/main/java/org/sonar/test/html/MultipartMessageAssert.java b/sonar-testing-harness/src/main/java/org/sonar/test/html/MultipartMessageAssert.java new file mode 100644 index 00000000000..8edc5292575 --- /dev/null +++ b/sonar-testing-harness/src/main/java/org/sonar/test/html/MultipartMessageAssert.java @@ -0,0 +1,90 @@ +/* + * SonarQube + * Copyright (C) 2009-2019 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.test.html; + +import java.io.IOException; +import java.util.Iterator; +import java.util.NoSuchElementException; +import javax.mail.BodyPart; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.internet.MimeMultipart; +import org.assertj.core.api.AbstractAssert; +import org.assertj.core.api.Assertions; + +public class MultipartMessageAssert extends AbstractAssert<MultipartMessageAssert, Multipart> { + private final Iterator<BodyPart> bodyParts; + + MultipartMessageAssert(MimeMultipart m) { + super(m, MultipartMessageAssert.class); + try { + this.bodyParts = new BodyPartIterator(m, m.getCount()); + } catch (MessagingException e) { + throw new IllegalStateException(e); + } + } + + public HtmlFragmentAssert isHtml() { + isNotNull(); + + Assertions + .assertThat(bodyParts.hasNext()) + .describedAs("no more body part") + .isTrue(); + + try { + BodyPart bodyPart = bodyParts.next(); + return new HtmlFragmentAssert((String) bodyPart.getContent()); + } catch (MessagingException | IOException e) { + throw new IllegalStateException(e); + } + } + + private static class BodyPartIterator implements Iterator<BodyPart> { + private final int count; + private final MimeMultipart m; + private int index = 0; + + public BodyPartIterator(MimeMultipart m, int count) { + this.m = m; + this.count = count; + } + + @Override + public boolean hasNext() { + return index < count; + } + + @Override + public BodyPart next() { + if (index >= count) { + throw new NoSuchElementException("no more body part"); + } + + try { + BodyPart next = m.getBodyPart(index); + index++; + return next; + } catch (MessagingException e) { + throw new IllegalStateException(e); + } + } + } +} |