detox 20.39.0 → 20.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/Detox-android/com/wix/detox/{20.39.0/detox-20.39.0-sources.jar → 20.40.0/detox-20.40.0-sources.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.40.0/detox-20.40.0-sources.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.40.0/detox-20.40.0-sources.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.40.0/detox-20.40.0-sources.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.40.0/detox-20.40.0-sources.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.39.0/detox-20.39.0.pom → 20.40.0/detox-20.40.0.pom} +1 -1
  7. package/Detox-android/com/wix/detox/20.40.0/detox-20.40.0.pom.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.40.0/detox-20.40.0.pom.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.40.0/detox-20.40.0.pom.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.40.0/detox-20.40.0.pom.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
  12. package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
  13. package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
  14. package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
  15. package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
  16. package/Detox-ios-framework.tbz +0 -0
  17. package/Detox-ios-src.tbz +0 -0
  18. package/Detox-ios-xcuitest.tbz +0 -0
  19. package/package.json +8 -8
  20. package/src/android/core/NativeElement.js +2 -1
  21. package/src/artifacts/templates/artifact/FileArtifact.js +2 -1
  22. package/src/artifacts/utils/temporaryPath.js +2 -1
  23. package/src/devices/allocation/drivers/android/emulator/AVDsResolver.js +1 -1
  24. package/src/devices/allocation/drivers/android/genycloud/GenyAllocDriver.js +0 -11
  25. package/src/devices/allocation/drivers/android/genycloud/GenyRecipeQuerying.js +3 -0
  26. package/src/devices/allocation/drivers/android/genycloud/services/GenyRecipesService.js +9 -6
  27. package/src/devices/allocation/drivers/ios/SimulatorAllocDriver.js +4 -1
  28. package/src/devices/common/drivers/ios/tools/AppleSimUtils.js +13 -2
  29. package/src/ios/expectTwo.js +2 -1
  30. package/src/utils/environment.js +8 -0
  31. package/src/utils/tempfile.js +18 -0
  32. package/Detox-android/com/wix/detox/20.39.0/detox-20.39.0-sources.jar.md5 +0 -1
  33. package/Detox-android/com/wix/detox/20.39.0/detox-20.39.0-sources.jar.sha1 +0 -1
  34. package/Detox-android/com/wix/detox/20.39.0/detox-20.39.0-sources.jar.sha256 +0 -1
  35. package/Detox-android/com/wix/detox/20.39.0/detox-20.39.0-sources.jar.sha512 +0 -1
  36. package/Detox-android/com/wix/detox/20.39.0/detox-20.39.0.pom.md5 +0 -1
  37. package/Detox-android/com/wix/detox/20.39.0/detox-20.39.0.pom.sha1 +0 -1
  38. package/Detox-android/com/wix/detox/20.39.0/detox-20.39.0.pom.sha256 +0 -1
  39. package/Detox-android/com/wix/detox/20.39.0/detox-20.39.0.pom.sha512 +0 -1
  40. /package/Detox-android/com/wix/detox/{20.39.0/detox-20.39.0.aar → 20.40.0/detox-20.40.0.aar} +0 -0
  41. /package/Detox-android/com/wix/detox/{20.39.0/detox-20.39.0.aar.md5 → 20.40.0/detox-20.40.0.aar.md5} +0 -0
  42. /package/Detox-android/com/wix/detox/{20.39.0/detox-20.39.0.aar.sha1 → 20.40.0/detox-20.40.0.aar.sha1} +0 -0
  43. /package/Detox-android/com/wix/detox/{20.39.0/detox-20.39.0.aar.sha256 → 20.40.0/detox-20.40.0.aar.sha256} +0 -0
  44. /package/Detox-android/com/wix/detox/{20.39.0/detox-20.39.0.aar.sha512 → 20.40.0/detox-20.40.0.aar.sha512} +0 -0
@@ -0,0 +1 @@
1
+ 979a04ae79086d3aedcb79ae3ad77665
@@ -0,0 +1 @@
1
+ 0bf2a44800742f2a45bab1072dd4e09a65d3504c
@@ -0,0 +1 @@
1
+ 1e2cf7c9101332a67c7ebda6b3a9efb7e0a5b3002715149966c9ca904ff88974
@@ -0,0 +1 @@
1
+ 1d194775b962f29d6a8e1a39472e398b0b96c577ae51e58b9d396fc3f9dad79074cbe31bf277360e74eff277500079fbe0303397e133d344dae2a58c65479724
@@ -3,7 +3,7 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.wix</groupId>
5
5
  <artifactId>detox</artifactId>
