detox 20.1.2 → 20.1.3

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 (59) hide show
  1. package/Detox-android/com/wix/detox/{20.1.2/detox-20.1.2-javadoc.jar → 20.1.3/detox-20.1.3-javadoc.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3-javadoc.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.1.2/detox-20.1.2-sources.jar → 20.1.3/detox-20.1.3-sources.jar} +0 -0
  7. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3-sources.jar.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/{20.1.2/detox-20.1.2.aar → 20.1.3/detox-20.1.3.aar} +0 -0
  12. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3.aar.md5 +1 -0
  13. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3.aar.sha1 +1 -0
  14. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3.aar.sha256 +1 -0
  15. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3.aar.sha512 +1 -0
  16. package/Detox-android/com/wix/detox/{20.1.2/detox-20.1.2.pom → 20.1.3/detox-20.1.3.pom} +13 -1
  17. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/20.1.3/detox-20.1.3.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/detox/build.gradle +4 -0
  29. package/android/detox/src/full/java/com/wix/detox/espresso/DetoxAction.java +31 -0
  30. package/index.d.ts +8 -5
  31. package/local-cli/cli.js +4 -3
  32. package/local-cli/testCommand/TestRunnerCommand.js +2 -1
  33. package/local-cli/testCommand/TestRunnerError.js +0 -4
  34. package/local-cli/utils/cliErrorHandling.js +15 -0
  35. package/package.json +2 -2
  36. package/src/android/actions/native.js +8 -0
  37. package/src/android/core/NativeElement.js +11 -0
  38. package/src/android/espressoapi/DetoxAction.js +25 -0
  39. package/src/artifacts/utils/temporaryPath.js +2 -4
  40. package/src/ios/expectTwo.js +4 -0
  41. package/src/logger/utils/BunyanLogger.js +5 -16
  42. package/src/logger/utils/streams/DetoxJSONLParser.js +1 -1
  43. package/src/utils/dateUtils.js +5 -0
  44. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2-javadoc.jar.md5 +0 -1
  45. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2-javadoc.jar.sha1 +0 -1
  46. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2-javadoc.jar.sha256 +0 -1
  47. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2-javadoc.jar.sha512 +0 -1
  48. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2-sources.jar.md5 +0 -1
  49. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2-sources.jar.sha1 +0 -1
  50. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2-sources.jar.sha256 +0 -1
  51. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2-sources.jar.sha512 +0 -1
  52. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2.aar.md5 +0 -1
  53. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2.aar.sha1 +0 -1
  54. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2.aar.sha256 +0 -1
  55. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2.aar.sha512 +0 -1
  56. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2.pom.md5 +0 -1
  57. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2.pom.sha1 +0 -1
  58. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2.pom.sha256 +0 -1
  59. package/Detox-android/com/wix/detox/20.1.2/detox-20.1.2.pom.sha512 +0 -1
@@ -0,0 +1 @@
1
+ bcf8a491652a4587af90f7471d86c918
@@ -0,0 +1 @@
1
+ a27e1b0ebba8a78c1fead39cc3ae78992d9be122
@@ -0,0 +1 @@
1
+ 1cc7be1fda6c79689fbb5b043b1d0c023898fd3b933071d13db07c601ece44ef
@@ -0,0 +1 @@
1
+ 7a98b2e5b12d42bfa71727308a37a25e5721f7273c8038c6fd5bd36aa5cdfab370817a1b36b390a6de41c5e5ebf56c40cfe2a4719c2e4010396a93cf6ff4c3e7
@@ -0,0 +1 @@
1
+ ad033a32333341b1555fe0e8869518df
@@ -0,0 +1 @@
1
+ a314cb2a58f10e7db15e3594bedde463ed5e3865
@@ -0,0 +1 @@
1
+ de0f783ca207a9dc24bf260ddcb98ceee0a6cc4489750bcf21b19afaa6bd249e
@@ -0,0 +1 @@
1
+ 34a1d86b11dee32eceea0da6ff6111109eee96fd2bd5cfdd860097c11903f0572d41da89c5d73439d3e5d59899e7805ad147b492a51338b3ebd28a5a90ec7c7b
@@ -0,0 +1 @@
1
+ ba6d4893fdbe2b778912202e1e13fbf1
@@ -0,0 +1 @@
1
+ 1e12993e69f3154d474125bf35a501a244c9df08
@@ -0,0 +1 @@
1
+ 070e2120af3c6b260c0ad77e930104edc1c984446da1d91286da8737a18f6bac
@@ -0,0 +1 @@
1
+ a8568b2a41c53d5b8a0397f464f0f13bd6d32f1ec167e74f913dd344c6c80476d85e7d6b3e0e9dc4dace448c6e10d0d730453220d6734b9b34aab921094bd7df
@@ -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.1.2</version>
6
+ <version>20.1.3</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>
@@ -42,6 +42,18 @@
42
42
  <version>3.4.0</version>
