detox 20.1.2 → 20.1.3

Sign up to get free protection for your applications and to get access to all the features.
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