6
- <version>20.39.0</version>
6
+ <version>20.40.0</version>
7
7
  <packaging>aar</packaging>
8
8
  <name>Detox</name>
9
9
  <description>Gray box end-to-end testing and automation library for mobile apps</description>
@@ -0,0 +1 @@
1
+ fb9db06cd18e4b9daadb322a8f105a3f
@@ -0,0 +1 @@
1
+ 1eb8a8b40ce354a2cd0aeab507bbaede730f6530
@@ -0,0 +1 @@
1
+ 4d961549582781c365fc649c2d107855562c3b528bfb0ff2f225a8b51f99e614
@@ -0,0 +1 @@
1
+ df8bf51b83eec8945ba37c30b38f981e4bc4bb5c99203081f5a4c11e3717d526617453ab41618a9d25cb3bf60360d0dbd326c08b2febf1d919ca909c01acf66d
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox</artifactId>
5
5
  <versioning>
6
- <latest>20.39.0</latest>
7
- <release>20.39.0</release>
6
+ <latest>20.40.0</latest>
7
+ <release>20.40.0</release>
8
8
  <versions>
9
- <version>20.39.0</version>
9
+ <version>20.40.0</version>
10
10
  </versions>
11
- <lastUpdated>20250526084825</lastUpdated>
11
+ <lastUpdated>20250706104311</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 406053b2ba7bb8a851d6cdd79efa541b
1
+ 597cffefd8dca86bc2f3a99881989a39
@@ -1 +1 @@
1
- 71fb4ae7944d6dd100e7d85aabf0f4f8f739524a
1
+ 1ce40fa56c4f59b2e29c5e443047a639e5258e28
@@ -1 +1 @@
1
- 7345a11c89c4e78f67fdda2f926acfe86a4424ccb6b804959e7f5c2baa444621
1
+ abb50f781c46a7b36e1389d15850b5aa677da295bb5a13eb06f3699070155df1
@@ -1 +1 @@
1
- dd2622757e830b8f7833337f87c3f325798bb8af00f380bfbcafaf134847da282337ed80657c91c78bcb3732cbd5b400185a737f75cf79ab188baeba5da8dd6b
1
+ 2630330915347b2ba7b35a855ac61aac4ed1737e54e6295695e6ec7192f405aea19d4aba671264a359294a110a3161879f3c3980b564b0cf477837f84b0f6ed5
Binary file
package/Detox-ios-src.tbz CHANGED
Binary file
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "detox",
3
3
  "description": "E2E tests and automation for mobile",
4
- "version": "20.39.0",
4
+ "version": "20.40.0",
5
5
  "bin": {
6
6
  "detox": "local-cli/cli.js"
7
7
  },
@@ -37,10 +37,10 @@
37
37
  "@react-native-community/cli": "15.0.1",
38
38
  "@react-native-community/cli-platform-android": "15.0.1",
39
39
  "@react-native-community/cli-platform-ios": "15.0.1",
40
- "@react-native/babel-preset": "0.77.2",
41
- "@react-native/eslint-config": "0.77.2",
42
- "@react-native/metro-config": "0.77.2",
43
- "@react-native/typescript-config": "0.77.2",
40
+ "@react-native/babel-preset": "0.78.2",
41
+ "@react-native/eslint-config": "0.78.2",
42
+ "@react-native/metro-config": "0.78.2",
43
+ "@react-native/typescript-config": "0.78.2",
44
44
  "@tsconfig/react-native": "^3.0.0",
45
45
  "@types/bunyan": "^1.8.8",
46
46
  "@types/child-process-promise": "^2.2.1",
@@ -62,7 +62,7 @@
62
62
  "jest-allure2-reporter": "^2.0.0-beta.18",
63
63
  "metro-react-native-babel-preset": "0.76.8",
64
64
  "prettier": "^3.1.1",
65
- "react-native": "0.77.2",
65
+ "react-native": "0.78.2",
66
66
  "react-native-codegen": "^0.0.8",
67
67
  "typescript": "~5.3.3",
68
68
  "wtfnode": "^0.9.1"