43
43
  <scope>compile</scope>
44
44
  </dependency>
45
+ <dependency>
46
+ <groupId>androidx.test.espresso</groupId>
47
+ <artifactId>espresso-contrib</artifactId>
48
+ <version>3.4.0</version>
49
+ <scope>compile</scope>
50
+ <exclusions>
51
+ <exclusion>
52
+ <groupId>org.checkerframework</groupId>
53
+ <artifactId>checker</artifactId>
54
+ </exclusion>
55
+ </exclusions>
56
+ </dependency>
45
57
  <dependency>
46
58
  <groupId>androidx.test</groupId>
47
59
  <artifactId>rules</artifactId>
@@ -0,0 +1 @@
1
+ 318848aa7138ca5330521a52db2b69bd
@@ -0,0 +1 @@
1
+ d6523b809463e2468a7d12851e5387cb8f9a430c
@@ -0,0 +1 @@
1
+ 084afed6380b3e7347c6c05c2b3bbde823fb3a580e3a6839eec7812c84db3580
@@ -0,0 +1 @@
1
+ 75a14a28b6e3126413d43c1671e62c25c5ec8f5561b996905352c98b7a5894100ea8aedeb59d482c13891c1db04dea06ac7ea430d43e009f2db94dc18876e269
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox</artifactId>
5
5
  <versioning>
6
- <latest>20.1.2</latest>
7
- <release>20.1.2</release>
6
+ <latest>20.1.3</latest>
7
+ <release>20.1.3</release>
8
8
  <versions>
9
- <version>20.1.2</version>
9
+ <version>20.1.3</version>
10
10
  </versions>
