detox 20.0.14-is-hittable-over-master.0 → 20.0.14-prerelease.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. package/Detox-android/com/wix/detox/{20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-javadoc.jar → 20.0.14-prerelease.0/detox-20.0.14-prerelease.0-javadoc.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0-javadoc.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-sources.jar → 20.0.14-prerelease.0/detox-20.0.14-prerelease.0-sources.jar} +0 -0
  7. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0-sources.jar.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/{20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.aar → 20.0.14-prerelease.0/detox-20.0.14-prerelease.0.aar} +0 -0
  12. package/Detox-android/com/wix/detox/{20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.aar.md5 → 20.0.14-prerelease.0/detox-20.0.14-prerelease.0.aar.md5} +0 -0
  13. package/Detox-android/com/wix/detox/{20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.aar.sha1 → 20.0.14-prerelease.0/detox-20.0.14-prerelease.0.aar.sha1} +0 -0
  14. package/Detox-android/com/wix/detox/{20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.aar.sha256 → 20.0.14-prerelease.0/detox-20.0.14-prerelease.0.aar.sha256} +0 -0
  15. package/Detox-android/com/wix/detox/{20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.aar.sha512 → 20.0.14-prerelease.0/detox-20.0.14-prerelease.0.aar.sha512} +0 -0
  16. package/Detox-android/com/wix/detox/{20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.pom → 20.0.14-prerelease.0/detox-20.0.14-prerelease.0.pom} +1 -1
  17. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/20.0.14-prerelease.0/detox-20.0.14-prerelease.0.pom.sha512 +1 -0
  21. package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
  22. package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
  23. package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
  24. package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
  25. package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
  26. package/Detox-ios-src.tbz +0 -0
  27. package/Detox-ios.tbz +0 -0
  28. package/android/build.gradle +0 -1
  29. package/android/detox/proguard-rules-app.pro +4 -2
  30. package/index.d.ts +105 -19
  31. package/internals.d.ts +103 -22
  32. package/local-cli/cli.js +1 -1
  33. package/local-cli/init.js +1 -1
  34. package/local-cli/test.js +6 -6
  35. package/local-cli/test.test.js +41 -41
  36. package/local-cli/testCommand/TestRunnerCommand.js +75 -78
  37. package/local-cli/testCommand/builder.js +0 -1
  38. package/local-cli/testCommand/middlewares.js +1 -11
  39. package/local-cli/testCommand/warnings.js +0 -3
  40. package/local-cli/utils/jestInternals.js +4 -1
  41. package/package.json +27 -13
  42. package/runners/deprecation.js +42 -44
  43. package/runners/jest/index.d.ts +60 -0
  44. package/runners/jest/index.js +3 -8
  45. package/runners/jest/reporters/DetoxReporter.js +21 -10
  46. package/runners/jest/testEnvironment/index.js +57 -41
  47. package/runners/jest/testEnvironment/listeners/DetoxCoreListener.js +7 -3
  48. package/runners/jest/testEnvironment/listeners/SpecReporter.js +12 -14
  49. package/runners/jest/testEnvironment/listeners/WorkerAssignReporter.js +1 -5
  50. package/runners/jest/testEnvironment/utils/assertJestCircus27.js +17 -3
  51. package/runners/jest/testEnvironment/utils/assertJestCircus27.test.js +0 -1
  52. package/src/DetoxWorker.js +95 -55
  53. package/src/artifacts/ArtifactsManager.js +6 -24
  54. package/src/configuration/collectCliConfig.js +1 -12
  55. package/src/configuration/composeLoggerConfig.js +2 -2
  56. package/src/configuration/composeRunnerConfig.js +8 -6
  57. package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +1 -1
  58. package/src/errors/DetoxConfigErrorComposer.js +6 -1
  59. package/src/ipc/SessionState.js +8 -6
  60. package/src/logger/DetoxLogger.js +5 -25
  61. package/src/logger/index.js +1 -0
  62. package/src/logger/utils/CategoryThreadDispatcher.js +7 -29
  63. package/src/logger/utils/DetoxLogFinalizer.js +134 -0
  64. package/src/logger/utils/ThreadDispatcher.js +5 -25
  65. package/src/logger/utils/customConsoleLogger.js +4 -3
  66. package/src/logger/utils/streamUtils.js +34 -26
  67. package/src/realms/DetoxContext.js +10 -13
  68. package/src/realms/DetoxInternalsFacade.js +0 -6
  69. package/src/realms/DetoxPrimaryContext.js +29 -84
  70. package/src/realms/DetoxSecondaryContext.js +6 -10
  71. package/src/symbols.js +0 -12
  72. package/src/utils/argparse.js +11 -0
  73. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-javadoc.jar.md5 +0 -1
  74. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-javadoc.jar.sha1 +0 -1
  75. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-javadoc.jar.sha256 +0 -1
  76. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-javadoc.jar.sha512 +0 -1
  77. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-sources.jar.md5 +0 -1
  78. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-sources.jar.sha1 +0 -1
  79. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-sources.jar.sha256 +0 -1
  80. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0-sources.jar.sha512 +0 -1
  81. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.pom.md5 +0 -1
  82. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.pom.sha1 +0 -1
  83. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.pom.sha256 +0 -1
  84. package/Detox-android/com/wix/detox/20.0.14-is-hittable-over-master.0/detox-20.0.14-is-hittable-over-master.0.pom.sha512 +0 -1
  85. package/runners/jest/deprecation.js +0 -25
  86. package/src/configuration/utils/warnings.js +0 -12