@@ -98,7 +98,7 @@
98
98
  "stream-json": "^1.7.4",
99
99
  "strip-ansi": "^6.0.1",
100
100
  "telnet-client": "1.2.8",
101
- "tempfile": "^2.0.0",
101
+ "tmp": "^0.2.1",
102
102
  "trace-event-lib": "^1.3.1",
103
103
  "which": "^1.3.1",
104
104
  "ws": "^7.0.0",
@@ -120,5 +120,5 @@
120
120
  "browserslist": [
121
121
  "node 14"
122
122
  ],
123
- "gitHead": "c8724e60a59a47c80c7424a2f5cb54812cfa5f9f"
123
+ "gitHead": "5216c77b39caf721671a3be3f5b039053a482979"
124
124
  }
@@ -1,13 +1,14 @@
1
1
  const path = require('path');
2
2
 
3
3
  const fs = require('fs-extra');
4
- const tempfile = require('tempfile');
4
+
5
5
 
6
6
  const DetoxRuntimeError = require('../../errors/DetoxRuntimeError');
7
7
  const invoke = require('../../invoke');
8
8
  const { removeMilliseconds } = require('../../utils/dateUtils');
9
9
  const { actionDescription } = require('../../utils/invocationTraceDescriptions');
10
10
  const mapLongPressArguments = require('../../utils/mapLongPressArguments');
11
+ const tempfile = require('../../utils/tempfile');
11
12
  const actions = require('../actions/native');
12
13
  const DetoxMatcherApi = require('../espressoapi/DetoxMatcher');
13
14
  const { ActionInteraction } = require('../interactions/native');
@@ -2,9 +2,10 @@
2
2
  const path = require('path');
3
3
 
4
4
  const fs = require('fs-extra');
5
- const tempfile = require('tempfile');
6
5
 
7
6
  const appendFile = require('../../../utils/appendFile');
7
+ const tempfile = require('../../../utils/tempfile');
8
+
8
9
 
9
10
  const Artifact = require('./Artifact');
10
11
 
@@ -3,9 +3,10 @@ const { promisify } = require('util');
3
3
 
4
4
  const glob = require('glob');
5
5
  const _ = require('lodash');
6
- const tempfile = require('tempfile');
7
6
 
8
7
  const { useForwardSlashes } = require('../../utils/shellUtils');
8
+ const tempfile = require('../../utils/tempfile');
9
+
9
10
 
10
11
  const globSync = glob.sync;
11
12
  const globAsync = promisify(glob);
@@ -7,7 +7,7 @@ class AVDsResolver {
7
7
 
8
8
  async resolve() {
9
9
  const output = await this._emulatorExec.exec(new ListAVDsCommand());
10
- const avds = output.trim().split('\n');
10
+ const avds = output.trim().split('\n').map(x => x.trim());
11
11
  return avds;
12
12
  }
13
13
  }
@@ -3,7 +3,6 @@
3
3
  * @typedef {import('../../../../common/drivers/android/cookies').GenycloudEmulatorCookie} GenycloudEmulatorCookie
4
4
  */
5
5
 
6
- const { DetoxRuntimeError } = require('../../../../../errors');
7
6
  const Timer = require('../../../../../utils/Timer');
8
7
  const log = require('../../../../../utils/logger').child({ cat: 'device' });
9
8
 
