From 44d0c07934b316203b33275496e6a212f7dedf21 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Thu, 31 May 2018 15:31:00 +0200 Subject: [PATCH 01/12] removed capitalization of scenario and feature names --- example-project/pom.xml | 2 +- plugin-code/pom.xml | 2 +- plugin-code/src/main/resources/template/macros/page.ftl | 2 +- plugin-code/src/main/resources/template/macros/scenario.ftl | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/example-project/pom.xml b/example-project/pom.xml index 778f37eb..85aacb03 100644 --- a/example-project/pom.xml +++ b/example-project/pom.xml @@ -6,7 +6,7 @@ de.benjamin-bischoff cluecumber-test-project - 0.7.1 + 0.8.0 UTF-8 diff --git a/plugin-code/pom.xml b/plugin-code/pom.xml index d9e564fc..1a43741c 100644 --- a/plugin-code/pom.xml +++ b/plugin-code/pom.xml @@ -6,7 +6,7 @@ com.trivago.rta cluecumber-report-plugin - 0.7.1 + 0.8.0 https://github.com/trivago/cluecumber-report-plugin Cluecumber Maven Plugin for Cucumber Reports diff --git a/plugin-code/src/main/resources/template/macros/page.ftl b/plugin-code/src/main/resources/template/macros/page.ftl index ebfaf774..d04b2b0d 100644 --- a/plugin-code/src/main/resources/template/macros/page.ftl +++ b/plugin-code/src/main/resources/template/macros/page.ftl @@ -25,7 +25,7 @@
${title}
<#if subtitle != ""> -
${subtitle}
+
${subtitle}
<#nested> diff --git a/plugin-code/src/main/resources/template/macros/scenario.ftl b/plugin-code/src/main/resources/template/macros/scenario.ftl index 0e1187ea..7a99e28e 100644 --- a/plugin-code/src/main/resources/template/macros/scenario.ftl +++ b/plugin-code/src/main/resources/template/macros/scenario.ftl @@ -41,13 +41,13 @@ <#list report.elements as element> <#if (skippedRequested && element.skipped) || (failedRequested && element.failed) || (passedRequested && element.passed)> - ${report.name?html} - + ${element.name?html} - ${element.returnTotalDurationString()} From fe9486ae2e826c6fff17212c2b571d09af473d77 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Thu, 31 May 2018 18:06:24 +0200 Subject: [PATCH 02/12] added pretty prenting of generated html --- plugin-code/pom.xml | 14 +++++++++++--- .../com/trivago/rta/rendering/RenderingUtils.java | 14 ++++++++++++++ .../com/trivago/rta/rendering/TemplateEngine.java | 12 ++++++------ .../trivago/rta/rendering/TemplateEngineTest.java | 6 +++--- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/plugin-code/pom.xml b/plugin-code/pom.xml index 1a43741c..c4290fbc 100644 --- a/plugin-code/pom.xml +++ b/plugin-code/pom.xml @@ -78,14 +78,16 @@ 1.7.1 3.5 2.4 - + 3.1.0 2.9.0 4.12 + 0.8.6 2.8.2 1.8.3 2.3.1 2.3.28 + 1.11.3 @@ -247,7 +249,13 @@ org.codehaus.plexus plexus-utils - 3.1.0 + ${plexus.utilities.version} + + + + org.jsoup + jsoup + ${jsoup.version} @@ -267,7 +275,7 @@ com.openpojo openpojo - 0.8.6 + ${openpojo.version} test diff --git a/plugin-code/src/main/java/com/trivago/rta/rendering/RenderingUtils.java b/plugin-code/src/main/java/com/trivago/rta/rendering/RenderingUtils.java index 5710e739..fded9cc3 100644 --- a/plugin-code/src/main/java/com/trivago/rta/rendering/RenderingUtils.java +++ b/plugin-code/src/main/java/com/trivago/rta/rendering/RenderingUtils.java @@ -16,6 +16,9 @@ package com.trivago.rta.rendering; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + import java.time.Duration; public class RenderingUtils { @@ -45,6 +48,17 @@ public static long convertMicrosecondsToMilliseconds(final long microseconds) { return Duration.ofMillis(microseconds / MICROSECOND_FACTOR).toMillis(); } + /** + * Returns prettified HTML + * + * @param html The source html. + * @return The prettified HTML. + */ + static String prettifyHtml(String html) { + Document parse = Jsoup.parse(html); + return parse.toString().trim(); + } + /** * Return the current Cluecumber version. * diff --git a/plugin-code/src/main/java/com/trivago/rta/rendering/TemplateEngine.java b/plugin-code/src/main/java/com/trivago/rta/rendering/TemplateEngine.java index a3a2280f..c9edf6ff 100644 --- a/plugin-code/src/main/java/com/trivago/rta/rendering/TemplateEngine.java +++ b/plugin-code/src/main/java/com/trivago/rta/rendering/TemplateEngine.java @@ -51,23 +51,23 @@ public TemplateEngine( } String getRenderedStartPageContent(final StartPageCollection startPageCollection) throws CluecumberPluginException { - return startPageRenderer.getRenderedContent( + return RenderingUtils.prettifyHtml(startPageRenderer.getRenderedContent( startPageCollection, templateConfiguration.getTemplate(PluginSettings.SUITE_OVERVIEW_PAGE_PATH) - ); + )); } String getRenderedDetailPageContent(final DetailPageCollection detailPageCollection) throws CluecumberPluginException { - return scenarioDetailPageRenderer.getRenderedContent( + return RenderingUtils.prettifyHtml(scenarioDetailPageRenderer.getRenderedContent( detailPageCollection, templateConfiguration.getTemplate(PluginSettings.SCENATIO_DETAIL_PAGE_PATH) - ); + )); } String getRenderedTagSummaryPageContent(final TagSummaryPageCollection tagSummaryPageCollection) throws CluecumberPluginException { - return tagSummaryPageRenderer.getRenderedContent( + return RenderingUtils.prettifyHtml(tagSummaryPageRenderer.getRenderedContent( tagSummaryPageCollection, templateConfiguration.getTemplate(PluginSettings.TAG_SUMMARY_PAGE_PATH) - ); + )); } } diff --git a/plugin-code/src/test/java/com/trivago/rta/rendering/TemplateEngineTest.java b/plugin-code/src/test/java/com/trivago/rta/rendering/TemplateEngineTest.java index 81f6857c..3d333484 100644 --- a/plugin-code/src/test/java/com/trivago/rta/rendering/TemplateEngineTest.java +++ b/plugin-code/src/test/java/com/trivago/rta/rendering/TemplateEngineTest.java @@ -43,7 +43,7 @@ public void getRenderedStartPageTest() throws CluecumberPluginException { when(templateConfiguration.getTemplate("index")).thenReturn(template); when(startPageRenderer.getRenderedContent(startPageCollection, template)).thenReturn("START_PAGE_CONTENT"); String renderedStartPage = templateEngine.getRenderedStartPageContent(startPageCollection); - assertThat(renderedStartPage, is("START_PAGE_CONTENT")); + assertThat(renderedStartPage, is("\n \n \n START_PAGE_CONTENT\n \n")); } @Test @@ -53,7 +53,7 @@ public void getRenderedDetailPageTest() throws CluecumberPluginException { when(templateConfiguration.getTemplate("scenario-detail")).thenReturn(template); when(scenarioDetailPageRenderer.getRenderedContent(detailPageCollection, template)).thenReturn("DETAIL_PAGE_CONTENT"); String renderedDetailPage = templateEngine.getRenderedDetailPageContent(detailPageCollection); - assertThat(renderedDetailPage, is("DETAIL_PAGE_CONTENT")); + assertThat(renderedDetailPage, is("\n \n \n DETAIL_PAGE_CONTENT\n \n")); } @Test @@ -63,6 +63,6 @@ public void getRenderedTagPageTest() throws CluecumberPluginException { when(templateConfiguration.getTemplate("tag-summary")).thenReturn(template); when(tagSummaryPageRenderer.getRenderedContent(tagSummaryPageCollection, template)).thenReturn("TAG_PAGE_CONTENT"); String renderedTagSummaryPage = templateEngine.getRenderedTagSummaryPageContent(tagSummaryPageCollection); - assertThat(renderedTagSummaryPage, is("TAG_PAGE_CONTENT")); + assertThat(renderedTagSummaryPage, is("\n \n \n TAG_PAGE_CONTENT\n \n")); } } From 74198aa6bc13d8995b59656bcef0da95579aa8b8 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Sat, 2 Jun 2018 09:22:40 +0200 Subject: [PATCH 03/12] attachment test feature added --- example-project/json/attachments.json | 63 +++++++++++++++++++ .../trivago/rta/rendering/RenderingUtils.java | 4 +- 2 files changed, 64 insertions(+), 3 deletions(-) create mode 100755 example-project/json/attachments.json diff --git a/example-project/json/attachments.json b/example-project/json/attachments.json new file mode 100755 index 00000000..d280d72f --- /dev/null +++ b/example-project/json/attachments.json @@ -0,0 +1,63 @@ +[ + { + "description": "This is an attachment test", + "elements": [ + { + "description": "Attachment in every step", + "id": ";", + "keyword": "Scenario", + "line": 2, + "name": "This scenario passes", + "steps": [ + { + "keyword": "Given ", + "line": 3, + "match": { + "location": "someMethod()" + }, + "name": "this step has an attachment", + "result": { + "duration": 244280571, + "status": "passed" + }, + "embeddings": [ + { + "mime_type": "image/png", + "data": "Zm9v" + } + ] + }, + { + "keyword": "And ", + "line": 3, + "match": { + "location": "someMethod2()" + }, + "name": "this step has also an attachment", + "result": { + "duration": 3923468231, + "status": "passed" + }, + "embeddings": [ + { + "mime_type": "image/png", + "data": "Zm9v" + } + ] + } + ], + "tags": [ + { + "name": "@test" + } + ], + "type": "scenario" + } + ], + "id": "", + "keyword": "Feature", + "line": 1, + "name": "Feature 1", + "uri": "features/attachments.feature" + } +] diff --git a/plugin-code/src/main/java/com/trivago/rta/rendering/RenderingUtils.java b/plugin-code/src/main/java/com/trivago/rta/rendering/RenderingUtils.java index fded9cc3..cbda14a5 100644 --- a/plugin-code/src/main/java/com/trivago/rta/rendering/RenderingUtils.java +++ b/plugin-code/src/main/java/com/trivago/rta/rendering/RenderingUtils.java @@ -17,7 +17,6 @@ package com.trivago.rta.rendering; import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; import java.time.Duration; @@ -55,8 +54,7 @@ public static long convertMicrosecondsToMilliseconds(final long microseconds) { * @return The prettified HTML. */ static String prettifyHtml(String html) { - Document parse = Jsoup.parse(html); - return parse.toString().trim(); + return Jsoup.parse(html).toString().trim(); } /** From 35dbcdafdcca86991d19e87ae87c1a4b5609cd24 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Sat, 2 Jun 2018 22:20:25 +0200 Subject: [PATCH 04/12] unified attachment handling --- .../resources/template/macros/scenario.ftl | 24 ++++++++++- .../resources/template/scenario-detail.ftl | 40 +++---------------- 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/plugin-code/src/main/resources/template/macros/scenario.ftl b/plugin-code/src/main/resources/template/macros/scenario.ftl index 7a99e28e..a3d1a480 100644 --- a/plugin-code/src/main/resources/template/macros/scenario.ftl +++ b/plugin-code/src/main/resources/template/macros/scenario.ftl @@ -42,7 +42,7 @@ <#if (skippedRequested && element.skipped) || (failedRequested && element.failed) || (passedRequested && element.passed)> ${report.name?html} + title="${tooltipText}">${report.name?html} ${element.name?html} @@ -62,4 +62,26 @@
+ + +<#macro attachments attachments> + <#if (attachments?size > 0)> + <#list attachments as attachment> +
+
+
+ <#if attachment.image> + + + + <#else> + ${attachment.data?html} + +
+
+
+ + \ No newline at end of file diff --git a/plugin-code/src/main/resources/template/scenario-detail.ftl b/plugin-code/src/main/resources/template/scenario-detail.ftl index 7622830f..0df82486 100644 --- a/plugin-code/src/main/resources/template/scenario-detail.ftl +++ b/plugin-code/src/main/resources/template/scenario-detail.ftl @@ -1,5 +1,5 @@ <#import "macros/page.ftl"as page> -<#import "macros/scenario.ftl" as scenarioMacros> +<#import "macros/scenario.ftl" as scenario> <#import "macros/navigation.ftl" as navigation> <@page.page base="../.." links=["tag_summary", "suite_overview"]> @@ -126,23 +126,8 @@
- <#list step.embeddings as embedding> -
-
-
- <#if embedding.image> - - - - <#else> - ${embedding.data?html} - -
-
-
- + + <@scenario.attachments attachments=step.embeddings/> @@ -180,23 +165,8 @@
- <#list after.embeddings as embedding> -
-
-
- <#if embedding.image> - - - - <#else> - ${embedding.data?html} - -
-
-
- + + <@scenario.attachments attachments=after.embeddings/> From a01aa9957c9e017f40b70d0f8cfdc05cf5ef1320 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Mon, 4 Jun 2018 09:39:38 +0200 Subject: [PATCH 05/12] added output handling to before and after steps, added additional page macros --- example-project/json/skip.json | 12 +++ .../resources/template/macros/scenario.ftl | 44 ++++++++++- .../resources/template/scenario-detail.ftl | 77 +++---------------- 3 files changed, 65 insertions(+), 68 deletions(-) diff --git a/example-project/json/skip.json b/example-project/json/skip.json index 50cd8304..305f8ca9 100755 --- a/example-project/json/skip.json +++ b/example-project/json/skip.json @@ -34,6 +34,18 @@ } } ], + "after": [ + { + "match": { + "location": "After.java:6" + }, + "result": { + "duration": 1452264732, + "error_message": "Some errors", + "status": "failed" + } + } + ], "tags": [ { "name": "@failing-before" diff --git a/plugin-code/src/main/resources/template/macros/scenario.ftl b/plugin-code/src/main/resources/template/macros/scenario.ftl index a3d1a480..e163b23f 100644 --- a/plugin-code/src/main/resources/template/macros/scenario.ftl +++ b/plugin-code/src/main/resources/template/macros/scenario.ftl @@ -64,9 +64,9 @@ -<#macro attachments attachments> - <#if (attachments?size > 0)> - <#list attachments as attachment> +<#macro attachments step> + <#if step.embeddings??> + <#list step.embeddings as attachment>
@@ -84,4 +84,42 @@
+ + +<#macro status step> + <#if step.failed> + <#assign class = "text-danger" /> + <#elseif step.skipped> + <#assign class = "text-warning" /> + <#else> + <#assign class = "text-success" /> + + ${step.status.statusString} + + +<#macro errorMessage step> + <#if step.result.hasErrorMessage()> +
+
+
+ ${step.result.errorMessage?html} +
+
+
+ + + +<#macro output step> + <#if step.output??> + <#list step.output as output> +
+
+
+ +
+
+
+ + \ No newline at end of file diff --git a/plugin-code/src/main/resources/template/scenario-detail.ftl b/plugin-code/src/main/resources/template/scenario-detail.ftl index 0df82486..4d635c6a 100644 --- a/plugin-code/src/main/resources/template/scenario-detail.ftl +++ b/plugin-code/src/main/resources/template/scenario-detail.ftl @@ -48,25 +48,12 @@ ${before.result.returnDurationString()}
- <#if before.failed> - <#assign class = "text-danger" /> - <#elseif before.skipped> - <#assign class = "text-warning" /> - <#else> - <#assign class = "text-success" /> - - ${before.status.statusString} + <@scenario.status step=before/>
- <#if before.result.hasErrorMessage()> -
-
-
- ${before.result.errorMessage?html} -
-
-
- + <@scenario.errorMessage step=before/> + <@scenario.output step=before/> + <@scenario.attachments step=before/> @@ -97,37 +84,12 @@ ${step.result.returnDurationString()}
- <#if step.failed> - <#assign class = "text-danger" /> - <#elseif step.skipped> - <#assign class = "text-warning" /> - <#else> - <#assign class = "text-success" /> - - ${step.status.statusString} + <@scenario.status step=step/>
- <#if step.result.hasErrorMessage()> -
-
-
- ${step.result.errorMessage?html} -
-
-
- - <#list step.output as output> -
-
-
- -
-
-
- - - <@scenario.attachments attachments=step.embeddings/> + <@scenario.errorMessage step=step/> + <@scenario.output step=step/> + <@scenario.attachments step=step/> @@ -146,27 +108,12 @@ ${after.result.returnDurationString()}
- <#if after.failed> - <#assign class = "text-danger" /> - <#elseif after.skipped> - <#assign class = "text-warning" /> - <#else> - <#assign class = "text-success" /> - - ${after.status.statusString} + <@scenario.status step=after/>
- <#if after.result.hasErrorMessage()> -
-
-
- ${after.result.errorMessage?html} -
-
-
- - - <@scenario.attachments attachments=after.embeddings/> + <@scenario.errorMessage step=after/> + <@scenario.output step=after/> + <@scenario.attachments step=after/> From 978ad8e3c5fce5b5f19fb6d3b9434961fa6d8cdd Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Mon, 4 Jun 2018 09:42:07 +0200 Subject: [PATCH 06/12] removed unneeded directory creation --- .../src/main/java/com/trivago/rta/rendering/ReportGenerator.java | 1 - 1 file changed, 1 deletion(-) diff --git a/plugin-code/src/main/java/com/trivago/rta/rendering/ReportGenerator.java b/plugin-code/src/main/java/com/trivago/rta/rendering/ReportGenerator.java index 9eeaa655..510b2454 100644 --- a/plugin-code/src/main/java/com/trivago/rta/rendering/ReportGenerator.java +++ b/plugin-code/src/main/java/com/trivago/rta/rendering/ReportGenerator.java @@ -99,7 +99,6 @@ private void copyReportAssets() throws CluecumberPluginException { String reportDirectory = propertyManager.getGeneratedHtmlReportDirectory(); fileSystemManager.createDirectory(reportDirectory); fileSystemManager.createDirectory(reportDirectory + "/js"); - fileSystemManager.createDirectory(reportDirectory + "/img"); fileSystemManager.createDirectory(reportDirectory + "/css"); // Copy CSS resources From 5498ddd382dd34990aa3bf15e59151c4e45b3ad1 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Sun, 10 Jun 2018 16:56:06 +0200 Subject: [PATCH 07/12] fixed unit test --- .../java/com/trivago/rta/rendering/ReportGeneratorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin-code/src/test/java/com/trivago/rta/rendering/ReportGeneratorTest.java b/plugin-code/src/test/java/com/trivago/rta/rendering/ReportGeneratorTest.java index cf51ee47..de74382b 100644 --- a/plugin-code/src/test/java/com/trivago/rta/rendering/ReportGeneratorTest.java +++ b/plugin-code/src/test/java/com/trivago/rta/rendering/ReportGeneratorTest.java @@ -68,7 +68,7 @@ public void fileOperationsTest() throws Exception { reportGenerator.generateReport(startPageCollection); - verify(fileSystemManager, times(4)).createDirectory(anyString()); + verify(fileSystemManager, times(3)).createDirectory(anyString()); verify(fileSystemManager, times(11)).exportResource(any(Class.class), anyString(), anyString()); verify(fileIO, times(1)).writeContentToFile(eq("RENDERED_START_PAGE_CONTENT"), anyString()); verify(fileIO, times(2)).writeContentToFile(eq("RENDERED_DETAIL_PAGE_CONTENT"), anyString()); From b6827feaa50930366ec27497353c6b568c303260 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Sun, 10 Jun 2018 16:57:34 +0200 Subject: [PATCH 08/12] better image --- documentation/img/browserstack.png | Bin 29748 -> 24022 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/documentation/img/browserstack.png b/documentation/img/browserstack.png index d98853b5933cf4c533fe5b668a74c202c6f963ca..6107acbd47a747de31aa9b4b88a06089f72f8fe0 100644 GIT binary patch delta 18736 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%0A1W~GU~73 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 Date: Sun, 10 Jun 2018 17:31:20 +0200 Subject: [PATCH 09/12] support attachments and embeddings in before and after steps as well --- example-project/json/attachments.json | 4 ++++ example-project/json/skip.json | 16 +++++++++++-- .../java/com/trivago/rta/json/pojo/After.java | 13 ---------- .../trivago/rta/json/pojo/ResultMatch.java | 24 +++++++++++++++++++ .../java/com/trivago/rta/json/pojo/Step.java | 19 --------------- .../resources/template/css/cluecumber.css | 11 ++++++--- .../resources/template/macros/scenario.ftl | 14 +++++------ .../rta/json/JsonPojoConverterTest.java | 2 +- 8 files changed, 58 insertions(+), 45 deletions(-) diff --git a/example-project/json/attachments.json b/example-project/json/attachments.json index d280d72f..77963426 100755 --- a/example-project/json/attachments.json +++ b/example-project/json/attachments.json @@ -34,6 +34,10 @@ "location": "someMethod2()" }, "name": "this step has also an attachment", + "output": [ + "Output 1", + "Output 2" + ], "result": { "duration": 3923468231, "status": "passed" diff --git a/example-project/json/skip.json b/example-project/json/skip.json index 305f8ca9..7aed6cdd 100755 --- a/example-project/json/skip.json +++ b/example-project/json/skip.json @@ -8,6 +8,10 @@ "match": { "location": "Steps.java:6" }, + "output": [ + "Output 1", + "Output 2" + ], "result": { "duration": 1452264732, "error_message": "java.lang.RuntimeException: failing before hook\n\tat Steps.lambda$new$0(Steps.java:7)\n\tat cucumber.runtime.java8.Java8HookDefinition.lambda$execute$0(Java8HookDefinition.java:51)", @@ -31,7 +35,11 @@ "result": { "duration": 2552264732, "status": "skipped" - } + }, + "output": [ + "Output 5", + "Output 6" + ] } ], "after": [ @@ -43,7 +51,11 @@ "duration": 1452264732, "error_message": "Some errors", "status": "failed" - } + }, + "output": [ + "Output 3", + "Output 4" + ] } ], "tags": [ diff --git a/plugin-code/src/main/java/com/trivago/rta/json/pojo/After.java b/plugin-code/src/main/java/com/trivago/rta/json/pojo/After.java index 913a7a81..ce664d94 100644 --- a/plugin-code/src/main/java/com/trivago/rta/json/pojo/After.java +++ b/plugin-code/src/main/java/com/trivago/rta/json/pojo/After.java @@ -16,18 +16,5 @@ package com.trivago.rta.json.pojo; -import java.util.ArrayList; -import java.util.List; - public class After extends ResultMatch { - // Cucumber 2 - private List embeddings = new ArrayList<>(); - - public List getEmbeddings() { - return embeddings; - } - - public void setEmbeddings(final List embeddings) { - this.embeddings = embeddings; - } } diff --git a/plugin-code/src/main/java/com/trivago/rta/json/pojo/ResultMatch.java b/plugin-code/src/main/java/com/trivago/rta/json/pojo/ResultMatch.java index 33bc1bab..c4bbf181 100644 --- a/plugin-code/src/main/java/com/trivago/rta/json/pojo/ResultMatch.java +++ b/plugin-code/src/main/java/com/trivago/rta/json/pojo/ResultMatch.java @@ -18,10 +18,16 @@ import com.trivago.rta.constants.Status; +import java.util.ArrayList; +import java.util.List; + class ResultMatch { private Result result; private Match match; + private List output = new ArrayList<>(); + private List embeddings = new ArrayList<>(); + public Result getResult() { return result != null ? result : new Result(); } @@ -38,6 +44,22 @@ public void setMatch(final Match match) { this.match = match; } + public List getEmbeddings() { + return embeddings; + } + + public void setEmbeddings(final List embeddings) { + this.embeddings = embeddings; + } + + public List getOutput() { + return output; + } + + public void setOutput(final List output) { + this.output = output; + } + public String getGlueMethodName() { return getMatch().getLocation(); } @@ -66,6 +88,8 @@ public String toString() { return "ResultMatch{" + "result=" + result + ", match=" + match + + ", output=" + output + + ", embeddings=" + embeddings + '}'; } } diff --git a/plugin-code/src/main/java/com/trivago/rta/json/pojo/Step.java b/plugin-code/src/main/java/com/trivago/rta/json/pojo/Step.java index 86488552..a41c4074 100644 --- a/plugin-code/src/main/java/com/trivago/rta/json/pojo/Step.java +++ b/plugin-code/src/main/java/com/trivago/rta/json/pojo/Step.java @@ -23,9 +23,7 @@ public class Step extends ResultMatch { private int line; private String name = ""; private String keyword = ""; - private List output = new ArrayList<>(); private List rows = new ArrayList<>(); - private List embeddings = new ArrayList<>(); public int getLine() { return line; @@ -51,13 +49,6 @@ public void setKeyword(final String keyword) { this.keyword = keyword; } - public List getEmbeddings() { - return embeddings; - } - - public void setEmbeddings(final List embeddings) { - this.embeddings = embeddings; - } public List getRows() { return rows; @@ -67,23 +58,13 @@ public void setRows(final List rows) { this.rows = rows; } - public List getOutput() { - return output; - } - - public void setOutput(final List output) { - this.output = output; - } - @Override public String toString() { return "Step{" + "line=" + line + ", name='" + name + '\'' + ", keyword='" + keyword + '\'' + - ", output=" + output + ", rows=" + rows + - ", embeddings=" + embeddings + '}'; } } diff --git a/plugin-code/src/main/resources/template/css/cluecumber.css b/plugin-code/src/main/resources/template/css/cluecumber.css index 4eba2748..d92fa269 100644 --- a/plugin-code/src/main/resources/template/css/cluecumber.css +++ b/plugin-code/src/main/resources/template/css/cluecumber.css @@ -56,8 +56,8 @@ code { padding: 1rem; } -.list-group-item .row:hover{ - background-color: rgba(0,0,0,.075); +.list-group-item .row:hover { + background-color: rgba(0, 0, 0, .075); } div.tooltip-inner { @@ -65,6 +65,11 @@ div.tooltip-inner { white-space: nowrap; } -table.compact{ +table.compact { width: min-content; +} + +iframe { + border: 1px solid #ccc; + padding: 5px 5px 0 5px; } \ No newline at end of file diff --git a/plugin-code/src/main/resources/template/macros/scenario.ftl b/plugin-code/src/main/resources/template/macros/scenario.ftl index e163b23f..454f8022 100644 --- a/plugin-code/src/main/resources/template/macros/scenario.ftl +++ b/plugin-code/src/main/resources/template/macros/scenario.ftl @@ -112,14 +112,14 @@ <#macro output step> <#if step.output??> <#list step.output as output> -

-
-
- +
+
+
+ +
+
-
-
\ No newline at end of file diff --git a/plugin-code/src/test/java/com/trivago/rta/json/JsonPojoConverterTest.java b/plugin-code/src/test/java/com/trivago/rta/json/JsonPojoConverterTest.java index 5d3b7f89..93a89ce7 100644 --- a/plugin-code/src/test/java/com/trivago/rta/json/JsonPojoConverterTest.java +++ b/plugin-code/src/test/java/com/trivago/rta/json/JsonPojoConverterTest.java @@ -114,7 +114,7 @@ public void convertJsonToReportPojosTest() throws CluecumberPluginException { Report report = reports[0]; assertThat(report.getName(), is("Test")); assertThat(report.getId(), is("test")); - assertThat(report.toString(), is("Report{line=1, elements=[Element{before=[ResultMatch{result=Result{duration=5554929, status='passed', errorMessage=''}, match=Match{location='BeforeAfterScenario.before(Scenario)', arguments=[]}}], line=5, name='Test feature', description='', id='test;id', after=[ResultMatch{result=Result{duration=153270, status='passed', errorMessage=''}, match=Match{location='BeforeAfterScenario.after(Scenario)', arguments=[]}}], type='scenario', keyword='Scenario', steps=[Step{line=7, name='the start page is opened', keyword='Given ', output=[], rows=[], embeddings=[]}, Step{line=8, name='I see something', keyword='Then ', output=[], rows=[], embeddings=[]}], tags=[Tag{name='@sometag'}, Tag{name='@someothertag'}], scenarioIndex=-1}], name='Test', description='', id='test', keyword='Feature', uri='parallel/features/Test.feature'}")); + assertThat(report.toString(), is("Report{line=1, elements=[Element{before=[ResultMatch{result=Result{duration=5554929, status='passed', errorMessage=''}, match=Match{location='BeforeAfterScenario.before(Scenario)', arguments=[]}, output=[], embeddings=[]}], line=5, name='Test feature', description='', id='test;id', after=[ResultMatch{result=Result{duration=153270, status='passed', errorMessage=''}, match=Match{location='BeforeAfterScenario.after(Scenario)', arguments=[]}, output=[], embeddings=[]}], type='scenario', keyword='Scenario', steps=[Step{line=7, name='the start page is opened', keyword='Given ', rows=[]}, Step{line=8, name='I see something', keyword='Then ', rows=[]}], tags=[Tag{name='@sometag'}, Tag{name='@someothertag'}], scenarioIndex=-1}], name='Test', description='', id='test', keyword='Feature', uri='parallel/features/Test.feature'}")); } @Test(expected = CluecumberPluginException.class) From f256f1a729e7fe8587f405cdf642f834d968c2e2 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Sun, 10 Jun 2018 18:21:50 +0200 Subject: [PATCH 10/12] null outputs are not shown --- example-project/json/attachments.json | 7 ++++++- .../src/main/resources/template/macros/scenario.ftl | 6 ++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/example-project/json/attachments.json b/example-project/json/attachments.json index 77963426..51c4518d 100755 --- a/example-project/json/attachments.json +++ b/example-project/json/attachments.json @@ -36,13 +36,18 @@ "name": "this step has also an attachment", "output": [ "Output 1", - "Output 2" + null, + "Output 3" ], "result": { "duration": 3923468231, "status": "passed" }, "embeddings": [ + { + "mime_type": "image/png", + "data": "Zm9v" + }, { "mime_type": "image/png", "data": "Zm9v" diff --git a/plugin-code/src/main/resources/template/macros/scenario.ftl b/plugin-code/src/main/resources/template/macros/scenario.ftl index 454f8022..cf125f1b 100644 --- a/plugin-code/src/main/resources/template/macros/scenario.ftl +++ b/plugin-code/src/main/resources/template/macros/scenario.ftl @@ -115,8 +115,10 @@
- + <#if output?has_content> + +
From 888fa106336207c2653833b7c79882fd12f0968f Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Sun, 10 Jun 2018 18:28:12 +0200 Subject: [PATCH 11/12] fixed and updated changelog --- CHANGELOG.md | 49 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d45bb948..c67caba4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,19 +7,34 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. Back to [Readme](README.md). +## [0.8.0] - 2018-06-10 + +### Added + +Support for Before and After hock attachments + +### Fixed + +* Scenario.write outputs with null values lead to rendering exceptions +* Scenario.write outputs are not shown in before and after steps + +### Removed + +* Capitalization of scenario names + ## [0.7.1] - 2018-05-08 -# Added +### Added * Feature description is now shown in the feature tool tip on hover -# Fixed +### Fixed * Chart was not rendered when a scenario contained step data tables ## [0.7.0] - 2018-04-18 -# Changed +### Changed * Unified report design * Updated all dependencies @@ -27,69 +42,69 @@ Back to [Readme](README.md). ## [0.6.0] - 2018-04-12 -# Added +### Added * Example project -# Changed +### Changed * Cluecumber is now a monorepo -# Fixed +### Fixed * Table header error on tab overview page ## [0.5.0] - 2018-03-19 -# Added +### Added * Tag summary page -# Fixed +### Fixed * Background Scenario steps are now rendered correctly * Various small bug fixes ## [0.3.0] - 2018-02-19 -# Added +### Added * Scenario.output is now displayed in the scenario details -# Fixed +### Fixed * Scenarios with pending and skipped steps are also considered skipped. * Background scenarios are now merged to the following scenarios. -# Changed +### Changed * Before and after steps have a lower opacity to focus on test steps. * Internal organization of page types allows easier extension. ## [0.2.0] - 2018-01-16 -# Added +### Added - Support for data tables within steps - Cleaner report headers -# Removed +### Removed - Javascript back method is replaced with simple links on the detail pages -# Fixed +### Fixed - Report generation is now much more resilient if information is missing in the JSON sources ## [0.1.1] - 2017-12-12 -# Removed +### Removed - Unnecessary log outputs for attachments ## [0.1.0] - 2017-12-12 -# Added +### Added - Support for Cucumber 2 attachments @@ -142,6 +157,8 @@ Back to [Readme](README.md). Initial project version on GitHub and Maven Central. +[0.8.0]: https://github.com/trivago/cluecumber-report-plugin/tree/0.8.0 +[0.7.1]: https://github.com/trivago/cluecumber-report-plugin/tree/0.7.1 [0.6.0]: https://github.com/trivago/cluecumber-report-plugin/tree/0.6.0 [0.5.0]: https://github.com/trivago/cluecumber-report-plugin/tree/0.5.0 [0.3.0]: https://github.com/trivago/cluecumber-report-plugin/tree/0.3.0 From 21884e083856693f1346223878ca437d0ef509da Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Sun, 10 Jun 2018 18:33:23 +0200 Subject: [PATCH 12/12] fixed additional space in report on null output --- CHANGELOG.md | 9 +++++---- .../main/resources/template/macros/scenario.ftl | 14 +++++++------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c67caba4..3c967e79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,15 +9,16 @@ Back to [Readme](README.md). ## [0.8.0] - 2018-06-10 -### Added - -Support for Before and After hock attachments - ### Fixed * Scenario.write outputs with null values lead to rendering exceptions * Scenario.write outputs are not shown in before and after steps +### Added + +* Support for Before and After hock attachments +* Updated example JSON files in example project + ### Removed * Capitalization of scenario names diff --git a/plugin-code/src/main/resources/template/macros/scenario.ftl b/plugin-code/src/main/resources/template/macros/scenario.ftl index cf125f1b..103c72e1 100644 --- a/plugin-code/src/main/resources/template/macros/scenario.ftl +++ b/plugin-code/src/main/resources/template/macros/scenario.ftl @@ -112,16 +112,16 @@ <#macro output step> <#if step.output??> <#list step.output as output> -
-
-
- <#if output?has_content> + <#if output?has_content> +
+
+
- +
+
-
-
+ \ No newline at end of file