11
- <lastUpdated>20230118072349</lastUpdated>
11
+ <lastUpdated>20230206130801</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- c901a074fb859d5cfe367d9e9f7f6072
1
+ a1e7d970132edefe41aeb49170f25299
@@ -1 +1 @@
1
- 1ea7690b056eaa56081dc62901ef7d7f4f38d0bb
1
+ c36b92f3c55239f1b6d668ebe795a56638b88d6d
@@ -1 +1 @@
1
- 6bfffbf80107650b031d233e898a3d432ff625720123f99feee966e11ee0e543
1
+ 3589033525d4c9f7d3b11b91f1ea0e0dad52e607dc5a2dce01125e7bd2be0f75
@@ -1 +1 @@
1
- 2a33e6bad05e8adbbceb9479d6eea6a54663e25d5c9b72be1fe2503b6952976c2a6069bdf6336a4d45fe021d2711626d9cceb1bbf6932e03a86d04e349857875
1
+ 5d4ad093f145fa2837ea260905b5ab10eb7617141611d16a5847d874b5654a519b8b967733c7e1c68ad4979bf864918fd28752d41619e2dea08f60a23d0c653c
package/Detox-ios-src.tbz CHANGED
Binary file
package/Detox-ios.tbz CHANGED
Binary file
@@ -95,6 +95,10 @@ dependencies {
95
95
  api('androidx.test.espresso:espresso-web:3.4.0') {
96
96
  because 'Web-View testing'
97
97
  }
98
+ api('androidx.test.espresso:espresso-contrib:3.4.0') {
99
+ because 'Android datepicker support'
100
+ exclude group: "org.checkerframework", module: "checker"
101
+ }
98
102
  api('androidx.test:rules:1.4.0') {
99
103
  because 'of ActivityTestRule. Needed by users *and* internally used by Detox.'
100
104
  }
@@ -1,6 +1,7 @@
1
1
  package com.wix.detox.espresso;
2
2
 
3
3
  import android.view.View;
4
+ import android.os.Build;
4
5
 
5
6
  import com.wix.detox.common.DetoxErrors.DetoxRuntimeException;
6
7
  import com.wix.detox.common.DetoxErrors.StaleActionException;
@@ -19,6 +20,11 @@ import com.wix.detox.espresso.scroll.ScrollHelper;
19
20
  import com.wix.detox.espresso.scroll.SwipeHelper;
20
21
 
21
22
  import org.hamcrest.Matcher;
23
+ import java.text.ParseException;
24
+ import java.text.SimpleDateFormat;
25
+ import java.time.ZonedDateTime;
26
+ import java.util.Calendar;
27
+ import java.util.Date;
22
28
 
23
29
  import androidx.test.espresso.UiController;
24
30
  import androidx.test.espresso.ViewAction;
@@ -26,10 +32,12 @@ import androidx.test.espresso.action.CoordinatesProvider;
26
32
  import androidx.test.espresso.action.GeneralClickAction;
27
33
  import androidx.test.espresso.action.GeneralLocation;
28
34
  import androidx.test.espresso.action.Press;
35
+ import androidx.test.espresso.contrib.PickerActions;
29
36
 
30
37
  import static androidx.test.espresso.action.ViewActions.actionWithAssertions;
31
38
  import static androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom;
32
39
  import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
40
+
33
41
  import static org.hamcrest.Matchers.allOf;
34
42
 
35
43
 
@@ -39,6 +47,8 @@ import static org.hamcrest.Matchers.allOf;
39
47
 
40
48
  public class DetoxAction {
41
49
  private static final String LOG_TAG = "detox";
50
+ private static final String ISO8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ";
51
+ private static final String ISO8601_FORMAT_NO_TZ = "yyyy-MM-dd'T'HH:mm:ss";
42
52
 
43
53
  private DetoxAction() {
44
54
  // static class
@@ -149,6 +159,19 @@ public class DetoxAction {
149
159
  return new ScrollToIndexAction(index);
150
160
  }
151
161
 
162
+ public static ViewAction setDatePickerDate(String dateString, String formatString) throws ParseException {
163
+ Date date;
164
+ if (formatString.equals("ISO8601")) {
165
+ date = parseDateISO8601(dateString);
166
+ } else {
167
+ date = new SimpleDateFormat(formatString).parse(dateString);
168
+ }
169
+
170
+ Calendar cal = Calendar.getInstance();
171
+ cal.setTime(date);
172
+ return PickerActions.setDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH));
173
+ }
174
+
152
175
  public static ViewAction adjustSliderToPosition(final double newPosition) {
153
176
  return new AdjustSliderToPositionAction(newPosition);
154
177
  }
@@ -179,4 +202,12 @@ public class DetoxAction {
179
202
  }
180
203
  };
181
204
  }
205
+
206
+ private static Date parseDateISO8601(String dateString) throws ParseException {
207
+ try {
208
+ return new SimpleDateFormat(ISO8601_FORMAT).parse(dateString);
209
+ } catch (ParseException e) {
210
+ return new SimpleDateFormat(ISO8601_FORMAT_NO_TZ).parse(dateString);
211
+ }
212
+ }
182
213
  }