@@ -56,7 +55,6 @@ class GenyAllocDriver {
56
55
  async allocate(deviceConfig) {
57
56
  const deviceQuery = deviceConfig.device;
58
57
  const recipe = await this._recipeQuerying.getRecipeFromQuery(deviceQuery);
59
- this._assertRecipe(deviceQuery, recipe);
60
58
 
61
59
  let instance = this._genyRegistry.findFreeInstance(recipe);
62
60
  if (!instance) {
@@ -151,15 +149,6 @@ class GenyAllocDriver {
151
149
  this._reportGlobalCleanupSummary(instances);
152
150
  }
153
151
 
154
- _assertRecipe(deviceQuery, recipe) {
155
- if (!recipe) {
156
- throw new DetoxRuntimeError({
157
- message: `No Genymotion-Cloud template found to match the configured lookup query: ${JSON.stringify(deviceQuery)}`,
158
- hint: `Revisit your detox configuration. Genymotion templates list is available at: https://cloud.geny.io/recipes#custom`,
159
- });
160
- }
161
- }
162
-
163
152
  _reportGlobalCleanupSummary(deletionLeaks) {
164
153
  if (deletionLeaks.length) {
165
154
  log.warn(events.GENYCLOUD_TEARDOWN, 'WARNING! Detected a Genymotion SaaS instance leakage, for the following instances:');
@@ -1,4 +1,7 @@
1
1
  class GenyRecipeQuerying {
2
+ /**
3
+ * @param {import('./services/GenyRecipesService')} recipesService
4
+ */
2
5
  constructor(recipesService) {
3
6
  this.recipesService = recipesService;
4
7
  }
@@ -1,4 +1,4 @@
1
- const logger = require('../../../../../../utils/logger').child({ cat: 'device' });
1
+ const { DetoxRuntimeError } = require('../../../../../../errors');
2
2
 
3
3
  const Recipe = require('./dto/GenyRecipe');
4
4
 
@@ -10,15 +10,18 @@ class GenyRecipesService {
10
10
  async getRecipeByName(recipeName) {
11
11
  const { recipes } = await this.genyCloudExec.getRecipe(recipeName);
12
12
  if (!recipes.length) {
13
- return null;
13
+ throw new DetoxRuntimeError({
14
+ message: `No Genymotion-Cloud recipe found for recipe name "${recipeName}"`,
15
+ hint: `Please check your recipe name or use recipe UUID instead.`,
16
+ });
14
17
  }
15
18
 
16
19
  if (recipes.length > 1) {
17
20
  const recipesInfoList = recipes.map((recipe) => ` ${recipe.name} (${recipe.uuid})`).join('\n');
18
- logger.warn(
19
- { event: 'GENYCLOUD_RECIPE_LOOKUP' },
20
- `More than one Genymotion-Cloud recipe found for recipe name ${recipeName}:\n${recipesInfoList}\nFalling back to ${recipes[0].name}`
21
- );
21
+ throw new DetoxRuntimeError({
22
+ message: `More than one Genymotion-Cloud recipe found for recipe name ${recipeName}:\n${recipesInfoList}`,
23
+ hint: `Please specify a unique recipe name or use recipe UUID instead.`,
24
+ });
22
25
  }
23
26
  return new Recipe(recipes[0]);
24
27
  }
@@ -170,7 +170,10 @@ class SimulatorAllocDriver {
170
170
  async _queryDevices(deviceQuery) {
171
171
  const result = await this._applesimutils.list(
172
172
  deviceQuery,
173
- `Searching for device ${deviceQuery} ...`
173
+ {
174
+ trying: `Searching for device ${deviceQuery} ...`,
175
+ fields: ['udid', 'os', 'identifier'],
176
+ }
174
177
  );
175
178
 
176
179
  if (_.isEmpty(result)) {
@@ -2,6 +2,7 @@
2
2
  const path = require('path');
3
3
 
4
4
  const _ = require('lodash');
5
+ const semver = require('semver');
5
6
 
6
7
  const DetoxRuntimeError = require('../../../../../errors/DetoxRuntimeError');
7
8
  const { joinArgs } = require('../../../../../utils/argparse');
@@ -131,8 +132,9 @@ class AppleSimUtils {
131
132
  }
132
133
 
133
134
  async list(query, listOptions = {}) {
135
+ const fields = await this._buildFields(listOptions.fields);
134
136
  const options = {
135
- args: `--list ${joinArgs(query)}`,
137
+ args: `--list ${joinArgs(query)} ${fields}`,
136
138
  retries: 1,
137
139
  statusLogs: listOptions.trying ? { trying: listOptions.trying } : undefined,
138
140
  maxBuffer: 4 * 1024 * 1024,
@@ -174,7 +176,7 @@ class AppleSimUtils {
174
176
  }
175
177
 
176
178
  async _findDeviceByUDID(udid) {
177
- const [device] = await this.list({ byId: udid, maxResults: 1 });
179
+ const [device] = await this.list({ byId: udid, maxResults: 1 }, { fields: ['udid', 'os', 'version', 'state'] });
178
180
  if (!device) {
179
181
  throw new DetoxRuntimeError(`Can't find device with UDID = "${udid}"`);
180
182
  }
@@ -579,6 +581,15 @@ class AppleSimUtils {
579
581
 
580
582
  return Number.NaN;
581
583
  }
584
+
585
+ async _buildFields(fields) {
586
+ const version = await environment.getAppleSimUtilsVersion();
587
+ if (fields && semver.gt(version, '0.9.10')) {
588
+ return `--fields ${fields.join(',')}`;
589
+ }
590
+
591
+ return '';
592
+ }
582
593
  }
583
594
 
584
595
  module.exports = AppleSimUtils;
@@ -3,7 +3,7 @@ const path = require('path');
3
3
 
4
4
  const fs = require('fs-extra');
5
5
  const _ = require('lodash');
6
- const tempfile = require('tempfile');
6
+
7
7
 
8
8
  const { assertTraceDescription, assertEnum, assertNormalized } = require('../utils/assertArgument');
9
9
  const { removeMilliseconds } = require('../utils/dateUtils');
@@ -11,6 +11,7 @@ const { actionDescription, expectDescription } = require('../utils/invocationTra
11
11
  const { isRegExp } = require('../utils/isRegExp');
12
12
  const log = require('../utils/logger').child({ cat: 'ws-client, ws' });
13
13
  const mapLongPressArguments = require('../utils/mapLongPressArguments');
14
+ const tempfile = require('../utils/tempfile');
14
15
  const traceInvocationCall = require('../utils/traceInvocationCall').bind(null, log);
15
16
 
16
17
  const { systemElement, systemMatcher, systemExpect, isSystemElement } = require('./system');
@@ -177,6 +177,13 @@ const getDetoxVersion = _.once(() => {
177
177
  return require(path.join(__dirname, '../../package.json')).version;
178
178
  });
179
179
 
180
+ const getAppleSimUtilsVersion = _.once(async () => {
181
+ const command = `applesimutils --version`;
182
+ const output = await execAsync(command);
183
+ const match = output.match(/(\d+\.\d+\.\d+)$/);
184
+ return match ? match[1] : '0.0.0';
185
+ });
186
+
180
187
  const getBuildFolderName = _.once(async () => {
181
188
  const detoxVersion = getDetoxVersion();
182
189
  const xcodeVersion = await execAsync('xcodebuild -version');
@@ -232,6 +239,7 @@ module.exports = {
232
239
  getAvdHome,
233
240
  getAvdDir,
234
241
  getAvdManagerPath,
242
+ getAppleSimUtilsVersion,
235
243
  getAndroidSdkManagerPath,
236
244
  getGmsaasPath,
237
245
  getDetoxVersion,
@@ -0,0 +1,18 @@
1
+ const tmp = require('tmp');
2
+
3
+ tmp.setGracefulCleanup();
4
+
5
+ /**
6
+ * Creates a temporary file path. If extension is provided, it will be appended to the path.
7
+ * @param {string} [extension] - Optional file extension to append to the temporary file path
8
+ * @returns {string} Path to a temporary file
9
+ */
10
+ module.exports = function(extension) {
11
+ const _extension = (extension && extension.startsWith('.'))
12
+ ? extension
13
+ : (extension && `.${extension}`);
14
+
15
+ return tmp.tmpNameSync({
16
+ template: `detox-${process.pid}-XXXXXX${_extension || ''}`,
17
+ });
18
+ };
@@ -1 +0,0 @@
1
- dbe1858e2fa04f133bb976b0984f9464
@@ -1 +0,0 @@
1
- f592be31cd02ff6bb6c80929c36def3f33a12473
@@ -1 +0,0 @@
1
- a3093f21ec523b6fb8b0627582d0926a7c5b5e79d392af8e7c56b0a4fc63a4d7
@@ -1 +0,0 @@
1
- 1982c22f8098b52b4086c430c2691e5ac43fddde61dc98e44c9594e381bb50654eb98b71ad28322bfdaf634154c3335ab9a29bb60facea09961da436724ac0a5
@@ -1 +0,0 @@
1
- c6f307ea5344738bf5a1d3515051abad
@@ -1 +0,0 @@
1
- 4170cd61d614306ea769c51c5ee014bc4944328a
@@ -1 +0,0 @@
1
- 6ecee3d1e30d164ba31da9c3446f22a31394c5d0f5a4d091b5d869c124517efb
@@ -1 +0,0 @@
1
- ff58bdfc6ab51f6f018c121c1e68732dfa23238272e93d6aac2f9fe7c948eaa0bb2005d65df62af2e87c03f91d5965ad5e957fa69ba04e89d08bda24184f9e0f