diff --git a/.gitignore b/.gitignore index fa4dabd..9b05c9f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,7 @@ .idea/ .gradle/ build/ -data/*.html -data/alfio/*.html +data/compiled/*.html *.iml *.ipr *.iws diff --git a/data/attributes.mjml b/data/base/attributes.mjml similarity index 100% rename from data/attributes.mjml rename to data/base/attributes.mjml diff --git a/data/base.mjml b/data/base/base.mjml similarity index 100% rename from data/base.mjml rename to data/base/base.mjml diff --git a/data/body-width-override.mjml b/data/base/body-width-override.mjml similarity index 100% rename from data/body-width-override.mjml rename to data/base/body-width-override.mjml diff --git a/data/empty-column-empty-node-social.mjml b/data/base/column-empty-node-social-empty.mjml similarity index 100% rename from data/empty-column-empty-node-social.mjml rename to data/base/column-empty-node-social-empty.mjml diff --git a/data/column-gutter.mjml b/data/base/column-gutter.mjml similarity index 100% rename from data/column-gutter.mjml rename to data/base/column-gutter.mjml diff --git a/data/entities-escaping.mjml b/data/base/entities-escaping.mjml similarity index 100% rename from data/entities-escaping.mjml rename to data/base/entities-escaping.mjml diff --git a/data/raw-special.mjml b/data/base/raw-special.mjml similarity index 100% rename from data/raw-special.mjml rename to data/base/raw-special.mjml diff --git a/data/bug-mj-column-inner-border.mjml b/data/bugs/mj-column-inner-border.mjml similarity index 100% rename from data/bug-mj-column-inner-border.mjml rename to data/bugs/mj-column-inner-border.mjml diff --git a/data/bug-mj-social.mjml b/data/bugs/mj-social.mjml similarity index 87% rename from data/bug-mj-social.mjml rename to data/bugs/mj-social.mjml index a3d0199..69cda42 100644 --- a/data/bug-mj-social.mjml +++ b/data/bugs/mj-social.mjml @@ -1,3 +1,4 @@ + diff --git a/data/bugs/section-border-none.mjml b/data/bugs/section-border-none.mjml new file mode 100644 index 0000000..e1b492a --- /dev/null +++ b/data/bugs/section-border-none.mjml @@ -0,0 +1,23 @@ + + + + + + + + + + + This section should have no border. + + + + + + + This section should have left and right borders. + + + + + \ No newline at end of file diff --git a/data/bugs/social-inner-padding.mjml b/data/bugs/social-inner-padding.mjml new file mode 100644 index 0000000..c973dd5 --- /dev/null +++ b/data/bugs/social-inner-padding.mjml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/data/compiled/.keep b/data/compiled/.keep new file mode 100644 index 0000000..e69de29 diff --git a/data/amario.mjml b/data/complex/amario.mjml similarity index 100% rename from data/amario.mjml rename to data/complex/amario.mjml diff --git a/data/arturia.mjml b/data/complex/arturia.mjml similarity index 100% rename from data/arturia.mjml rename to data/complex/arturia.mjml diff --git a/data/basic.mjml b/data/complex/basic.mjml similarity index 100% rename from data/basic.mjml rename to data/complex/basic.mjml diff --git a/data/black-friday.mjml b/data/complex/black-friday.mjml similarity index 100% rename from data/black-friday.mjml rename to data/complex/black-friday.mjml diff --git a/data/card.mjml b/data/complex/card.mjml similarity index 100% rename from data/card.mjml rename to data/complex/card.mjml diff --git a/data/christmas.mjml b/data/complex/christmas.mjml similarity index 100% rename from data/christmas.mjml rename to data/complex/christmas.mjml diff --git a/data/newsletter.mjml b/data/complex/newsletter.mjml similarity index 100% rename from data/newsletter.mjml rename to data/complex/newsletter.mjml diff --git a/data/onepage.mjml b/data/complex/onepage.mjml similarity index 100% rename from data/onepage.mjml rename to data/complex/onepage.mjml diff --git a/data/proof.mjml b/data/complex/proof.mjml similarity index 100% rename from data/proof.mjml rename to data/complex/proof.mjml diff --git a/data/racoon.mjml b/data/complex/racoon.mjml similarity index 100% rename from data/racoon.mjml rename to data/complex/racoon.mjml diff --git a/data/reactivation-email.mjml b/data/complex/reactivation-email.mjml similarity index 100% rename from data/reactivation-email.mjml rename to data/complex/reactivation-email.mjml diff --git a/data/real-estate.mjml b/data/complex/real-estate.mjml similarity index 100% rename from data/real-estate.mjml rename to data/complex/real-estate.mjml diff --git a/data/receipt-email.mjml b/data/complex/receipt-email.mjml similarity index 100% rename from data/receipt-email.mjml rename to data/complex/receipt-email.mjml diff --git a/data/referral-email.mjml b/data/complex/referral-email.mjml similarity index 100% rename from data/referral-email.mjml rename to data/complex/referral-email.mjml diff --git a/data/sphero-droids.mjml b/data/complex/sphero-droids.mjml similarity index 100% rename from data/sphero-droids.mjml rename to data/complex/sphero-droids.mjml diff --git a/data/sphero-mini.mjml b/data/complex/sphero-mini.mjml similarity index 100% rename from data/sphero-mini.mjml rename to data/complex/sphero-mini.mjml diff --git a/data/ticketshop.mjml b/data/complex/ticketshop.mjml similarity index 100% rename from data/ticketshop.mjml rename to data/complex/ticketshop.mjml diff --git a/data/welcome-email.mjml b/data/complex/welcome-email.mjml similarity index 100% rename from data/welcome-email.mjml rename to data/complex/welcome-email.mjml diff --git a/data/wordly.mjml b/data/complex/wordly.mjml similarity index 100% rename from data/wordly.mjml rename to data/complex/wordly.mjml diff --git a/data/accordion-attrs-all.mjml b/data/components/accordion-attrs-all.mjml similarity index 100% rename from data/accordion-attrs-all.mjml rename to data/components/accordion-attrs-all.mjml diff --git a/data/accordion-attrs.mjml b/data/components/accordion-attrs.mjml similarity index 100% rename from data/accordion-attrs.mjml rename to data/components/accordion-attrs.mjml diff --git a/data/accordion-permutation.mjml b/data/components/accordion-permutation.mjml similarity index 100% rename from data/accordion-permutation.mjml rename to data/components/accordion-permutation.mjml diff --git a/data/accordion.mjml b/data/components/accordion.mjml similarity index 100% rename from data/accordion.mjml rename to data/components/accordion.mjml diff --git a/data/breakpoint.mjml b/data/components/breakpoint.mjml similarity index 100% rename from data/breakpoint.mjml rename to data/components/breakpoint.mjml diff --git a/data/button.mjml b/data/components/button.mjml similarity index 100% rename from data/button.mjml rename to data/components/button.mjml diff --git a/data/carousel.mjml b/data/components/carousel.mjml similarity index 100% rename from data/carousel.mjml rename to data/components/carousel.mjml diff --git a/data/mj-divider-mj-all.mjml b/data/components/divider-all.mjml similarity index 100% rename from data/mj-divider-mj-all.mjml rename to data/components/divider-all.mjml diff --git a/data/divider.mjml b/data/components/divider.mjml similarity index 100% rename from data/divider.mjml rename to data/components/divider.mjml diff --git a/data/font.mjml b/data/components/font.mjml similarity index 100% rename from data/font.mjml rename to data/components/font.mjml diff --git a/data/group.mjml b/data/components/group.mjml similarity index 100% rename from data/group.mjml rename to data/components/group.mjml diff --git a/data/hero-divider.mjml b/data/components/hero-divider.mjml similarity index 100% rename from data/hero-divider.mjml rename to data/components/hero-divider.mjml diff --git a/data/hero-fluid-height-button.mjml b/data/components/hero-fluid-height-button.mjml similarity index 100% rename from data/hero-fluid-height-button.mjml rename to data/components/hero-fluid-height-button.mjml diff --git a/data/image.mjml b/data/components/image.mjml similarity index 100% rename from data/image.mjml rename to data/components/image.mjml diff --git a/data/import-2-import.mjml b/data/components/include-2-include.mjml similarity index 100% rename from data/import-2-import.mjml rename to data/components/include-2-include.mjml diff --git a/data/include-about.mjml b/data/components/include-about.mjml similarity index 100% rename from data/include-about.mjml rename to data/components/include-about.mjml diff --git a/data/import-head.mjml b/data/components/include-head.mjml similarity index 100% rename from data/import-head.mjml rename to data/components/include-head.mjml diff --git a/data/include-index.mjml b/data/components/include-index.mjml similarity index 85% rename from data/include-index.mjml rename to data/components/include-index.mjml index 6625c3e..382ec08 100644 --- a/data/include-index.mjml +++ b/data/components/include-index.mjml @@ -1,3 +1,4 @@ + diff --git a/data/include-type-css.mjml b/data/components/include-type-css.mjml similarity index 100% rename from data/include-type-css.mjml rename to data/components/include-type-css.mjml diff --git a/data/include-type-html.mjml b/data/components/include-type-html.mjml similarity index 100% rename from data/include-type-html.mjml rename to data/components/include-type-html.mjml diff --git a/data/include/footer.mjml b/data/components/include/footer.mjml similarity index 100% rename from data/include/footer.mjml rename to data/components/include/footer.mjml diff --git a/data/include/header.mjml b/data/components/include/header.mjml similarity index 100% rename from data/include/header.mjml rename to data/components/include/header.mjml diff --git a/data/include/import-head-styles.mjml b/data/components/include/import-head-styles.mjml similarity index 100% rename from data/include/import-head-styles.mjml rename to data/components/include/import-head-styles.mjml diff --git a/data/include/styling.mjml b/data/components/include/styling.mjml similarity index 100% rename from data/include/styling.mjml rename to data/components/include/styling.mjml diff --git a/data/include/test-partial-two.mjml b/data/components/include/test-partial-two.mjml similarity index 100% rename from data/include/test-partial-two.mjml rename to data/components/include/test-partial-two.mjml diff --git a/data/include/test-partial.mjml b/data/components/include/test-partial.mjml similarity index 100% rename from data/include/test-partial.mjml rename to data/components/include/test-partial.mjml diff --git a/data/include/type.css b/data/components/include/type.css similarity index 100% rename from data/include/type.css rename to data/components/include/type.css diff --git a/data/include/type.html b/data/components/include/type.html similarity index 100% rename from data/include/type.html rename to data/components/include/type.html diff --git a/data/include/type2.css b/data/components/include/type2.css similarity index 100% rename from data/include/type2.css rename to data/components/include/type2.css diff --git a/data/navbar.mjml b/data/components/navbar.mjml similarity index 100% rename from data/navbar.mjml rename to data/components/navbar.mjml diff --git a/data/preview.mjml b/data/components/preview.mjml similarity index 100% rename from data/preview.mjml rename to data/components/preview.mjml diff --git a/data/section-background-image.mjml b/data/components/section-background-image.mjml similarity index 100% rename from data/section-background-image.mjml rename to data/components/section-background-image.mjml diff --git a/data/section-column-column-divider.mjml b/data/components/section-column-column-divider.mjml similarity index 100% rename from data/section-column-column-divider.mjml rename to data/components/section-column-column-divider.mjml diff --git a/data/section-column-column-section-column-column-divider.mjml b/data/components/section-column-column-section-column-column-divider.mjml similarity index 100% rename from data/section-column-column-section-column-column-divider.mjml rename to data/components/section-column-column-section-column-column-divider.mjml diff --git a/data/mj-section-column-precision-2.mjml b/data/components/section-column-precision-2.mjml similarity index 100% rename from data/mj-section-column-precision-2.mjml rename to data/components/section-column-precision-2.mjml diff --git a/data/section-column-precision.mjml b/data/components/section-column-precision.mjml similarity index 100% rename from data/section-column-precision.mjml rename to data/components/section-column-precision.mjml diff --git a/data/empty-section.mjml b/data/components/section-empty.mjml similarity index 100% rename from data/empty-section.mjml rename to data/components/section-empty.mjml diff --git a/data/section-group-column-text.mjml b/data/components/section-group-column-text.mjml similarity index 100% rename from data/section-group-column-text.mjml rename to data/components/section-group-column-text.mjml diff --git a/data/mj-section-with-background-url.mjml b/data/components/section-with-background-url.mjml similarity index 100% rename from data/mj-section-with-background-url.mjml rename to data/components/section-with-background-url.mjml diff --git a/data/mj-section-with-background.mjml b/data/components/section-with-background.mjml similarity index 100% rename from data/mj-section-with-background.mjml rename to data/components/section-with-background.mjml diff --git a/data/mj-section-with-css-class.mjml b/data/components/section-with-css-class.mjml similarity index 100% rename from data/mj-section-with-css-class.mjml rename to data/components/section-with-css-class.mjml diff --git a/data/mj-section-with-full-width.mjml b/data/components/section-with-full-width.mjml similarity index 100% rename from data/mj-section-with-full-width.mjml rename to data/components/section-with-full-width.mjml diff --git a/data/mj-section-with-mj-class.mjml b/data/components/section-with-mj-class.mjml similarity index 100% rename from data/mj-section-with-mj-class.mjml rename to data/components/section-with-mj-class.mjml diff --git a/data/test-section-with-size.mjml b/data/components/section-with-size.mjml similarity index 100% rename from data/test-section-with-size.mjml rename to data/components/section-with-size.mjml diff --git a/data/section.mjml b/data/components/section.mjml similarity index 100% rename from data/section.mjml rename to data/components/section.mjml diff --git a/data/social-vertical.mjml b/data/components/social-vertical.mjml similarity index 99% rename from data/social-vertical.mjml rename to data/components/social-vertical.mjml index 9360302..2744792 100644 --- a/data/social-vertical.mjml +++ b/data/components/social-vertical.mjml @@ -19,4 +19,4 @@ - \ No newline at end of file + diff --git a/data/social.mjml b/data/components/social.mjml similarity index 100% rename from data/social.mjml rename to data/components/social.mjml diff --git a/data/spacer.mjml b/data/components/spacer.mjml similarity index 100% rename from data/spacer.mjml rename to data/components/spacer.mjml diff --git a/data/style.mjml b/data/components/style.mjml similarity index 100% rename from data/style.mjml rename to data/components/style.mjml diff --git a/data/table.mjml b/data/components/table.mjml similarity index 100% rename from data/table.mjml rename to data/components/table.mjml diff --git a/data/color-text.mjml b/data/components/text-color.mjml similarity index 100% rename from data/color-text.mjml rename to data/components/text-color.mjml diff --git a/data/text.mjml b/data/components/text.mjml similarity index 100% rename from data/text.mjml rename to data/components/text.mjml diff --git a/data/title.mjml b/data/components/title.mjml similarity index 100% rename from data/title.mjml rename to data/components/title.mjml diff --git a/data/wrapper.mjml b/data/components/wrapper.mjml similarity index 100% rename from data/wrapper.mjml rename to data/components/wrapper.mjml diff --git a/data/circular/circular-1.mjml b/data/invalid/circular/circular-1.mjml similarity index 100% rename from data/circular/circular-1.mjml rename to data/invalid/circular/circular-1.mjml diff --git a/data/circular/circular-2.mjml b/data/invalid/circular/circular-2.mjml similarity index 100% rename from data/circular/circular-2.mjml rename to data/invalid/circular/circular-2.mjml diff --git a/data/circular/include-circular.mjml b/data/invalid/circular/include-circular.mjml similarity index 83% rename from data/circular/include-circular.mjml rename to data/invalid/circular/include-circular.mjml index 059629a..a340d2a 100644 --- a/data/circular/include-circular.mjml +++ b/data/invalid/circular/include-circular.mjml @@ -9,6 +9,6 @@ - + \ No newline at end of file diff --git a/data/invalid/readme.txt b/data/invalid/readme.txt new file mode 100644 index 0000000..3ec039f --- /dev/null +++ b/data/invalid/readme.txt @@ -0,0 +1,2 @@ +Put any mjml files that are not expected to compile in this directory so that they can be skipped by the nodejs +mjml compiler \ No newline at end of file diff --git a/data/accordion-font-family.mjml b/data/upstream/accordion-font-family.mjml similarity index 100% rename from data/accordion-font-family.mjml rename to data/upstream/accordion-font-family.mjml diff --git a/data/accordion-padding.mjml b/data/upstream/accordion-padding.mjml similarity index 100% rename from data/accordion-padding.mjml rename to data/upstream/accordion-padding.mjml diff --git a/data/accordionTitle-fontWeight.mjml b/data/upstream/accordionTitle-fontWeight.mjml similarity index 100% rename from data/accordionTitle-fontWeight.mjml rename to data/upstream/accordionTitle-fontWeight.mjml diff --git a/data/carousel-hoverSupported.mjml b/data/upstream/carousel-hoverSupported.mjml similarity index 100% rename from data/carousel-hoverSupported.mjml rename to data/upstream/carousel-hoverSupported.mjml diff --git a/data/column-border-radius.mjml b/data/upstream/column-border-radius.mjml similarity index 100% rename from data/column-border-radius.mjml rename to data/upstream/column-border-radius.mjml diff --git a/data/html-comments.mjml b/data/upstream/html-comments.mjml similarity index 100% rename from data/html-comments.mjml rename to data/upstream/html-comments.mjml diff --git a/data/navbar-ico-padding.mjml b/data/upstream/navbar-ico-padding.mjml similarity index 100% rename from data/navbar-ico-padding.mjml rename to data/upstream/navbar-ico-padding.mjml diff --git a/data/social-align.mjml b/data/upstream/social-align.mjml similarity index 100% rename from data/social-align.mjml rename to data/upstream/social-align.mjml diff --git a/data/social-icon-height.mjml b/data/upstream/social-icon-height.mjml similarity index 100% rename from data/social-icon-height.mjml rename to data/upstream/social-icon-height.mjml diff --git a/data/table-cellspacing.mjml b/data/upstream/table-cellspacing.mjml similarity index 100% rename from data/table-cellspacing.mjml rename to data/upstream/table-cellspacing.mjml diff --git a/data/tableWidth.mjml b/data/upstream/tableWidth.mjml similarity index 100% rename from data/tableWidth.mjml rename to data/upstream/tableWidth.mjml diff --git a/data/wrapper-border-radius.mjml b/data/upstream/wrapper-border-radius.mjml similarity index 100% rename from data/wrapper-border-radius.mjml rename to data/upstream/wrapper-border-radius.mjml diff --git a/data/wrapper-gap.mjml b/data/upstream/wrapper-gap.mjml similarity index 100% rename from data/wrapper-gap.mjml rename to data/upstream/wrapper-gap.mjml diff --git a/package.json b/package.json index 51530df..8c706b0 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,6 @@ "mjml": "4.18.0" }, "scripts": { - "build": "mjml data/*.mjml --config.beautify false -o data/" + "build":"mjml data/**/*.mjml --config.beautify false -o data/compiled/" } } diff --git a/pom.xml b/pom.xml index c37b769..16e93eb 100644 --- a/pom.xml +++ b/pom.xml @@ -55,6 +55,12 @@ 6.0.1 test + + org.junit.jupiter + junit-jupiter-params + 6.0.1 + test + org.graalvm.polyglot polyglot diff --git a/src/main/java/ch/digitalfondue/mjml4j/BaseComponent.java b/src/main/java/ch/digitalfondue/mjml4j/BaseComponent.java index 9f5979f..267a96c 100644 --- a/src/main/java/ch/digitalfondue/mjml4j/BaseComponent.java +++ b/src/main/java/ch/digitalfondue/mjml4j/BaseComponent.java @@ -303,20 +303,17 @@ CssBoxModel getBoxModel() { double getShorthandBorderValue(String attributeName, String direction) { var mjAttributeDirection = getAttribute(attributeName + "-" + direction); var mjAttribute = getAttribute(attributeName); - if (!Utils.isNullOrWhiteSpace(mjAttributeDirection)) { - return CssUnitParser.parse(mjAttributeDirection).value(); - } - - if (Utils.isNullOrWhiteSpace(mjAttribute)) { + return borderParser(mjAttributeDirection); + } else if (!Utils.isNullOrWhiteSpace(mjAttribute)) { + return borderParser(mjAttribute); + } else { return 0; } + } - // MERGED borderParser: - // https://github.com/mjmlio/mjml/blob/d4c6ea0744e05c928044108c3117c16a9c4110fe/packages/mjml-core/src/helpers/shorthandParser.js#L3 - // return CssUnitParser.Parse(mjAttribute).Value; - - var match = PATTERN_SHORTHAND_BORDER_VALUE.matcher(mjAttribute); + double borderParser(String borderValue) { + var match = PATTERN_SHORTHAND_BORDER_VALUE.matcher(borderValue); if (!match.find()) return 0; diff --git a/src/main/java/ch/digitalfondue/mjml4j/MjmlComponentSocial.java b/src/main/java/ch/digitalfondue/mjml4j/MjmlComponentSocial.java index 5134a08..55524ee 100644 --- a/src/main/java/ch/digitalfondue/mjml4j/MjmlComponentSocial.java +++ b/src/main/java/ch/digitalfondue/mjml4j/MjmlComponentSocial.java @@ -6,7 +6,6 @@ import ch.digitalfondue.mjml4j.AttributeValueType.AttributeType; import java.util.LinkedHashMap; -import java.util.Set; import org.w3c.dom.Element; class MjmlComponentSocial extends BaseComponent.BodyComponent { @@ -58,9 +57,11 @@ StringBuilder renderMjml(HtmlRenderer renderer) { : renderVertical(renderer); } - private static final Set INHERITING_ATTRIBUTES = - Set.of( - "border-radius", + @Override + String getInheritingAttribute(String attributeName) { + return switch (attributeName) { + case "padding" -> getAttribute("inner-padding"); + case "border-radius", "color", "font-family", "font-size", @@ -69,17 +70,12 @@ StringBuilder renderMjml(HtmlRenderer renderer) { "icon-height", "icon-padding", "icon-size", - "padding", "line-height", "text-padding", - "text-decoration"); - - @Override - String getInheritingAttribute(String attributeName) { - if ("padding".equals(attributeName)) { - attributeName = "inner-padding"; - } - return INHERITING_ATTRIBUTES.contains(attributeName) ? getAttribute(attributeName) : null; + "text-decoration" -> + getAttribute(attributeName); + default -> null; + }; } private StringBuilder renderVertical(HtmlRenderer renderer) { diff --git a/src/test/java/ch/digitalfondue/mjml4j/BaseComponentTests.java b/src/test/java/ch/digitalfondue/mjml4j/BaseComponentTests.java deleted file mode 100644 index e6da02d..0000000 --- a/src/test/java/ch/digitalfondue/mjml4j/BaseComponentTests.java +++ /dev/null @@ -1,288 +0,0 @@ -package ch.digitalfondue.mjml4j; - -import static ch.digitalfondue.mjml4j.Helpers.testTemplate; - -import org.junit.jupiter.api.Test; - -/** Unit test for base cases. */ -class BaseComponentTests { - - @Test - void testBase() { - testTemplate("base"); - } - - @Test - void testImage() { - testTemplate("image"); - } - - @Test - void testDivider() { - testTemplate("divider"); - } - - @Test - void testButton() { - testTemplate("button"); - } - - @Test - void testHeroDivider() { - testTemplate("hero-divider"); - } - - @Test - void testSpacer() { - testTemplate("spacer"); - } - - @Test - void testPreview() { - testTemplate("preview"); - } - - @Test - void testHeroFluidHeightButton() { - testTemplate("hero-fluid-height-button"); - } - - @Test - void testSection() { - testTemplate("section"); - } - - @Test - void testSectionColumnColumnDivider() { - testTemplate("section-column-column-divider"); - } - - @Test - void testSectionColumnColumnSectionColumnColumnDivider() { - testTemplate("section-column-column-section-column-column-divider"); - } - - @Test - void testSectionGroupColumnText() { - testTemplate("section-group-column-text"); - } - - @Test - void testNavbar() { - testTemplate("navbar"); - } - - @Test - void testNavbarIcoPadding() { - testTemplate("navbar-ico-padding"); - } - - @Test - void testSocial() { - testTemplate("social"); - } - - @Test - void testSocialAlign() { - testTemplate("social-align"); - } - - @Test - void testSocialIconHeight() { - testTemplate("social-icon-height"); - } - - @Test - void testText() { - testTemplate("text"); - } - - @Test - void testFont() { - testTemplate("font"); - } - - @Test - void testBreakpoint() { - testTemplate("breakpoint"); - } - - @Test - void testTitle() { - testTemplate("title"); - } - - @Test - void testStyle() { - testTemplate("style"); - } - - @Test - void testGroup() { - testTemplate("group"); - } - - @Test - void testWrapper() { - testTemplate("wrapper"); - } - - @Test - void testWrapperBorderRadius() { - testTemplate("wrapper-border-radius"); - } - - @Test - void testWrapperGap() { - testTemplate("wrapper-gap"); - } - - @Test - void testAttributes() { - testTemplate("attributes"); - } - - @Test - void testSectionWithSize() { - testTemplate("test-section-with-size"); - } - - @Test - void testTable() { - testTemplate("table"); - } - - @Test - void testTableCellSpacing() { - testTemplate("table-cellspacing"); - } - - @Test - void testTableWidth() { - testTemplate("tableWidth"); - } - - @Test - void testAccordion() { - testTemplate("accordion"); - } - - @Test - void testAccordionAttrs() { - testTemplate("accordion-attrs"); - } - - @Test - void testAccordionAttrsAll() { - testTemplate("accordion-attrs-all"); - } - - @Test - void testAccordionFontFamily() { - testTemplate("accordion-font-family"); - } - - @Test - void testAccordionPadding() { - testTemplate("accordion-padding"); - } - - @Test - void testAccordionTitleFontWeight() { - testTemplate("accordionTitle-fontWeight"); - } - - @Test - void colorText() { - testTemplate("color-text"); - } - - @Test - void testAccordionPermutation() { - testTemplate("accordion-permutation"); - } - - @Test - void testCarousel() { - testTemplate("carousel"); - } - - @Test - void testCarouselHoverSupported() { - testTemplate("carousel-hoverSupported"); - } - - @Test - void testRawSpecial() { - testTemplate("raw-special"); - } - - @Test - void testColumnGutter() { - testTemplate("column-gutter"); - } - - @Test - void testColumnBorderRadius() { - testTemplate("column-border-radius"); - } - - @Test - void testSocialVertical() { - testTemplate("social-vertical"); - } - - @Test - void testSectionBackgroundImage() { - testTemplate("section-background-image"); - } - - @Test - void testEntitiesEscaping() { - testTemplate("entities-escaping"); - } - - @Test - void testSectionMisc() { - testTemplate("mj-section-with-background"); - testTemplate("mj-section-with-background-url"); - testTemplate("mj-section-with-css-class"); - testTemplate("mj-section-with-full-width"); - testTemplate("mj-section-with-mj-class"); - } - - @Test - void testSectionColumnPrecision() { - testTemplate("section-column-precision"); - } - - @Test - void testSectionColumnPrecision2() { - testTemplate("mj-section-column-precision-2"); - } - - @Test - void testEmptyColumnEmptyNodeSocial() { - testTemplate("empty-column-empty-node-social"); - } - - @Test - void testBodyWidthOverride() { - testTemplate("body-width-override"); - } - - @Test - void testEmptySection() { - testTemplate("empty-section"); - } - - @Test - void testImportHead() { - testTemplate("import-head"); - } - - @Test - void test2Import() { - testTemplate("import-2-import"); - } -} diff --git a/src/test/java/ch/digitalfondue/mjml4j/BugTests.java b/src/test/java/ch/digitalfondue/mjml4j/BugTests.java deleted file mode 100644 index 0b0dd3b..0000000 --- a/src/test/java/ch/digitalfondue/mjml4j/BugTests.java +++ /dev/null @@ -1,19 +0,0 @@ -package ch.digitalfondue.mjml4j; - -import static ch.digitalfondue.mjml4j.Helpers.testTemplate; - -import org.junit.jupiter.api.Test; - -class BugTests { - - // see https://github.com/digitalfondue/mjml4j/issues/7 - @Test - void checkMjSocialNpe() { - testTemplate("bug-mj-social"); - } - - @Test - void checkMjColumnInnerBorderNfe() { - testTemplate("bug-mj-column-inner-border"); - } -} diff --git a/src/test/java/ch/digitalfondue/mjml4j/ComplexTemplateTests.java b/src/test/java/ch/digitalfondue/mjml4j/ComplexTemplateTests.java deleted file mode 100644 index 1fc8439..0000000 --- a/src/test/java/ch/digitalfondue/mjml4j/ComplexTemplateTests.java +++ /dev/null @@ -1,138 +0,0 @@ -package ch.digitalfondue.mjml4j; - -import static ch.digitalfondue.mjml4j.Helpers.testTemplate; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -class ComplexTemplateTests { - - @Test - void testWordly() { - testTemplate("wordly"); - } - - @Test - void testTicketshop() { - testTemplate("ticketshop"); - } - - @Test - void testWelcomeEmail() { - testTemplate("welcome-email"); - } - - @Test - void testSpheroMini() { - testTemplate("sphero-mini"); - } - - @Test - void testAmario() { - testTemplate("amario"); - } - - @Test - void testArturia() { - testTemplate("arturia"); - } - - @Test - void testBasic() { - testTemplate("basic"); - } - - @Test - void testBlackFriday() { - testTemplate("black-friday"); - } - - @Test - void testCard() { - testTemplate("card"); - } - - @Test - void testChristmas() { - testTemplate("christmas"); - } - - @Test - void testNewsletter() { - testTemplate("newsletter"); - } - - @Test - void testOnepage() { - testTemplate("onepage"); - } - - @Test - void testProof() { - testTemplate("proof"); - } - - @Test - void testRacoon() { - testTemplate("racoon"); - } - - @Test - void testReactivationEmail() { - testTemplate("reactivation-email"); - } - - @Test - void testRealEstate() { - testTemplate("real-estate"); - } - - @Test - void testReceiptEmail() { - testTemplate("receipt-email"); - } - - @Test - void testReferralEmail() { - testTemplate("referral-email"); - } - - @Test - void testSpheroDroids() { - testTemplate("sphero-droids"); - } - - @Test - void testIncludeHtml() { - testTemplate("include-type-html"); - } - - @Test - void testIncludeCss() { - testTemplate("include-type-css"); - } - - // imported from issue https://github.com/SebastianStehle/mjml-net/issues/177 - @Test - void testIncludeIndex() { - testTemplate("include-index"); - } - - @Test - void testIncludeAbout() { - testTemplate("include-about"); - } - - @Test - void testDividerAttributeAll() { - testTemplate("mj-divider-mj-all"); - } - - @Test - void testCircularInclude() { - var t = - Assertions.assertThrows( - IllegalStateException.class, () -> testTemplate("circular/include-circular")); - Assertions.assertTrue(t.getMessage().startsWith("Circular inclusion detected on file")); - } -} diff --git a/src/test/java/ch/digitalfondue/mjml4j/RenderingTests.java b/src/test/java/ch/digitalfondue/mjml4j/RenderingTests.java new file mode 100644 index 0000000..99c36d4 --- /dev/null +++ b/src/test/java/ch/digitalfondue/mjml4j/RenderingTests.java @@ -0,0 +1,50 @@ +package ch.digitalfondue.mjml4j; + +import static ch.digitalfondue.mjml4j.testutils.Helpers.testTemplate; + +import ch.digitalfondue.mjml4j.testutils.MjmlDirectory; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; + +/** Unit test for base cases. */ +class RenderingTests { + @ParameterizedTest + @MjmlDirectory("base") + void testBaseTemplates(String name) { + testTemplate("base", name); + } + + @ParameterizedTest + @MjmlDirectory("components") + void testComponentTemplates(String name) { + testTemplate("components", name); + } + + @ParameterizedTest + @MjmlDirectory("complex") + void testComplexTemplates(String name) { + testTemplate("complex", name); + } + + @ParameterizedTest + @MjmlDirectory("upstream") + void testUpstreamTemplates(String name) { + testTemplate("upstream", name); + } + + @ParameterizedTest + @MjmlDirectory("bugs") + void testBugsTemplates(String name) { + testTemplate("bugs", name); + } + + @Test + void testCircularInclude() { + var t = + Assertions.assertThrows( + IllegalStateException.class, + () -> testTemplate("invalid/circular", "include-circular")); + Assertions.assertTrue(t.getMessage().startsWith("Circular inclusion detected on file")); + } +} diff --git a/src/test/java/ch/digitalfondue/mjml4j/Helpers.java b/src/test/java/ch/digitalfondue/mjml4j/testutils/Helpers.java similarity index 81% rename from src/test/java/ch/digitalfondue/mjml4j/Helpers.java rename to src/test/java/ch/digitalfondue/mjml4j/testutils/Helpers.java index d903dcd..64a58cf 100644 --- a/src/test/java/ch/digitalfondue/mjml4j/Helpers.java +++ b/src/test/java/ch/digitalfondue/mjml4j/testutils/Helpers.java @@ -1,5 +1,6 @@ -package ch.digitalfondue.mjml4j; +package ch.digitalfondue.mjml4j.testutils; +import ch.digitalfondue.mjml4j.Mjml4j; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -13,9 +14,8 @@ import org.graalvm.polyglot.io.IOAccess; import org.junit.jupiter.api.Assertions; -class Helpers { - - static String beautifyHtml(String html) throws IOException { +public class Helpers { + private static String beautifyHtml(String html) throws IOException { System.getProperties().setProperty("polyglot.engine.WarnInterpreterOnly", "false"); var options = new HashMap(); @@ -51,14 +51,14 @@ static String beautifyHtml(String html) throws IOException { } } - static String simplifyBrTags(String input) { + private static String simplifyBrTags(String input) { return input.replaceAll("", "
"); } // align all values defined in ids -> mjml use random strings, for coherence reason we find all // id="...." and replace them with // a sequence. this allows to align id=".." and for=".." - static String alignIdFor(String input) { + private static String alignIdFor(String input) { var findIds = Pattern.compile( "id=\"[^\"]*([0-9a-f]{16})[^\"]*\"", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE); @@ -76,18 +76,15 @@ static String alignIdFor(String input) { return res; } - static void testTemplate(String name) { - testTemplate(name, new Mjml4j.FileSystemResolver(Path.of("data"))); - } - - static void testTemplate(String name, Mjml4j.IncludeResolver resolver) { + public static void testTemplate(String directory, String name) { + var resolver = new Mjml4j.FileSystemResolver(Path.of("data", directory)); try { var template = - Files.readString(new File("data/" + name + ".mjml").toPath(), StandardCharsets.UTF_8); + Files.readString(Path.of("data", directory, name + ".mjml"), StandardCharsets.UTF_8); var conf = new Mjml4j.Configuration("und", Mjml4j.TextDirection.AUTO, resolver); var res = Mjml4j.render(template, conf); var comparison = - Files.readString(new File("data/" + name + ".html").toPath(), StandardCharsets.UTF_8); + Files.readString(Path.of("data", "compiled", name + ".html"), StandardCharsets.UTF_8); Assertions.assertEquals( simplifyBrTags(alignIdFor(beautifyHtml(comparison))), alignIdFor(beautifyHtml(res))); } catch (IOException e) { diff --git a/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlDirectory.java b/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlDirectory.java new file mode 100644 index 0000000..26eabc4 --- /dev/null +++ b/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlDirectory.java @@ -0,0 +1,15 @@ +package ch.digitalfondue.mjml4j.testutils; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.junit.jupiter.params.provider.ArgumentsSource; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@ArgumentsSource(MjmlListArgumentsProvider.class) +public @interface MjmlDirectory { + /** The directory to scan for MJML test files. */ + String value(); +} diff --git a/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlListArgumentsProvider.java b/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlListArgumentsProvider.java new file mode 100644 index 0000000..f0eaed1 --- /dev/null +++ b/src/test/java/ch/digitalfondue/mjml4j/testutils/MjmlListArgumentsProvider.java @@ -0,0 +1,24 @@ +package ch.digitalfondue.mjml4j.testutils; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.stream.Stream; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.provider.AnnotationBasedArgumentsProvider; +import org.junit.jupiter.params.provider.Arguments; + +public class MjmlListArgumentsProvider extends AnnotationBasedArgumentsProvider { + @Override + protected Stream provideArguments( + ExtensionContext context, MjmlDirectory annotation) { + try { + return Files.list(Path.of("data", annotation.value())) + .filter(p -> p.toString().endsWith(".mjml")) + .map(p -> p.getFileName().toString().replace(".mjml", "")) + .map(Arguments::of); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/test/java/module-info.java b/src/test/java/module-info.java new file mode 100644 index 0000000..46f507d --- /dev/null +++ b/src/test/java/module-info.java @@ -0,0 +1,17 @@ +module ch.digitalfondue.mjml4j { + requires ch.digitalfondue.jfiveparse; + requires java.xml; + + exports ch.digitalfondue.mjml4j; + + // Test extensions + requires org.junit.jupiter.api; + requires org.junit.jupiter.params; + requires org.graalvm.polyglot; + + opens ch.digitalfondue.mjml4j to + org.junit.platform.commons; + + exports ch.digitalfondue.mjml4j.testutils to + org.junit.platform.commons; +}