package/index.d.ts CHANGED
@@ -1365,12 +1365,15 @@ declare global {
1365
1365
  setColumnToValue(column: number, value: string): Promise<void>;
1366
1366
 
1367
1367
  /**
1368
- * Sets the date of a date picker to a date generated from the provided string and date format. (iOS only)
1369
- * @param dateString string representing a date in the supplied `dateFormat`
1370
- * @param dateFormat format for the `dateString` supplied
1368
+ * Sets the date of a date-picker according to the specified date-string and format.
1369
+ * @param dateString Textual representation of a date (e.g. '2023/01/01'). Should be in coherence with the format specified by `dateFormat`.
1370
+ * @param dateFormat Format of `dateString`: Generally either 'ISO8601' or an explicitly specified format (e.g. 'yyyy/MM/dd'); It should
1371
+ * follow the rules of NSDateFormatter for iOS and DateTimeFormatter for Android.
1372
+ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
1371
1373
  * @example
1372
- * await expect(element(by.id('datePicker'))).toBeVisible();
1373
- * await element(by.id('datePicker')).setDatePickerDate('2019-02-06T05:10:00-08:00', "yyyy-MM-dd'T'HH:mm:ssZZZZZ");
1374
+ * await element(by.id('datePicker')).setDatePickerDate('2023-01-01T00:00:00Z', 'ISO8601');
1375
+ * await element(by.id('datePicker')).setDatePickerDate(new Date().toISOString(), 'ISO8601');
1376
+ * await element(by.id('datePicker')).setDatePickerDate('2023/01/01', 'yyyy/MM/dd');
1374
1377
  */
1375
1378
  setDatePickerDate(dateString: string, dateFormat: string): Promise<void>;
1376
1379
 
package/local-cli/cli.js CHANGED
@@ -7,6 +7,8 @@ const yargs = require('yargs');
7
7
  const logger = require('../internals').log.child({ cat: 'cli' });
8
8
  const DetoxError = require('../src/errors/DetoxError');
9
9
 
10
+ const { isErrorAlreadyLogged } = require('./utils/cliErrorHandling');
11
+
10
12
  yargs
11
13
  .scriptName('detox')
12
14
  .parserConfiguration({
@@ -28,9 +30,8 @@ yargs
28
30
  .wrap(yargs.terminalWidth() * 0.9)
29
31
  .fail(function(msg, err, program) {
30
32
  if (err) {
31
- const message = DetoxError.format(err);
32
- if (message) {
33
- logger.error(message);
33
+ if (!isErrorAlreadyLogged(err)) {
34
+ logger.error(DetoxError.format(err));
34
35
  process.stderr.write('\n');
35
36
  }
36
37
 
@@ -9,6 +9,7 @@ const log = detox.log.child({ cat: ['lifecycle', 'cli'] });
9
9
  const { printEnvironmentVariables, prependNodeModulesBinToPATH } = require('../../src/utils/envUtils');
10
10
  const { toSimplePath } = require('../../src/utils/pathUtils');
11
11
  const { escapeSpaces, useForwardSlashes } = require('../../src/utils/shellUtils');
12
+ const { markErrorAsLogged } = require('../utils/cliErrorHandling');
12
13
 
13
14
  const TestRunnerError = require('./TestRunnerError');
14
15
 
@@ -142,7 +143,7 @@ class TestRunnerCommand {
142
143
  signal,
143
144
  });
144
145
  log.error.end({ success: false, code, signal }, error.message);
145
- reject(error);
146
+ reject(markErrorAsLogged(error));
146
147
  }
147
148
  });
148
149
  });
@@ -8,10 +8,6 @@ class TestRunnerError extends DetoxError {
8
8
  this.signal = signal;
9
9
  this.name = 'TestRunnerError';
10
10
  }
11
-
12
- format() {
13
- return '';
14
- }
15
11
  }
16
12
 
17
13
  module.exports = TestRunnerError;
