@applitools/core 2.4.3 → 2.4.5

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 2.4.5 - 2023/3/31
6
+
7
+ ### Features
8
+ - Added `removeDuplicateTests` property to the `GetManagerResultsSettings`
9
+ ### Bug fixes
10
+
11
+ ## 2.4.4 - 2023/3/30
12
+
13
+ ### Features
14
+ ### Bug fixes
15
+ - Improve performance in DOM snapshot
16
+
5
17
  ## 2.4.3 - 2023/3/22
6
18
 
7
19
  ### Features
@@ -3,25 +3,49 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeGetManagerResults = void 0;
4
4
  const test_error_1 = require("./errors/test-error");
5
5
  const internal_error_1 = require("./errors/internal-error");
6
+ const separate_duplicate_results_1 = require("./utils/separate-duplicate-results");
6
7
  function makeGetManagerResults({ core, storage, logger: defaultLogger, }) {
7
8
  return async function getManagerResults({ settings, logger = defaultLogger, } = {}) {
8
9
  var _a, _b, _c;
9
- const containers = await Promise.all(storage.map(async (eyes) => {
10
+ let containers = await storage.reduce(async (promise, eyes) => {
10
11
  try {
11
12
  const results = await eyes.getResults({ settings: { ...settings, throwErr: false }, logger });
12
- return results.map(result => {
13
- return {
13
+ return promise.then(containers => {
14
+ return containers.concat(results.map(result => ({
14
15
  result,
15
16
  error: result.status !== 'Passed' ? new test_error_1.TestError(result) : undefined,
16
17
  userTestId: result.userTestId,
17
18
  renderer: result.renderer,
18
- };
19
+ })));
19
20
  });
20
21
  }
21
22
  catch (error) {
22
- return [{ error: new internal_error_1.InternalError(error), ...error.info }];
23
+ return promise.then(containers => containers.concat({ error: new internal_error_1.InternalError(error), ...error.info }));
23
24
  }
24
- }));
25
+ }, Promise.resolve([]));
26
+ if (settings === null || settings === void 0 ? void 0 : settings.removeDuplicateTests) {
27
+ logger.log('User opted into removing duplicate tests, checking for duplicates...');
28
+ const [dedupedContainers, duplicateContainers] = (0, separate_duplicate_results_1.separateDuplicateResults)(containers);
29
+ containers = dedupedContainers;
30
+ if (!duplicateContainers.length)
31
+ logger.log('No duplicate tests found.');
32
+ else {
33
+ logger.log(`Duplicates found (${duplicateContainers.length} in total), cleaning them up...`);
34
+ await Promise.all(duplicateContainers.map(async (container) => {
35
+ if (container.result) {
36
+ await core.deleteTest({
37
+ settings: {
38
+ ...container.result.server,
39
+ testId: container.result.id,
40
+ batchId: container.result.batchId,
41
+ secretToken: container.result.secretToken,
42
+ },
43
+ });
44
+ }
45
+ }));
46
+ logger.log('Done cleaning up duplicate tests!');
47
+ }
48
+ }
25
49
  const batches = storage.reduce((batches, eyes) => {
26
50
  if (!eyes.test.keepBatchOpen) {
27
51
  const settings = { ...eyes.test.server, batchId: eyes.test.batchId };
@@ -31,7 +55,7 @@ function makeGetManagerResults({ core, storage, logger: defaultLogger, }) {
31
55
  }, {});
32
56
  await core.closeBatch({ settings: Object.values(batches), logger }).catch(() => null);
33
57
  const summary = {
34
- results: containers.flat(),
58
+ results: containers,
35
59
  passed: 0,
36
60
  unresolved: 0,
37
61
  failed: 0,
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.separateDuplicateResults = void 0;
4
+ function separateDuplicateResults(containers) {
5
+ var _a;
6
+ const containerByBaselineId = new Map();
7
+ const duplicates = [];
8
+ const possibleDuplicateContainers = containers.filter(container => { var _a; return !((_a = container.result) === null || _a === void 0 ? void 0 : _a.keepIfDuplicate); });
9
+ for (const container of possibleDuplicateContainers) {
10
+ const baselineId = (_a = container.result) === null || _a === void 0 ? void 0 : _a.baselineId;
11
+ if (baselineId) {
12
+ const containerForThisBaseline = containerByBaselineId.get(baselineId);
13
+ if (containerForThisBaseline) {
14
+ const startedAt1 = Date.parse(containerForThisBaseline.result.startedAt);
15
+ const startedAt2 = Date.parse(container.result.startedAt);
16
+ if (startedAt2 > startedAt1) {
17
+ duplicates.push(containerForThisBaseline);
18
+ containerByBaselineId.set(baselineId, container);
19
+ }
20
+ else {
21
+ duplicates.push(container);
22
+ }
23
+ }
24
+ else {
25
+ containerByBaselineId.set(baselineId, container);
26
+ }
27
+ }
28
+ }
29
+ return [
30
+ // tests to keep
31
+ !duplicates.length ? containers : containers.filter(container => !duplicates.includes(container)),
32
+ // tests to delete
33
+ duplicates,
34
+ ];
35
+ }
36
+ exports.separateDuplicateResults = separateDuplicateResults;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applitools/core",
3
- "version": "2.4.3",
3
+ "version": "2.4.5",
4
4
  "homepage": "https://applitools.com",
5
5
  "bugs": {
6
6
  "url": "https://github.com/applitools/eyes.sdk.javascript1/issues"
@@ -56,7 +56,7 @@
56
56
  "test:it": "MOCHA_GROUP=it node ../../node_modules/.bin/mocha './test/it/**/*.spec.ts'",
57
57
  "test:unit": "MOCHA_GROUP=unit node ../../node_modules/.bin/mocha './test/unit/**/*.spec.ts'",
58
58
  "test:sanity": "yarn test:unit",
59
- "report": "bongo report --name 'core'",
59
+ "report": "bongo report --name 'core' --group 'core'",
60
60
  "setup": "yarn docker:setup",
61
61
  "docker:setup": "node ../../scripts/generate-docker-compose-config.js && docker-compose up -d",
62
62
  "docker:teardown": "docker-compose down",
@@ -75,19 +75,19 @@
75
75
  ]
76
76
  },
77
77
  "dependencies": {
78
- "@applitools/core-base": "1.1.43",
78
+ "@applitools/core-base": "1.1.44",
79
79
  "@applitools/dom-capture": "11.2.1",
80
- "@applitools/dom-snapshot": "4.7.6",
80
+ "@applitools/dom-snapshot": "4.7.7",
81
81
  "@applitools/driver": "1.11.37",
82
- "@applitools/ec-client": "1.2.17",
82
+ "@applitools/ec-client": "1.2.18",
83
83
  "@applitools/logger": "1.1.48",
84
- "@applitools/nml-client": "1.3.41",
84
+ "@applitools/nml-client": "1.3.42",
85
85
  "@applitools/req": "1.1.33",
86
- "@applitools/screenshoter": "3.7.31",
86
+ "@applitools/screenshoter": "3.7.32",
87
87
  "@applitools/snippets": "2.4.17",
88
88
  "@applitools/socket": "1.0.10",
89
- "@applitools/spec-driver-webdriver": "1.0.17",
90
- "@applitools/ufg-client": "1.2.4",
89
+ "@applitools/spec-driver-webdriver": "1.0.18",
90
+ "@applitools/ufg-client": "1.2.5",
91
91
  "@applitools/utils": "1.3.32",
92
92
  "@types/ws": "8.5.4",
93
93
  "abort-controller": "3.0.0",
@@ -98,13 +98,13 @@
98
98
  "yargs": "17.6.2"
99
99
  },
100
100
  "devDependencies": {
101
- "@applitools/bongo": "^3.0.2",
101
+ "@applitools/bongo": "^3.0.3",
102
102
  "@applitools/sdk-coverage-tests": "^3.0.0",
103
- "@applitools/spec-driver-puppeteer": "^1.1.49",
104
- "@applitools/spec-driver-selenium": "^1.5.34",
105
- "@applitools/spec-driver-webdriverio": "^1.4.32",
103
+ "@applitools/spec-driver-puppeteer": "^1.1.50",
104
+ "@applitools/spec-driver-selenium": "^1.5.35",
105
+ "@applitools/spec-driver-webdriverio": "^1.4.33",
106
106
  "@applitools/test-server": "^1.1.28",
107
- "@applitools/test-utils": "^1.5.14",
107
+ "@applitools/test-utils": "^1.5.15",
108
108
  "@types/node": "^12.20.55",
109
109
  "@types/selenium-webdriver": "^4.1.2",
110
110
  "@types/yargs": "^17.0.22",
@@ -1,4 +1,4 @@
1
- import type { Eyes, GetResultsSettings, TestResult } from './types';
1
+ import type { Eyes, GetEyesResultsSettings, TestResult } from './types';
2
2
  import { type SpecType } from '@applitools/driver';
3
3
  import { type Logger } from '@applitools/logger';
4
4
  type Options<TSpec extends SpecType, TType extends 'classic' | 'ufg'> = {
@@ -6,7 +6,7 @@ type Options<TSpec extends SpecType, TType extends 'classic' | 'ufg'> = {
6
6
  logger: Logger;
7
7
  };
8
8
  export declare function makeGetEyesResults<TSpec extends SpecType, TType extends 'classic' | 'ufg'>({ eyes, logger: defaultLogger, }: Options<TSpec, TType>): ({ settings, logger, }?: {
9
- settings?: GetResultsSettings<TType> | undefined;
9
+ settings?: GetEyesResultsSettings<TType> | undefined;
10
10
  logger?: Logger | undefined;
11
11
  }) => Promise<TestResult<TType>[]>;
12
12
  export {};
@@ -1,4 +1,4 @@
1
- import type { Core, Eyes, GetResultsSettings, TestResultSummary } from './types';
1
+ import type { Core, Eyes, GetManagerResultsSettings, TestResultSummary } from './types';
2
2
  import { type SpecType } from '@applitools/driver';
3
3
  import { type Logger } from '@applitools/logger';
4
4
  type Options<TSpec extends SpecType, TType extends 'classic' | 'ufg'> = {
@@ -7,7 +7,7 @@ type Options<TSpec extends SpecType, TType extends 'classic' | 'ufg'> = {
7
7
  logger: Logger;
8
8
  };
9
9
  export declare function makeGetManagerResults<TSpec extends SpecType, TType extends 'classic' | 'ufg'>({ core, storage, logger: defaultLogger, }: Options<TSpec, TType>): ({ settings, logger, }?: {
10
- settings?: GetResultsSettings<TType> | undefined;
10
+ settings?: GetManagerResultsSettings<TType> | undefined;
11
11
  logger?: Logger | undefined;
12
12
  }) => Promise<TestResultSummary<TType>>;
13
13
  export {};
@@ -1,4 +1,4 @@
1
- import type { Core, EyesManager, EyesManagerSettings } from './types';
1
+ import type { Core, EyesManager, ManagerSettings } from './types';
2
2
  import type { Core as BaseCore } from '@applitools/core-base';
3
3
  import { type Logger } from '@applitools/logger';
4
4
  import { type SpecType, type SpecDriver } from '@applitools/driver';
@@ -13,7 +13,7 @@ type Options<TSpec extends SpecType> = {
13
13
  };
14
14
  export declare function makeMakeManager<TSpec extends SpecType>({ spec, concurrency: defaultConcurrency, core, base, agentId: defaultAgentId, cwd, logger: defaultLogger, }: Options<TSpec>): <TType extends "classic" | "ufg" = "classic">({ type, settings, logger, }?: {
15
15
  type?: TType | undefined;
16
- settings?: EyesManagerSettings | undefined;
16
+ settings?: ManagerSettings | undefined;
17
17
  logger?: Logger | undefined;
18
18
  }) => Promise<EyesManager<TSpec, TType>>;
19
19
  export {};
package/types/types.d.ts CHANGED
@@ -18,7 +18,7 @@ export interface Core<TSpec extends SpecType, TDefaultType extends 'classic' | '
18
18
  }): Promise<ECClient>;
19
19
  makeManager<TType extends 'classic' | 'ufg' = TDefaultType>(options?: {
20
20
  type: TType;
21
- settings?: EyesManagerSettings;
21
+ settings?: ManagerSettings;
22
22
  logger?: Logger;
23
23
  }): Promise<EyesManager<TSpec, TType>>;
24
24
  openEyes<TType extends 'classic' | 'ufg' = TDefaultType>(options: {
@@ -56,7 +56,7 @@ export interface EyesManager<TSpec extends SpecType, TDefaultType extends 'class
56
56
  logger?: Logger;
57
57
  }): Promise<Eyes<TSpec, TType>>;
58
58
  getResults: (options?: {
59
- settings?: GetResultsSettings<TDefaultType>;
59
+ settings?: GetManagerResultsSettings<TDefaultType>;
60
60
  logger?: Logger;
61
61
  }) => Promise<TestResultSummary<'classic' | 'ufg'>>;
62
62
  }
@@ -92,12 +92,12 @@ export interface Eyes<TSpec extends SpecType, TDefaultType extends 'classic' | '
92
92
  logger?: Logger;
93
93
  }): Promise<void>;
94
94
  getResults(options?: {
95
- settings?: Partial<GetResultsSettings<TDefaultType>>;
95
+ settings?: Partial<GetEyesResultsSettings<TDefaultType>>;
96
96
  config?: Config<TSpec, TDefaultType>;
97
97
  logger?: Logger;
98
98
  }): Promise<TestResult<TDefaultType>[]>;
99
99
  }
100
- export interface EyesManagerSettings {
100
+ export interface ManagerSettings {
101
101
  concurrency?: number;
102
102
  /** @deprecated */
103
103
  legacyConcurrency?: number;
@@ -117,6 +117,10 @@ export type AbortSettings<TType extends 'classic' | 'ufg'> = TType extends 'ufg'
117
117
  export type GetResultsSettings<TType extends 'classic' | 'ufg'> = (TType extends 'ufg' ? UFGCore.GetResultsSettings : ClassicCore.GetResultsSettings) & {
118
118
  throwErr?: boolean;
119
119
  };
120
+ export type GetEyesResultsSettings<TType extends 'classic' | 'ufg'> = GetResultsSettings<TType>;
121
+ export type GetManagerResultsSettings<TType extends 'classic' | 'ufg'> = GetEyesResultsSettings<TType> & {
122
+ removeDuplicateTests?: boolean;
123
+ };
120
124
  export type CheckResult<TType extends 'classic' | 'ufg'> = TType extends 'ufg' ? UFGCore.CheckResult : ClassicCore.CheckResult;
121
125
  export type TestResult<TType extends 'classic' | 'ufg'> = TType extends 'ufg' ? UFGCore.TestResult : ClassicCore.TestResult;
122
126
  export interface TestResultContainer<TType extends 'classic' | 'ufg'> {
@@ -0,0 +1,2 @@
1
+ import { TestResultContainer } from '../types';
2
+ export declare function separateDuplicateResults(containers: TestResultContainer<'classic' | 'ufg'>[]): TestResultContainer<"classic" | "ufg">[][];