@@ -1,47 +1,45 @@
1
1
  const chalk = require('chalk');
2
2
 
3
3
  // @ts-ignore
4
- console.error(chalk.yellow(`
5
- ========================= THE NEW JOURNEY BEGINS =============================
6
-
7
- https://wix.github.io/Detox/docs/next/guide/migration
8
-
9
- _.-;-._ Sorry, traveler from the lands of Detox 19!
10
- ;_.JL___;
11
- F"-/\\_-7L Detox 20 comes without old adapters for Jest
12
- | a/ e | \\ and Mocha test runners. You have to rearrange
13
- ,L,c;,.='/;, your init code before you can continue your
14
- _,-;;S:;:S;;:' '--._ journey.
15
- ;. \\;;s:::s;;: .' /\\
16
- / \\ ;::::;; / / \\ Navigate to the link above and follow the
17
- / , k ;S';;'S.' j __,l migration guide steps.
18
- ,---/| / /S /S '. |' ;
19
- ,Ljjj |/|.' s .' s \\ L | Sincerely yours,
20
- LL,_ ]( \\ / '. '.|| ; Detox team.
21
- ||\\ > / ;-.'_.-.___\\.-'(|=="(
22
- JJ," / |_ [ ] _]| /
23
- LL\\/ ,' '--'-'-----' \\ (
24
- || ; | | >
25
- JJ | |\\ |,/
26
- LL | || ' |
27
- || | || . |
28
- JJ /_ || ;_|
29
- LL L "==='|i======='_|
30
- || i----' '-------';
31
- JJ ';-----.------,-'
32
- LL L_.__J,'---;'
33
- || | ,| (
34
- JJ .'= (| ,_|
35
- LL / .'L_ \\
36
- snd || '---' '.___>
37
- Credit: "Gimli" by Shanaka Dias
38
-
39
- https://wix.github.io/Detox/docs/next/guide/migration
40
-
41
- ========================= THE NEW JOURNEY BEGINS =============================
42
-
43
- `));
44
-
45
- throw Object.assign(new Error(
46
- '\n\nPlease follow the new Jest setup guide:\nhttps://github.com/wix/Detox/blob/master/docs/Guide.Jest.md\n\n'
47
- ), { stack: '' });
4
+ const bold = chalk.bold;
5
+
6
+ function getMaxWidth(text) {
7
+ const lines = text.split('\n');
8
+ return lines.reduce((acc, line) => Math.max(acc, line.length), 0);
9
+ }
10
+
11
+ function centerText(text, maxWidth = getMaxWidth(text)) {
12
+ return text
13
+ .split('\n')
14
+ .map(line => {
15
+ const padStart = Math.max(0, Math.floor((maxWidth - line.length) / 2));
16
+ const padEnd = Math.max(0, maxWidth - line.length - padStart);
17
+ return ' '.repeat(padStart) + line + ' '.repeat(padEnd);
18
+ })
19
+ .join('\n');
20
+ }
21
+
22
+ const header = `\
23
+ ========================= THE NEW JOURNEY BEGINS =============================`;
24
+
25
+ console.error(centerText(`\
26
+
27
+ ${bold(header)}
28
+
29
+ https://wix.github.io/Detox/docs/next/guide/migration
30
+
31
+ Sorry to say that Detox 20 comes without old adapters for Jest.
32
+ You have to rearrange your init code before you can continue your journey.
33
+
34
+ Navigate to the link and follow the migration guide steps.
35
+
36
+ Sincerely yours,
37
+ Detox team.
38
+
39
+ ${bold(header)}
40
+
41
+ `, header.length));
42
+
43
+ const error = new Error('\nPlease follow the migration guide:\nhttps://wix.github.io/Detox/docs/next/guide/migration\n\n');
44
+ error.stack = '';
45
+ throw error;
@@ -0,0 +1,60 @@
1
+ declare module 'detox/runners/jest' {
2
+ import type NodeEnvironment from 'jest-environment-node';
3
+
4
+ export function globalSetup(): Promise<void>;
5
+ export function globalTeardown(): Promise<void>;
6
+
7
+ export type DetoxCircusListenerConstructorOpts = {
8
+ readonly env: DetoxCircusEnvironment;
9
+ }
10
+
11
+ /**
12
+ * @example
13
+ * class CustomListener implements DetoxCircusListener {
14
+ * constructor(opts: DetoxCircusListenerConstructorOpts) {
15
+ * console.log('Current test path is:', opts.env.testPath);
16
+ * }
17
+ * }
18
+ */
19
+ export interface DetoxCircusListener {
20
+ start_describe_definition?(event: unknown, state: unknown): void;
21
+ finish_describe_definition?(event: unknown, state: unknown): void;
22
+ add_hook?(event: unknown, state: unknown): void;
23
+ add_test?(event: unknown, state: unknown): void;
24
+ error?(event: unknown, state: unknown): void;
25
+
26
+ setup?(event: unknown, state: unknown): void | Promise<void>;
27
+ include_test_location_in_result?(event: unknown, state: unknown): void | Promise<void>;
28
+ hook_start?(event: unknown, state: unknown): void | Promise<void>;
29
+ hook_success?(event: unknown, state: unknown): void | Promise<void>;
30
+ hook_failure?(event: unknown, state: unknown): void | Promise<void>;
31
+ test_fn_start?(event: unknown, state: unknown): void | Promise<void>;
32
+ test_fn_success?(event: unknown, state: unknown): void | Promise<void>;
33
+ test_fn_failure?(event: unknown, state: unknown): void | Promise<void>;
34
+ test_retry?(event: unknown, state: unknown): void | Promise<void>;
35
+ test_start?(event: unknown, state: unknown): void | Promise<void>;
36
+ test_skip?(event: unknown, state: unknown): void | Promise<void>;
37
+ test_todo?(event: unknown, state: unknown): void | Promise<void>;
38
+ test_done?(event: unknown, state: unknown): void | Promise<void>;
39
+ run_describe_start?(event: unknown, state: unknown): void | Promise<void>;
40
+ run_describe_finish?(event: unknown, state: unknown): void | Promise<void>;
41
+ run_start?(event: unknown, state: unknown): void | Promise<void>;
42
+ run_finish?(event: unknown, state: unknown): void | Promise<void>;
43
+ teardown?(event: unknown, state: unknown): void | Promise<void>;
44
+ }
45
+
46
+ export interface DetoxListenerFactory {
47
+ new (opts: DetoxCircusListenerConstructorOpts): DetoxCircusListener;
48
+ }
49
+
50
+ export class DetoxCircusEnvironment extends NodeEnvironment {
51
+ public readonly handleTestEvent: (event: unknown, state: unknown) => void | Promise<void>;
52
+ public readonly testPath: string;
53
+
54
+ protected registerListeners(map: Record<string, DetoxListenerFactory>): void;
55
+ protected setupTimeout: number;
56
+ protected teardownTimeout: number;
57
+ protected initDetox(): Promise<DetoxInternals.Worker>;
58
+ protected cleanupDetox(): Promise<void>;
59
+ }
60
+ }
@@ -1,14 +1,11 @@
1
- module.exports = {
2
- //#region *** Runner Realm ***
1
+ // Lazy require() is used to avoid initializing a bare Detox context when it is not needed.
2
+ // At the moment, this safety measure is not really needed, but it's better to be on the safe side.
3
3
 
4
+ module.exports = {
4
5
  get DetoxCircusEnvironment() {
5
6
  return require('./testEnvironment');
6
7
  },
7
8
 
8
- //#endregion
9
-
10
- //#region *** Worker Realm ***
11
-
12
9
  get globalSetup() {
13
10
  return require('./globalSetup');
14
11
  },
@@ -16,6 +13,4 @@ module.exports = {
16
13
  get globalTeardown() {
17
14
  return require('./globalTeardown');
18
15
  },
19
-
20
- //#endregion
21
16
  };
@@ -5,20 +5,31 @@ const JestVerboseReporter = require(resolveFrom(process.cwd(), '@jest/reporters'
5
5
  const { config, reportTestResults } = require('../../../internals');
6
6
 
7
7
  class DetoxReporter extends JestVerboseReporter {
8
+ /**
9
+ * @param {import('@jest/test-result').AggregatedResult} results
10
+ */
11
+ // @ts-ignore
12
+ async onRunComplete(_contexts, results) {
13
+ // @ts-ignore
14
+ await super.onRunComplete(_contexts, results);
15
+
16
+ await reportTestResults(results.testResults.map(r => ({
17
+ success: !r.failureMessage,
18
+ testFilePath: r.testFilePath,
19
+ testExecError: r.testExecError,
20
+ isPermanentFailure: this._isPermanentFailure(r),
21
+ })));
22
+ }
23
+
8
24
  /**
9
25
  * @param {import('@jest/test-result').TestResult} testResult
10
26
  */
11
- async onTestResult(test, testResult, results) {
12
- await super.onTestResult(test, testResult, results);
27
+ _isPermanentFailure(testResult) {
28
+ if (config.testRunner.jest.retryAfterCircusRetries) {
29
+ return false;
30
+ }
13
31
 
14
- await reportTestResults([{
15
- success: !testResult.failureMessage,
16
- testFilePath: testResult.testFilePath,
17
- testExecError: testResult.testExecError,
18
- isPermanentFailure: config.testRunner.jest.retryAfterCircusRetries
19
- ? false
20
- : testResult.testResults.some(r => r.invocations > 1)
21
- }]);
32
+ return testResult.testResults.some(r => r.status === 'failed' && r.invocations > 1);
22
33
  }
23
34
  }
24
35
 
@@ -1,3 +1,5 @@
1
+ const path = require('path');
2
+
1
3
  const resolveFrom = require('resolve-from');
2
4
  const maybeNodeEnvironment = require(resolveFrom(process.cwd(), 'jest-environment-node'));
3
5
  /** @type {typeof import('@jest/environment').JestEnvironment} */
@@ -39,7 +41,7 @@ class DetoxCircusEnvironment extends NodeEnvironment {
39
41
  this._timer = new Timer();
40
42
 
41
43
  /** @internal */
42
- this.testPath = context.testPath;
44
+ this.testPath = path.relative(process.cwd(), context.testPath);
43
45
  /** @protected */
44
46
  this.testEventListeners = [];
45
47
  /** @protected */
@@ -49,45 +51,8 @@ class DetoxCircusEnvironment extends NodeEnvironment {
49
51
 
50
52
  log.trace.begin(this.testPath);
51
53
 
52
- const _setup = this.setup.bind(this);
53
- this.setup = async () => {
54
- await log.trace.complete('set up environment', async () => {
55
- try {
56
- this._timer.schedule(this.setupTimeout);
57
- await this._handleTestEventAsync({ name: 'environment_setup_start' });
58
- await this._timer.run(`setting up Detox environment`, _setup);
59
- await this._handleTestEventAsync({ name: 'environment_setup_success' });
60
- } catch (error) {
61
- this._timer.schedule(this.teardownTimeout);
62
- await this._handleTestEventAsync({ name: 'environment_setup_failure', error });
63
- throw error;
64
- } finally {
65
- this._timer.clear();
66
- }
67
- });
68
- };
69
-
70
- const _teardown = this.teardown.bind(this);
71
- this.teardown = async () => {
72
- await log.trace.complete('tear down environment', async () => {
73
- try {
74
- this._timer.schedule(this.teardownTimeout);
75
- await this._handleTestEventAsync({ name: 'environment_teardown_start' });
76
- await this._timer.run(`tearing down Detox environment`, _teardown);
77
- await this._handleTestEventAsync({ name: 'environment_teardown_success' });
78
- } catch (error) {
79
- if (this._timer.expired) {
80
- this._timer.schedule(this.teardownTimeout);
81
- }
82
-
83
- await this._handleTestEventAsync({ name: 'environment_teardown_failure', error });
84
- throw error;
85
- } finally {
86
- this._timer.clear();
87
- log.trace.end();
88
- }
89
- });
90
- };
54
+ this.setup = this._wrapSetup(this.setup);
55
+ this.teardown = this._wrapTeardown(this.teardown);
91
56
 
92
57
  this.registerListeners({
93
58
  DetoxInitErrorListener,
@@ -100,6 +65,7 @@ class DetoxCircusEnvironment extends NodeEnvironment {
100
65
 
101
66
  /** @override */
102
67
  async setup() {
68
+ await super.setup();
103
69
  await this.initDetox();
104
70
  }
105
71
 
@@ -115,7 +81,11 @@ class DetoxCircusEnvironment extends NodeEnvironment {
115
81
 
116
82
  /** @override */
117
83
  async teardown() {
118
- await this.cleanupDetox();
84
+ try {
85
+ await this.cleanupDetox();
86
+ } finally {
87
+ await super.teardown();
88
+ }
119
89
  }
120
90
 
121
91
  /** @protected */
@@ -184,6 +154,52 @@ class DetoxCircusEnvironment extends NodeEnvironment {
184
154
  }
185
155
  }
186
156
  }
157
+
158
+ _wrapSetup(fn) {
159
+ const _setup = fn.bind(this);
160
+
161
+ return async () => {
162
+ await log.trace.complete('set up environment', async () => {
163
+ try {
164
+ this._timer.schedule(this.setupTimeout);
165
+ await this._handleTestEventAsync({ name: 'environment_setup_start' });
166
+ await this._timer.run(`setting up Detox environment`, _setup);
167
+ await this._handleTestEventAsync({ name: 'environment_setup_success' });
168
+ } catch (error) {
169
+ this._timer.schedule(this.teardownTimeout);
170
+ await this._handleTestEventAsync({ name: 'environment_setup_failure', error });
171
+ throw error;
172
+ } finally {
173
+ this._timer.clear();
174
+ }
175
+ });
176
+ };
177
+ }
178
+
179
+ _wrapTeardown(fn) {
180
+ const _teardown = fn.bind(this);
181
+
182
+ return async () => {
183
+ await log.trace.complete('tear down environment', async () => {
184
+ try {
185
+ this._timer.schedule(this.teardownTimeout);
186
+ await this._handleTestEventAsync({ name: 'environment_teardown_start' });
187
+ await this._timer.run(`tearing down Detox environment`, _teardown);
188
+ await this._handleTestEventAsync({ name: 'environment_teardown_success' });
189
+ } catch (error) {
190
+ if (this._timer.expired) {
191
+ this._timer.schedule(this.teardownTimeout);
192
+ }
193
+
194
+ await this._handleTestEventAsync({ name: 'environment_teardown_failure', error });
195
+ throw error;
196
+ } finally {
197
+ this._timer.clear();
198
+ log.trace.end();
199
+ }
200
+ });
201
+ };
202
+ }
187
203
  }
188
204
 
189
205
  module.exports = DetoxCircusEnvironment;
@@ -11,8 +11,8 @@ const log = detoxInternals.log.child({ cat: 'lifecycle,jest-environment' });
11
11
 
12
12
  class DetoxCoreListener {
13
13
  constructor({ env }) {
14
- this._startedTests = new WeakSet();
15
- this._testsFailedBeforeStart = new WeakSet();
14
+ this._startedTests = new Set();
15
+ this._testsFailedBeforeStart = new Set();
16
16
  this._env = env;
17
17
  this._circusRetryTimes = 1;
18
18
  }
@@ -100,7 +100,7 @@ class DetoxCoreListener {
100
100
  }
101
101
 
102
102
  async _onBeforeActualTestStart(test) {
103
- if (!test || test.status === 'skip' || this._startedTests.has(test) || this._testsFailedBeforeStart.has(test)) {
103
+ if (!this._isTestActuallyStarting(test)) {
104
104
  return false;
105
105
  }
106
106
 
@@ -122,6 +122,10 @@ class DetoxCoreListener {
122
122
  return true;
123
123
  }
124
124
 
125
+ _isTestActuallyStarting(test) {
126
+ return test && test.status !== 'skip' && !this._startedTests.has(test) && !this._testsFailedBeforeStart.has(test);
127
+ }
128
+
125
129
  _getTestInvocations(test) {
126
130
  const { testSessionIndex } = detoxInternals.session;
127
131
  return testSessionIndex * this._circusRetryTimes + test.invocations;
@@ -1,4 +1,5 @@
1
1
  const chalk = require('chalk').default;
2
+ const noop = require('lodash/noop');
2
3
 
3
4
  const { config, log, session } = require('../../../../internals');
4
5
  const { traceln } = require('../utils/stdout');
@@ -15,16 +16,21 @@ class SpecReporter {
15
16
  this._suitesDesc = '';
16
17
  }
17
18
 
18
- get enabled() {
19
+ setup() {
19
20
  const jestSection = config.testRunner.jest;
20
21
  const reportSpecs = jestSection && jestSection.reportSpecs;
21
-
22
- return reportSpecs !== undefined ? reportSpecs : session.workersCount === 1;
22
+ const enabled = reportSpecs !== undefined ? reportSpecs : session.workersCount === 1;
23
+
24
+ if (!enabled) {
25
+ this.run_describe_start = noop;
26
+ this.run_describe_finish = noop;
27
+ this.test_start = noop;
28
+ this.test_done = noop;
29
+ this.test_skip = noop;
30
+ }
23
31
  }
24
32
 
25
33
  run_describe_start(event) {
26
- if (!this.enabled) return;
27
-
28
34
  if (event.describeBlock.parent !== undefined) {
29
35
  this._onSuiteStart({
30
36
  description: event.describeBlock.name,
@@ -33,16 +39,12 @@ class SpecReporter {
33
39
  }
34
40
 
35
41
  run_describe_finish(event) {
36
- if (!this.enabled) return;
37
-
38
42
  if (event.describeBlock.parent !== undefined) {
39
43
  this._onSuiteEnd();
40
44
  }
41
45
  }
42
46
 
43
47
  test_start(event) {
44
- if (!this.enabled) return;
45
-
46
48
  const { test } = event;
47
49
  this._onTestStart({
48
50
  description: test.name,
@@ -51,8 +53,6 @@ class SpecReporter {
51
53
  }
52
54
 
53
55
  test_done(event) {
54
- if (!this.enabled) return;
55
-
56
56
  const { test } = event;
57
57
  const testInfo = {
58
58
  description: test.name,
@@ -62,8 +62,6 @@ class SpecReporter {
62
62
  }
63
63
 
64
64
  test_skip(event) {
65
- if (!this.enabled) return;
66
-
67
65
  const testInfo = {
68
66
  description: event.test.name,
69
67
  };
@@ -110,7 +108,7 @@ class SpecReporter {
110
108
  .concat(suite.description)
111
109
  .concat((index === total - 1) ? ': ' : '');
112
110
  });
113
- this._suitesDesc = chalk.bold.white(this._suitesDesc);
111
+ this._suitesDesc = chalk.bold(this._suitesDesc);
114
112
  }
115
113
 
116
114
  _traceTest({ description, invocations }, _status = undefined) {
@@ -13,7 +13,7 @@ class WorkerAssignReporter {
13
13
 
14
14
  run_start() {
15
15
  if (config.testRunner.jest.reportWorkerAssign) {
16
- log.info({ cat: 'lifecycle' }, `${this._formatTestName()} is assigned to ${this._formatDeviceName()}`);
16
+ log.info({ cat: 'lifecycle' }, `${chalk.bold(this._testName)} is assigned to ${this._formatDeviceName()}`);
17
17
  }
18
18
  }
19
19
 
@@ -25,10 +25,6 @@ class WorkerAssignReporter {
25
25
 
26
26
  return formattedDeviceName;
27
27
  }
28
-
29
- _formatTestName() {
30
- return chalk.whiteBright(this._testName);
31
- }
32
28
  }
33
29
 
34
30
  module.exports = WorkerAssignReporter;
@@ -1,8 +1,10 @@
1
1
  const fs = require('fs');
2
2
  const path = require('path');
3
3
 
4
+ const resolveFrom = require('resolve-from');
4
5
  const semver = require('semver');
5
6
 
7
+ const { log } = require('../../../../internals');
6
8
  const detoxPackageJson = require('../../../../package.json');
7
9
  const { DetoxRuntimeError } = require('../../../../src/errors');
8
10
 
@@ -25,6 +27,10 @@ function assertJestCircus27(maybeProjectConfig) {
25
27
  });
26
28
  }
27
29
 
30
+ const jestManifestPath = resolveFrom(process.cwd(), 'jest/package.json');
31
+ const jestManifest = require(jestManifestPath);
32
+ assertSupportedVersion(jestManifest.version);
33
+
28
34
  const circusVersion = require(circusPackageJson).version;
29
35
  if (!circusVersion) {
30
36
  throw new DetoxRuntimeError({
@@ -33,7 +39,14 @@ function assertJestCircus27(maybeProjectConfig) {
33
39
  });
34
40
  }
35
41
 
36
- assertSupportedVersion(circusVersion);
42
+ if (jestManifest.version !== circusVersion) {
43
+ log.warn([
44
+ `jest-circus@${circusVersion} does not match jest@${jestManifest.version}.\n`,
45
+ `- jest@${jestManifest.version} resolved path:\n\t${jestManifestPath}`,
46
+ `- jest-circus@${circusVersion} resolved path:\n\t${circusPackageJson}`,
47
+ `\nPlease make sure that your versions match to avoid unexpected behavior!`,
48
+ ].join('\n'));
49
+ }
37
50
 
38
51
  return maybeProjectConfig;
39
52
  }
@@ -41,11 +54,12 @@ function assertJestCircus27(maybeProjectConfig) {
41
54
  function assertSupportedVersion(actualVersion) {
42
55
  const supportedRange = detoxPackageJson.peerDependencies.jest;
43
56
  const minSupportedVersion = semver.minVersion(supportedRange);
57
+ const action = semver.lt(actualVersion, minSupportedVersion) ? 'upgrade' : 'downgrade';
44
58
 
45
- if (semver.lt(actualVersion, minSupportedVersion)) {
59
+ if (!semver.satisfies(actualVersion, supportedRange, { includePrerelease: true })) {
46
60
  throw new DetoxRuntimeError({
47
61
  message: `Detected an unsupported jest@${actualVersion} version.`,
48
- hint: `Please upgrade your Jest test runner to the supported range: ${supportedRange}.`
62
+ hint: `Please ${action} your Jest test runner to the supported range: ${supportedRange}.`
49
63
  });
50
64
  }
51
65
  }
@@ -9,7 +9,6 @@ describe('assertSupportedVersion', () => {
9
9
  ['28.0.0'],
10
10
  ['28.1.0'],
11
11
  ['29.0.0-next.0'],
12
- ['30.0.0'],
13
12
  ])('should pass for %j', (version) => {
14
13
  expect(() => assertSupportedVersion(version)).not.toThrow();
15
14
  });