@@ -0,0 +1,15 @@
1
+ const loggedErrors = new WeakSet();
2
+
3
+ function markErrorAsLogged(error) {
4
+ loggedErrors.add(error);
5
+ return error;
6
+ }
7
+
8
+ function isErrorAlreadyLogged(error) {
9
+ return loggedErrors.has(error);
10
+ }
11
+
12
+ module.exports = {
13
+ markErrorAsLogged,
14
+ isErrorAlreadyLogged,
15
+ };
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.1.2",
4
+ "version": "20.1.3",
5
5
  "bin": {
6
6
  "detox": "local-cli/cli.js"
7
7
  },
@@ -199,5 +199,5 @@
199
199
  }
200
200
  }
201
201
  },
202
- "gitHead": "92824f79022d8d0048f5b560b7115da2c97b0737"
202
+ "gitHead": "95f2f82f4b8cd5b1b8ba935a2898d76a20a7a9b9"
203
203
  }
@@ -124,6 +124,13 @@ class ScrollToIndex extends Action {
124
124
  }
125
125
  }
126
126
 
127
+ class SetDatePickerDateAction extends Action {
128
+ constructor(dateString, formatString) {
129
+ super();
130
+ this._call = invoke.callDirectly(DetoxActionApi.setDatePickerDate(dateString, formatString));
131
+ }
132
+ }
133
+
127
134
  class AdjustSliderToPosition extends Action {
128
135
  constructor(newPosition) {
129
136
  super();
@@ -155,5 +162,6 @@ module.exports = {
155
162
  SwipeAction,
156
163
  TakeElementScreenshot,
157
164
  ScrollToIndex,
165
+ SetDatePickerDateAction,
158
166
  AdjustSliderToPosition,
159
167
  };
@@ -5,6 +5,7 @@ const tempfile = require('tempfile');
5
5
 
6
6
  const DetoxRuntimeError = require('../../errors/DetoxRuntimeError');
7
7
  const invoke = require('../../invoke');
8
+ const { removeMilliseconds } = require('../../utils/dateUtils');
8
9
  const { actionDescription } = require('../../utils/invocationTraceDescriptions');
9
10
  const actions = require('../actions/native');
10
11
  const DetoxMatcherApi = require('../espressoapi/DetoxMatcher');
@@ -112,6 +113,16 @@ class NativeElement {
112
113
  return await new ActionInteraction(this._invocationManager, this, action, traceDescription).execute();
113
114
  }
114
115
 
116
+ async setDatePickerDate(rawDateString, formatString) {
117
+ const dateString = formatString === 'ISO8601'
118
+ ? removeMilliseconds(rawDateString)
119
+ : rawDateString;
120
+
121
+ const action = new actions.SetDatePickerDateAction(dateString, formatString);
122
+ const traceDescription = actionDescription.setDatePickerDate(dateString, formatString);
123
+ return await new ActionInteraction(this._invocationManager, this, action, traceDescription).execute();
124
+ }
125
+
115
126
  /**
116
127
  * @param {'up' | 'right' | 'down' | 'left'} direction
117
128
  * @param {'slow' | 'fast'} [speed]
@@ -194,6 +194,19 @@ class DetoxAction {
194
194
  };
195
195
  }
196
196
 
197
+ static setDatePickerDate(dateString, formatString) {
198
+ if (typeof dateString !== "string") throw new Error("dateString should be a string, but got " + (dateString + (" (" + (typeof dateString + ")"))));
199
+ if (typeof formatString !== "string") throw new Error("formatString should be a string, but got " + (formatString + (" (" + (typeof formatString + ")"))));
200
+ return {
201
+ target: {
202
+ type: "Class",
203
+ value: "com.wix.detox.espresso.DetoxAction"
204
+ },
205
+ method: "setDatePickerDate",
206
+ args: [dateString, formatString]
207
+ };
208
+ }
209
+
197
210
  static adjustSliderToPosition(newPosition) {
198
211
  if (typeof newPosition !== "number") throw new Error("newPosition should be a number, but got " + (newPosition + (" (" + (typeof newPosition + ")"))));
199
212
  return {
@@ -220,6 +233,18 @@ class DetoxAction {
220
233
  };
221
234
  }
222
235
 
236
+ static parseDateISO8601(dateString) {
237
+ if (typeof dateString !== "string") throw new Error("dateString should be a string, but got " + (dateString + (" (" + (typeof dateString + ")"))));
238
+ return {
239
+ target: {
240
+ type: "Class",
241
+ value: "com.wix.detox.espresso.DetoxAction"
242
+ },
243
+ method: "parseDateISO8601",
244
+ args: [dateString]
245
+ };
246
+ }
247
+
223
248
  }
224
249
 
225
250
  module.exports = DetoxAction;
@@ -2,16 +2,14 @@ const path = require('path');
2
2
  const { promisify } = require('util');
3
3
 
4
4
  const glob = require('glob');
5
+ const _ = require('lodash');
5
6
  const tempfile = require('tempfile');
6
7
 
7
8
  const { useForwardSlashes } = require('../../utils/shellUtils');
8
9
 
9
10
  const globSync = glob.sync;
10
11
  const globAsync = promisify(glob);
11
-
12
- function getRoot() {
13
- return path.dirname(tempfile());
14
- }
12
+ const getRoot = _.once(() => path.dirname(tempfile()));
15
13
 
16
14
  function createGlobber(ext) {
17
15
  const fullExt = `.detox.${ext}`;
@@ -7,6 +7,7 @@ const _ = require('lodash');
7
7
  const tempfile = require('tempfile');
8
8
 
9
9
  const { assertEnum, assertNormalized } = require('../utils/assertArgument');
10
+ const { removeMilliseconds } = require('../utils/dateUtils');
10
11
  const { actionDescription, expectDescription } = require('../utils/invocationTraceDescriptions');
11
12
  const log = require('../utils/logger').child({ cat: 'ws-client, ws' });
12
13
  const traceInvocationCall = require('../utils/traceInvocationCall').bind(null, log);
@@ -275,6 +276,9 @@ class Element {
275
276
  setDatePickerDate(dateString, dateFormat) {
276
277
  if (typeof dateString !== 'string') throw new Error('dateString should be a string, but got ' + (dateString + (' (' + (typeof dateString + ')'))));
277
278
  if (typeof dateFormat !== 'string') throw new Error('dateFormat should be a string, but got ' + (dateFormat + (' (' + (typeof dateFormat + ')'))));
279
+ if (dateFormat === 'ISO8601') {
280
+ dateString = removeMilliseconds(dateString);
281
+ }
278
282
 
279
283
  const traceDescription = actionDescription.setDatePickerDate(dateString, dateFormat);
280
284
  return this.withAction('setDatePickerDate', traceDescription, dateString, dateFormat);
@@ -1,4 +1,5 @@
1
1
  const { PassThrough } = require('stream');
2
+ const { promisify } = require('util');
2
3
 
3
4
  const bunyan = require('bunyan');
4
5
  const bds = require('bunyan-debug-stream');
@@ -74,12 +75,14 @@ class BunyanLogger {
74
75
  }
75
76
 
76
77
  async closeFileStreams() {
77
- const { _closeStream } = BunyanLogger;
78
78
  const internalBunyanStreams = this._bunyan['streams'];
79
79
  const openFileStreams = _.filter(internalBunyanStreams, this._isOpenFileStream);
80
80
  _.remove(internalBunyanStreams, openFileStreams);
81
81
 
82
- await Promise.all(openFileStreams.map(_closeStream));
82
+ await Promise.all(openFileStreams.map(bunyanStream => {
83
+ const stream = bunyanStream.stream;
84
+ return promisify(stream.end.bind(stream))();
85
+ }));
83
86
  }
84
87
 
85
88
  /** @private */
@@ -97,20 +100,6 @@ class BunyanLogger {
97
100
  return stream.fd > 2 && !stream.closed;
98
101
  }
99
102
  };
100
-
101
- /** @private */
102
- static _closeStream(bunyanStream) {
103
- return new Promise((resolve, reject) => {
104
- bunyanStream.stream.end((err) => {
105
- /* istanbul ignore next */
106
- if (err) {
107
- reject(err);
108
- } else {
109
- resolve();
110
- }
111
- });
112
- });
113
- }
114
103
  }
