From 6e2549de7f73c1a1a09c5b38500d10080849dfb7 Mon Sep 17 00:00:00 2001 From: Saturnino Abril Date: Thu, 15 Oct 2020 02:27:57 +0800 Subject: [PATCH] MM-28653 Detox/E2E: Add jest-junit, jest-html-reporters and pathbuilders for test report/artifacts (#4888) * add jest-junit, jest-html-reporters and pathbuilders for test report/artifacts * change optional chaining implementation --- .gitignore | 1 + detox/.detoxrc.json | 5 ++- detox/e2e/config.js | 28 ++++++++++++++ detox/e2e/config.json | 9 ----- detox/e2e/path_builder.js | 24 ++++++++++++ detox/package-lock.json | 77 +++++++++++++++++++++++++++++++++++++++ detox/package.json | 7 +++- 7 files changed, 139 insertions(+), 12 deletions(-) create mode 100644 detox/e2e/config.js delete mode 100644 detox/e2e/config.json create mode 100644 detox/e2e/path_builder.js diff --git a/.gitignore b/.gitignore index aae9dc69b..c229297c6 100644 --- a/.gitignore +++ b/.gitignore @@ -92,6 +92,7 @@ coverage # E2E testing mattermost-license.txt *.mattermost-license +detox/artifacts # Bundle artifact *.jsbundle diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 842094992..4d2ddbfb0 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -1,6 +1,6 @@ { "testRunner": "jest", - "runnerConfig": "e2e/config.json", + "runnerConfig": "e2e/config.js", "configurations": { "ios.sim.debug": { "binaryPath": "../ios/Build/Products/Debug-iphonesimulator/Mattermost.app", @@ -34,6 +34,9 @@ } } }, + "artifacts": { + "pathBuilder": "./e2e/path_builder.js" + }, "behavior": { "init": { "launchApp": false diff --git a/detox/e2e/config.js b/detox/e2e/config.js new file mode 100644 index 000000000..724715f7e --- /dev/null +++ b/detox/e2e/config.js @@ -0,0 +1,28 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +const platform = process.env.IOS ? 'ios' : 'android'; + +module.exports = { + setupFilesAfterEnv: ['./init.js'], + testEnvironment: './environment', + testRunner: 'jest-circus/runner', + testTimeout: 120000, + testRegex: '\\.e2e\\.js$', + reporters: [ + '../node_modules/detox/runners/jest/streamlineReporter', + ['jest-junit', { + suiteName: 'Mobile App E2E with Detox and Jest', + outputDirectory: './artifacts', + outputName: `${platform}-junit.xml`, + uniqueOutputName: false, + }], + ['jest-html-reporters', { + pageTitle: 'Mobile App E2E with Detox and Jest', + publicPath: './artifacts', + filename: `${platform}-report.html`, + expand: false, + }], + ], + verbose: true, +}; diff --git a/detox/e2e/config.json b/detox/e2e/config.json deleted file mode 100644 index 87bedc37a..000000000 --- a/detox/e2e/config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "setupFilesAfterEnv" : ["./init.js"], - "testEnvironment": "./environment", - "testRunner": "jest-circus/runner", - "testTimeout": 120000, - "testRegex": "\\.e2e\\.js$", - "reporters": ["detox/runners/jest/streamlineReporter"], - "verbose": true -} diff --git a/detox/e2e/path_builder.js b/detox/e2e/path_builder.js new file mode 100644 index 000000000..3e2050d7a --- /dev/null +++ b/detox/e2e/path_builder.js @@ -0,0 +1,24 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +const path = require('path'); +const sanitizeFilename = require('sanitize-filename'); + +const SANITIZE_OPTIONS = {replacement: '_'}; +const sanitize = (filename) => sanitizeFilename(filename, SANITIZE_OPTIONS); + +class CustomPathBuilder { + constructor({rootDir}) { + this.rootDir = rootDir; + } + + buildPathForTestArtifact(artifactName, testSummary = null) { + const fullName = (testSummary && testSummary.fullName) || ''; + const segments = [this.rootDir, sanitize(fullName), sanitize(artifactName)]; + return path.join(...segments.filter(Boolean)); + } +} + +module.exports = ({rootDir}) => { + return new CustomPathBuilder({rootDir}); +}; diff --git a/detox/package-lock.json b/detox/package-lock.json index 00c2ee964..8de4e7d32 100644 --- a/detox/package-lock.json +++ b/detox/package-lock.json @@ -1868,6 +1868,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -4261,6 +4267,45 @@ "walker": "^1.0.7" } }, + "jest-html-reporters": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jest-html-reporters/-/jest-html-reporters-2.1.0.tgz", + "integrity": "sha512-1RAyEtvfpHHv4pbrl4Y7Vm777ucHkTH2G0Rvpo9M9/ew2TwPqhvEi37IoTLf+gdelDxaS0QqyH89+9lO6omAcA==", + "dev": true, + "requires": { + "fs-extra": "^9.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + } + } + }, "jest-jasmine2": { "version": "26.4.2", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz", @@ -4339,6 +4384,32 @@ } } }, + "jest-junit": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.0.0.tgz", + "integrity": "sha512-+8K35LlboWiPuCnXSyiid7rFdxNlpCWWM20WEYe6IZH6psfUWKZmSpSRQ5tk0C0cBeDsvsnIzcef5mYhyJsbug==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^3.3.3", + "xml": "^1.0.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, "jest-leak-detector": { "version": "26.4.2", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz", @@ -7492,6 +7563,12 @@ "ultron": "~1.1.0" } }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", diff --git a/detox/package.json b/detox/package.json index 5ba1aa783..d90ba4c83 100644 --- a/detox/package.json +++ b/detox/package.json @@ -16,6 +16,9 @@ "jest": "26.4.2", "jest-circus": "26.4.2", "jest-cli": "26.4.2", + "jest-html-reporters": "2.1.0", + "jest-junit": "12.0.0", + "sanitize-filename": "1.6.3", "uuid": "8.3.0" }, "scripts": { @@ -23,10 +26,10 @@ "e2e:android-build": "detox build -c android.emu.debug", "e2e:android-test": "detox test -c android.emu.debug", "e2e:android-build-release": "detox build -c android.emu.release", - "e2e:android-test-release": "detox test -c android.emu.release", + "e2e:android-test-release": "detox test -c android.emu.release --record-logs failing --take-screenshots failing", "e2e:ios-test": "IOS=true detox test -c ios.sim.debug", "e2e:ios-build-release": "detox build -c ios.sim.release", - "e2e:ios-test-release": "IOS=true detox test -c ios.sim.release" + "e2e:ios-test-release": "IOS=true detox test -c ios.sim.release --record-logs failing --take-screenshots failing" }, "jest": { "transform": {