From 36f94247da42bf3d8f5e6f978f5606b596b0ae81 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Mon, 29 Apr 2019 10:11:30 +0200 Subject: [PATCH 1/5] utc conversion to local timezone --- .../cluecumber/rendering/RenderingUtils.java | 10 +++++++--- .../cluecumber/rendering/RenderingUtilsTest.java | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/plugin-code/src/main/java/com/trivago/cluecumber/rendering/RenderingUtils.java b/plugin-code/src/main/java/com/trivago/cluecumber/rendering/RenderingUtils.java index d0ce3585..17d1cf73 100644 --- a/plugin-code/src/main/java/com/trivago/cluecumber/rendering/RenderingUtils.java +++ b/plugin-code/src/main/java/com/trivago/cluecumber/rendering/RenderingUtils.java @@ -19,6 +19,7 @@ import org.jsoup.Jsoup; import java.time.Duration; +import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.regex.Matcher; @@ -107,7 +108,8 @@ public static String turnUrlsIntoLinks(final String sourceString) { String targetString = sourceString; while (matcher.find()) { String found = matcher.group(); - targetString = targetString.replaceFirst(Pattern.quote(found), Matcher.quoteReplacement("" + found + "")); + targetString = targetString.replaceFirst(Pattern.quote(found), + Matcher.quoteReplacement("" + found + "")); } return targetString; } @@ -129,7 +131,8 @@ public static ZonedDateTime convertTimestampToZonedDateTime(final String timesta public static String convertZonedDateTimeToDateString(final ZonedDateTime startDateTime) { try { - return startDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + return startDateTime.withZoneSameInstant(ZoneId.systemDefault()). + format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); } catch (Exception ignored) { } return ""; @@ -137,7 +140,8 @@ public static String convertZonedDateTimeToDateString(final ZonedDateTime startD public static String convertZonedDateTimeToTimeString(final ZonedDateTime startDateTime) { try { - return startDateTime.format(DateTimeFormatter.ofPattern("HH:mm:ss")); + return startDateTime.withZoneSameInstant(ZoneId.systemDefault()). + format(DateTimeFormatter.ofPattern("HH:mm:ss")); } catch (Exception ignored) { } return ""; diff --git a/plugin-code/src/test/java/com/trivago/cluecumber/rendering/RenderingUtilsTest.java b/plugin-code/src/test/java/com/trivago/cluecumber/rendering/RenderingUtilsTest.java index 79e47cf3..079542cc 100644 --- a/plugin-code/src/test/java/com/trivago/cluecumber/rendering/RenderingUtilsTest.java +++ b/plugin-code/src/test/java/com/trivago/cluecumber/rendering/RenderingUtilsTest.java @@ -3,7 +3,10 @@ import org.junit.Test; import java.time.Month; +import java.time.ZoneId; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Objects; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; @@ -65,8 +68,12 @@ public void convertTimestampToZonedDateTimeInvalidTest() { public void convertZonedDateTimeToDateStringTest() { String timestamp = "2018-09-14T13:02:15.123Z"; ZonedDateTime zonedDateTime = RenderingUtils.convertTimestampToZonedDateTime(timestamp); + + final String dateLocal = Objects.requireNonNull(zonedDateTime).withZoneSameInstant(ZoneId.systemDefault()). + format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String dateString = RenderingUtils.convertZonedDateTimeToDateString(zonedDateTime); - assertThat(dateString, is("2018-09-14")); + assertThat(dateString, is(dateLocal)); } @Test @@ -80,8 +87,12 @@ public void convertZonedDateTimeToDateStringInvalidTest() { public void convertZonedDateTimeToTimeStringTest() { String timestamp = "2018-09-14T13:02:15.123Z"; ZonedDateTime zonedDateTime = RenderingUtils.convertTimestampToZonedDateTime(timestamp); + + final String timeLocal = Objects.requireNonNull(zonedDateTime).withZoneSameInstant(ZoneId.systemDefault()). + format(DateTimeFormatter.ofPattern("HH:mm:ss")); + String timeString = RenderingUtils.convertZonedDateTimeToTimeString(zonedDateTime); - assertThat(timeString, is("13:02:15")); + assertThat(timeString, is(timeLocal)); } @Test From 3dce65622dece2e0c75c03c936a67103a6ebc176 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Mon, 29 Apr 2019 10:12:08 +0200 Subject: [PATCH 2/5] modified changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6d27a05..270cb2bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. Back to [Readme](README.md). -## [1.10.1] - UNRELEASED +## [1.10.1] - 2019-04-29 ### Fixed From 55051e49c10915fb1a1dd3155f147da8d689d714 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Mon, 29 Apr 2019 14:33:52 +0200 Subject: [PATCH 3/5] streamlined mime type handling --- example-project/json/attachments.json | 8 +- .../cluecumber/json/pojo/Embedding.java | 75 +++++++++---------- .../template/snippets/common_headers.ftl | 7 ++ 3 files changed, 50 insertions(+), 40 deletions(-) diff --git a/example-project/json/attachments.json b/example-project/json/attachments.json index 8b86d536..896db620 100755 --- a/example-project/json/attachments.json +++ b/example-project/json/attachments.json @@ -73,6 +73,10 @@ "status": "failed" }, "embeddings": [ + { + "data": "PGEgaHJlZj0id3d3LmFtYXpvbi5kZSIgdGFyZ2V0PSJfYmxhbmsiPkFNQVpPTjwvYT4", + "mime_type": "text/html" + }, { "data": "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1CRYBQAAAACoSbAKAAAAAFCTYBUAAAAAoCbBKgAAAABATYJVAAAAAICaBKsAAAAAADUJVgEAAAAAahKsAgAAAADUJFgFAAAAAKhJsAoAAAAAUJNgFQAAAACgJsEqAAAAAEBNglUAAAAAgJoEqwAAAAAANQlWAQAAAABqEqwCAAAAANQkWAUAAAAAqEmwCgAAAABQk2AVAAAAAKAmwSoAAAAAQE2CVQAAAACAmgSrAAAAAAA1CVYBAAAAAGoSrAIAAAAA1CRYBQAAAACoSbAKAAAAAFCTYBUAAAAAoCbBKgAAAABATYJVAAAAAICaBKsAAAAAADUJVgEAAAAAahKsAgAAAADUJFgFAAAAAKhJsAoAAAAAUJNgFQAAAACgJsEqAAAAAEBNglUAAAAAgJoEqwAAAAAANQlWAQAAAABqEqwCAAAAANQkWAUAAAAAqEmwCgAAAABQk2AVAAAAAKAmwSoAAAAAQE2CVQAAAACAmgSrAAAAAAA1CVYBAAAAAGoSrAIAAAAA1CRYBQAAAACoSbAKAAAAAFCTYBUAAAAAoCbBKgAAAABATYJVAAAAAICaBKsAAAAAADUJVgEAAAAAahKsAgAAAADUJFgFAAAAAKhJsAoAAAAAUJNgFQAAAACgJsEqAAAAAEBNglUAAAAAgJoEqwAAAAAANQlWAQAAAABqEqwCAAAAANQkWAUAAAAAqEmwCgAAAABQk2AVAAAAAKAmwSoAAAAAQE2CVQAAAACAmgSrAAAAAAA1CVYBAAAAAGoSrAIAAAAA1CRYBQAAAACoSbAKAAAAAFCTYBUAAAAAoCbBKgAAAABATYJVAAAAAICaBKsAAAAAADUJVgEAAAAAahKsAgAAAADUJFgFAAAAAKhJsAoAAAAAUJNgFQAAAACgJsEqAAAAAEBNglUAAAAAgJoEqwAAAAAANQlWAQAAAABqEqwCAAAAANQkWAUAAAAAqEmwCgAAAABQk2AVAAAAAKAmwSoAAAAAQE2CVQAAAACAmgSrAAAAAAA1CVYBAAAAAGoSrAIAAAAA1CRYBQAAAACoSbAKAAAAAFCTYBUAAAAAoCbBKgAAAABATYJVAAAAAICaBKsAAAAAADUJVgEAAAAAahKsAgAAAADUJFgFAAAAAKhJsAoAAAAAUJNgFQAAAACgJsEqAAAAAEBNglUAAAAAgJoEqwAAAAAANQlWAQAA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\u003d", "mime_type": "image/png" @@ -81,10 +85,10 @@ "data": "PHRhYmxlIGJvcmRlcj0nMScgY2VsbHBhZGRpbmc9JzEwJyBjZWxsc3BhY2luZz0nMCc+PHRib2R5Pjx0cj48dGg+PEI+RmllbGQgTmFtZTwvdGg+PHRoPjxCPkZpZWxkIFZhbHVlPC90aD48L3RyPjx0cj48dGQ+PEI+RmllbGQgTmFtZSBPbmU8L3RkPjx0ZD48Qj5GaWVsZCBWYWx1ZSBPbmU8L3RkPjwvdHI+PHRyPjx0ZD48Qj5GaWVsZCBOYW1lIFR3bzwvdGQ+PHRkPjxCPkZpZWxkIFZhbHVlIFR3bzwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+", "mime_type": "text/html" }, - { + { "data": "MjAxOC0xMC0yMSAyMToyMjoxNiBJTkZPICAtIExvZ2dpbmcgc2V0dXAgc3VjY2Vzc2Z1bCAhDQoyMDE4LTEwLTIxIDIxOjIyOjE2IElORk8gIC0gTG9hZGluZyBPYmplY3QgUmVwb3NpdG9yeS4uLi4uDQoyMDE4LTEwLTIxIDIxOjIyOjE2IElORk8gIC0gRmlsZSBMb2FkZWQgOiBEOlxJUFNIIEF1dG9tYXRpb24gUHJvamVjdHNcSVBTSC1UZXN0X0F1dG9tYXRpb25cc3JjXHRlc3RccmVzb3VyY2VzXG9iamVjdFJlcG9zaXRvcnlcQmF0Y2hJbnF1aXJ5UGFnZS5qc29uDQoyMDE4LTEwLTIxIDIxOjIyOjE2IElORk8gIC0gRmlsZSBMb2FkZWQgOiBEOlxJUFNIIEF1dG9tYXRpb24gUHJvamVjdHNcSVBTSC1UZXN0X0F1dG9tYXRpb25cc3JjXHRlc3RccmVzb3VyY2VzXG9iamVjdFJlcG9zaXRvcnlcQmF0Y2hQcm9jZXNzaW5nLmpzb24NCjIwMTgtMTAtMjEgMjE6MjI6MTYgSU5GTyAgLSBGaWxlIExvYWRlZCA6IEQ6XElQU0ggQXV0b21hdGlvbiBQcm9qZWN0c1xJUFNILVRlc3RfQXV0b21hdGlvblxzcmNcdGVzdFxyZXNvdXJjZXNcb2JqZWN0UmVwb3NpdG9yeVxDdXN0b21lckFjY291bnRBZGRQYWdlLmpzb24NCjIwMTgtMTAtMjEgMjE6MjI6MTYgSU5GTyAgLSBGaWxlIExvYWRlZCA6IEQ6XElQU0ggQXV0b21hdGlvbiBQcm9qZWN0c1xJUFNILVRlc3RfQXV0b21hdGlvblxzcmNcdGVzdFxyZXNvdXJjZXNcb2JqZWN0UmVwb3NpdG9yeVxDdXN0b21lck1haW50ZW5hbmNlUGFnZS5qc29uDQoyMDE4LTEwLTIxIDIxOjIyOjE2IElORk8gIC0gRmlsZSBMb2FkZWQgOiBEOlxJUFNIIEF1dG9tYXRpb24gUHJvamVjdHNcSVBTSC1UZXN0X0F1dG9tYXRpb25cc3JjXHRlc3RccmVzb3VyY2VzXG9iamVjdFJlcG9zaXRvcnlcQ3VzdG9tZXJQcm9maWxlQWRkUGFnZS5qc29uDQoyMDE4LTEwLTIxIDIxOjIyOjE2IElORk8gIC0gRmlsZSBMb2FkZWQgOiBEOlxJUFNIIEF1dG9tYXRpb24gUHJvamVjdHNcSVBTSC1UZXN0X0F1dG9tYXRpb25cc3JjXHRlc3RccmVzb3VyY2VzXG9iamVjdFJlcG9zaXRvcnlcQ3VzdG9tZXJQcm9maWxlQXV0aG9yaXplUGFnZS5qc29uDQoyMDE4LTEwLTIxIDIxOjIyOjE2IElORk8gIC0gRmlsZSBMb2FkZWQgOiBEOlxJUFNIIEF1dG9tYXRpb24gUHJvamVjdHNcSVBTSC1UZXN0X0F1dG9tYXRpb25cc3JjXHRlc3RccmVzb3VyY2VzXG9iamVjdFJlcG9zaXRvcnlcQ3VzdG9tZXJQcm9maWxlRGVsZXRlUGFnZS5qc29uDQoyMDE4LTEwLTIxIDIxOjIyOjE2IElORk8gIC0gRmlsZSBMb2FkZWQgOiBEOlxJUFNIIEF1dG9tYXRpb24gUHJvamVjdHNcSVBTSC1UZXN0X0F1dG9tYXRpb25cc3JjXHRlc3RccmVzb3VyY2VzXG9iamVjdFJlcG9zaXRvcnlcQ3VzdG9tZXJQcm9maWxlRGV0YWlscy5qc29uDQoyMDE4LTEwLTIxIDIxOjIyOjE2IElORk8gIC0gRmlsZSBMb2FkZWQgOiBEOlxJUFNIIEF1dG9tYXRpb24gUHJvamVjdHNcSVBTSC1UZXN0X0F1dG9tYXRpb25cc3JjXHRlc3RccmVzb3VyY2VzXG9iamVjdFJlcG9zaXRvcnlcQ3VzdG9tZXJQcm9maWxlVmlld1BhZ2UuanNvbg0KMjAxOC0xMC0yMSAyMToyMjoxNiBJTkZPICAtIEZpbGUgTG9hZGVkIDogRDpcSVBTSCBBdXRvbWF0aW9uIFByb2plY3RzXElQU0gtVGVzdF9BdXRvbWF0aW9uXHNyY1x0ZXN0XHJlc291cmNlc1xvYmplY3RSZXBvc2l0b3J5XEZpbGVEZXRhaWxzUGFnZS5qc29uDQoyMDE4LTEwLTIxIDIxOjIyOjE2IElORk8gIC0gRmlsZSBMb2FkZWQgOiBEOlxJUFNIIEF1dG9tYXRpb24gUHJvamVjdHNcSVBTSC1UZXN0X0F1dG9tYXRpb25cc3JjXHRlc3RccmVzb3VyY2VzXG9iamVjdFJlcG9zaXRvcnlcRmlsZUlucXVpcnlQYWdlLmpzb24NCjIwMTgtMTAtMjEgMjE6MjI6MTYgSU5GTyAgLSBGaWxlIExvYWRlZCA6IEQ6XElQU0ggQXV0b21hdGlvbiBQcm9qZWN0c1xJUFNILVRlc3RfQXV0b21hdGlvblxzcmNcdGVzdFxyZXNvdXJjZXNcb2JqZWN0UmVwb3NpdG9yeVxGaWxlUHJvY2Vzc2luZy5qc29uDQoyMDE4LTEwLTIxIDIxOjIyOjE2IElORk8gIC0gRmlsZSBMb2FkZWQgOiBEOlxJUFNIIEF1dG9tYXRpb24gUHJvamVjdHNcSVBTSC1UZXN0X0F1dG9tYXRpb25cc3JjXHRlc3RccmVzb3VyY2VzXG9iamVjdFJlcG9zaXRvcnlcSW5xdWlyaWVzICYgUmVwb3J0cy5qc29uDQoyMDE4LTEwLTIxIDIxOjIyOjE2IElORk8gIC0gRmlsZSBMb2FkZWQgOiBEOlxJUFNIIEF1dG9tYXRpb24gUHJvamVjdHNcSVBTSC1UZXN0X0F1dG9tYXRpb25cc3JjXHRlc3RccmVzb3VyY2VzXG9iamVjdFJlcG9zaXRvcnlcTG9naW5QYWdlLmpzb24NCjIwMTgtMTAtMjEgMjE6MjI6MTYgSU5GTyAgLSBGaWxlIExvYWRlZCA6IEQ6XElQU0ggQXV0b21hdGlvbiBQcm9qZWN0c1xJUFNILVRlc3RfQXV0b21hdGlvblxzcmNcdGVzdFxyZXNvdXJjZXNcb2JqZWN0UmVwb3NpdG9yeVxUcmFuc2FjdGlvbklucXVpcnlQYWdlLmpzb24NCjIwMTgtMTAtMjEgMjE6MjI6MTYgSU5GTyAgLSBGaWxlIExvYWRlZCA6IEQ6XElQU0ggQXV0b21hdGlvbiBQcm9qZWN0c1xJUFNILVRlc3RfQXV0b21hdGlvblxzcmNcdGVzdFxyZXNvdXJjZXNcb2JqZWN0UmVwb3NpdG9yeVxUcmFuc2FjdGlvblByb2Nlc3NpbmcuanNvbg0KMjAxOC0xMC0yMSAyMToyMjoxNiBJTkZPICAtIEZpbGUgTG9hZGVkIDogRDpcSVBTSCBBdXRvbWF0aW9uIFByb2plY3RzXElQU0gtVGVzdF9BdXRvbWF0aW9uXHNyY1x0ZXN0XHJlc291cmNlc1xvYmplY3RSZXBvc2l0b3J5XFdvcmtzcGFjZVBhZ2UuanNvbg0KMjAxOC0xMC0yMSAyMToyMjoxNiBJTkZPICAtIE9iamVjdCBSZXBvc2l0b3J5IGxvYWRlZCBzdWNjZXNzZnVsbHkuLi4NCjIwMTgtMTAtMjEgMjE6MjI6MTYgSU5GTyAgLSBzY2VuYXJpb19pZCA9IEBHVEJJUFNILUxvZ2luVGVzdA0KMjAxOC0xMC0yMSAyMToyMjoxNiBJTkZPICAtIEZpbGUgaXMgbm90IHVwbG9hZGVkIGZvciB0aGlzIHNjZW5hcmlvICEhIQ0KMjAxOC0xMC0yMSAyMToyMjo1NyBJTkZPICAtIGh0dHBzOi8vd3d3Lmdvb2dsZS5jby5pbiBVUkwgb3BlbmVkIGluIGJyb3dzZXINCjIwMTgtMTAtMjEgMjE6MjI6NTcgSU5GTyAgLSBTY3JlZW5zaG90IGNhcHR1cmVkIHN1Y2Nlc3NmdWxseQ0KMjAxOC0xMC0yMSAyMToyMjo1OCBJTkZPICAtIENsb3NlZCBhbGwgYnJvd3NlcnMNCg\u003d\u003d", "mime_type": "text/plain" - } + } ], "output": [ "OUTPUT_FIELD_NAME : Test Field", diff --git a/plugin-code/src/main/java/com/trivago/cluecumber/json/pojo/Embedding.java b/plugin-code/src/main/java/com/trivago/cluecumber/json/pojo/Embedding.java index 452cfc11..da43fa9d 100644 --- a/plugin-code/src/main/java/com/trivago/cluecumber/json/pojo/Embedding.java +++ b/plugin-code/src/main/java/com/trivago/cluecumber/json/pojo/Embedding.java @@ -23,14 +23,14 @@ import java.nio.charset.StandardCharsets; public class Embedding { - + private String data; private String decodedData; @SerializedName("mime_type") private MimeType mimeType = MimeType.UNKNOWN; - + private transient String filename; - + public String getData() { return data; } @@ -44,11 +44,11 @@ public String getDecodedData() { } public void encodeData(final String data) { - if(mimeType.getContentType().equalsIgnoreCase("text/xml") || mimeType.getContentType().equalsIgnoreCase("application/xml")){ - String xmlString = new String(Base64.decodeBase64(data.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8); - decodedData = xmlString.replaceAll("<", "<").replaceAll(">", ">"); - }else{ - decodedData = new String(Base64.decodeBase64(data.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8); + decodedData = new String(Base64.decodeBase64(data.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8); + if (mimeType == MimeType.XML || mimeType == MimeType.APPLICATION_XML) { + decodedData = decodedData.replaceAll("<", "<").replaceAll(">", ">"); + } else if (mimeType == MimeType.HTML) { + decodedData = decodedData.replaceAll("\"", "'"); } } @@ -69,41 +69,40 @@ public void setFilename(final String filename) { } public boolean isImage() { - return - mimeType.getContentType().equalsIgnoreCase("image/png") || - mimeType.getContentType().equalsIgnoreCase("image/gif") || - mimeType.getContentType().equalsIgnoreCase("image/bmp") || - mimeType.getContentType().equalsIgnoreCase("image/jpg") || - mimeType.getContentType().equalsIgnoreCase("image/jpeg") || - mimeType.getContentType().equalsIgnoreCase("image/svg") || - mimeType.getContentType().equalsIgnoreCase("image/svg+xml"); + return mimeType == MimeType.PNG || + mimeType == MimeType.GIF || + mimeType == MimeType.BMP || + mimeType == MimeType.JPEG || + mimeType == MimeType.JPG || + mimeType == MimeType.SVG || + mimeType == MimeType.SVG_XML; } public boolean isPlainText() { return mimeType.getContentType().equalsIgnoreCase("text/plain"); - } - + } + public String getFileEnding() { switch (mimeType) { - case PNG: - case GIF: - case BMP: - case JPG: - case JPEG: - case HTML: - case XML: - case JSON: - case APPLICATION_XML: - return mimeType.getContentType().substring(mimeType.getContentType().indexOf('/') + 1); - case SVG: - case SVG_XML: - return "svg"; - case TXT: - return "txt"; - case PDF: - return "pdf"; - default: - return "unknown"; + case PNG: + case GIF: + case BMP: + case JPG: + case JPEG: + case HTML: + case XML: + case JSON: + case APPLICATION_XML: + return mimeType.getContentType().substring(mimeType.getContentType().indexOf('/') + 1); + case SVG: + case SVG_XML: + return "svg"; + case TXT: + return "txt"; + case PDF: + return "pdf"; + default: + return "unknown"; } - } + } } diff --git a/plugin-code/src/main/resources/template/snippets/common_headers.ftl b/plugin-code/src/main/resources/template/snippets/common_headers.ftl index 28be9900..02954936 100644 --- a/plugin-code/src/main/resources/template/snippets/common_headers.ftl +++ b/plugin-code/src/main/resources/template/snippets/common_headers.ftl @@ -16,6 +16,13 @@ limitations under the License. + From b3da10723161c774ae2333611f4067a92365f0dc Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Mon, 29 Apr 2019 14:34:38 +0200 Subject: [PATCH 4/5] updated changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 270cb2bd..26d07410 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ Back to [Readme](README.md). * Incorrect wrapping for urls in custom parameters * UTC timezone conversion for timestamps +### Changed + +* more resilient mime type handling + ## [1.10.0] - 2019-04-16 ### Fixed From 9acebe20400991f013107759e36ddc8a030cf0e8 Mon Sep 17 00:00:00 2001 From: Benjamin Bischoff Date: Mon, 29 Apr 2019 14:43:42 +0200 Subject: [PATCH 5/5] added embedding test --- .../cluecumber/json/pojo/EmbeddingTest.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/plugin-code/src/test/java/com/trivago/cluecumber/json/pojo/EmbeddingTest.java b/plugin-code/src/test/java/com/trivago/cluecumber/json/pojo/EmbeddingTest.java index 709856fb..a2ee3e2b 100644 --- a/plugin-code/src/test/java/com/trivago/cluecumber/json/pojo/EmbeddingTest.java +++ b/plugin-code/src/test/java/com/trivago/cluecumber/json/pojo/EmbeddingTest.java @@ -1,15 +1,13 @@ package com.trivago.cluecumber.json.pojo; +import com.trivago.cluecumber.constants.MimeType; +import org.codehaus.plexus.util.Base64; import org.junit.Before; import org.junit.Test; -import com.trivago.cluecumber.constants.MimeType; - import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import org.codehaus.plexus.util.Base64; - public class EmbeddingTest { private Embedding embedding; @@ -59,14 +57,14 @@ public void isPlainTextTest() { embedding.setMimeType(MimeType.TXT); assertThat(embedding.isPlainText(), is(true)); } - + @Test public void getDecodedDataTest() { String originalInput = "This is getDecodeData() Test !!!"; String encodeString = new String(Base64.encodeBase64(originalInput.getBytes())); embedding.setMimeType(MimeType.TXT); embedding.encodeData(encodeString); - assertThat(embedding.getDecodedData(),is("This is getDecodeData() Test !!!")); + assertThat(embedding.getDecodedData(), is("This is getDecodeData() Test !!!")); } @Test @@ -75,9 +73,18 @@ public void getDecodedDataForXMLTest() { String encodeString = new String(Base64.encodeBase64(originalInput.getBytes())); embedding.setMimeType(MimeType.XML); embedding.encodeData(encodeString); - assertThat(embedding.getDecodedData(),is("<?xml version=\"1.0\" encoding=\"UTF-8\"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>")); + assertThat(embedding.getDecodedData(), is("<?xml version=\"1.0\" encoding=\"UTF-8\"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>")); + } + + @Test + public void getDecodedDataForHTMLTest() { + String originalInput = "test"; + String encodeString = new String(Base64.encodeBase64(originalInput.getBytes())); + embedding.setMimeType(MimeType.HTML); + embedding.encodeData(encodeString); + assertThat(embedding.getDecodedData(), is("test")); } - + @Test public void getFileEndingTest() { embedding.setMimeType(MimeType.PNG); @@ -100,11 +107,11 @@ public void getFileEndingTest() { assertThat(embedding.getFileEnding(), is("svg")); embedding.setMimeType(MimeType.SVG_XML); assertThat(embedding.getFileEnding(), is("svg")); - embedding.setMimeType(MimeType.TXT); + embedding.setMimeType(MimeType.TXT); assertThat(embedding.getFileEnding(), is("txt")); embedding.setMimeType(MimeType.PDF); assertThat(embedding.getFileEnding(), is("pdf")); embedding.setMimeType(MimeType.UNKNOWN); assertThat(embedding.getFileEnding(), is("unknown")); - } + } }