115
104
 
116
105
  module.exports = BunyanLogger;
@@ -14,7 +14,7 @@ class DetoxJSONLParser {
14
14
  .on('error', (err) => {
15
15
  /* istanbul ignore else */
16
16
  if (err instanceof SyntaxError) {
17
- log.debug({ err });
17
+ log.debug({ err }, 'Failed to parse log line:');
18
18
  readable.end();
19
19
  } else {
20
20
  readable.emit('error', err);
@@ -10,6 +10,11 @@ function shortFormat(date) {
10
10
  return `${HH}:${MM}:${ss}.${milli}`;
11
11
  }
12
12
 
13
+ function removeMilliseconds(isoDate) {
14
+ return isoDate.replace(/(T\d\d:\d\d:\d\d)(\.\d\d\d)/, '$1');
15
+ }
16
+
13
17
  module.exports = {
14
18
  shortFormat,
19
+ removeMilliseconds,
15
20
  };
@@ -1 +0,0 @@
1
- 66a12b51d39c0dc37d8237459002fa80
@@ -1 +0,0 @@
1
- a6ce0a5378be7d5f0bd050e4ee918d9b63e9fc6f
@@ -1 +0,0 @@
1
- aead1f291b379b31f6bea79a173d54e8c7f4e2765989a3f40e7aa6246370c01c
@@ -1 +0,0 @@
1
- fddf79d6f4258ffd96cd24ec6eac9323df38fbcfe72aed5aeb9ea5c21982bfa96e732c2c8a9e2c6b6d11e6b1d9b2fa379978344829b04f46ebd42afb91d6973f
@@ -1 +0,0 @@
1
- 2bf2d6bb4211ecd29fe92218f374356d
@@ -1 +0,0 @@
1
- ab2f58d97f18c07fda612358a4acd0c55559b54c
@@ -1 +0,0 @@
1
- 269663213a371ff333345cc4a2042eacf18a3f8955003b45feb10484df48cc95
@@ -1 +0,0 @@
1
- 34b61213d9da6f33dcc73892d2a07d8e02ceb2addcc07dfa2c396e30723faa24c804df26f465d7900f1e4afcf8a182bf00fe46be99065b7241cbfff6998268ae
@@ -1 +0,0 @@
1
- c7eb63b23e9fec3154e5402cc0f65283
@@ -1 +0,0 @@
1
- 16bed62cec4774262c71a7daad13efcdac3c7942
@@ -1 +0,0 @@
1
- c12164b0a26a6db45c65d984af4c2a880e2bf5d516ceb582361576eff713e378
@@ -1 +0,0 @@
1
- d50db96253552903c6acf2328ff2baa9788aac5846622bc01c4c9e6026738991f6eea1ea2723afe21ffdec692a3caeadb39b6ac5cfb31bf40c7d184e058701bb
@@ -1 +0,0 @@
1
- 588ca5b917e41b9b0532532c77717020
@@ -1 +0,0 @@
1
- 84c09fdf4cc86ae4116c92f13a72e848d47d689d
@@ -1 +0,0 @@
1
- 0a7cd18ab62c4e460a174fb3a74729597a1876c04939cd3c72e7828133690ee9
@@ -1 +0,0 @@
1
- b7df21adb125e0fa524dad24daf37dcc53dd88a52d5bddf5e1720c13683965d7d7ca9d7d89eb6e82e181a665400ad0a23f47b2366ad05e0f85e93c9e7786f586