@zohodesk/testinglibrary 0.4.48-experimental → 0.4.50-experimental
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/.gitlab-ci.yml +2 -2
- package/README.md +1 -54
- package/build/bdd-framework/cli/commands/env.js +42 -0
- package/build/bdd-framework/cli/commands/export.js +62 -0
- package/build/bdd-framework/cli/commands/test.js +64 -0
- package/build/bdd-framework/cli/index.js +11 -0
- package/build/bdd-framework/cli/options.js +19 -0
- package/build/bdd-framework/cli/worker.js +13 -0
- package/build/bdd-framework/config/configDir.js +35 -0
- package/build/bdd-framework/config/enrichReporterData.js +23 -0
- package/build/bdd-framework/config/env.js +50 -0
- package/build/bdd-framework/config/index.js +94 -0
- package/build/bdd-framework/config/lang.js +14 -0
- package/build/bdd-framework/cucumber/buildStepDefinition.js +43 -0
- package/build/bdd-framework/cucumber/createTestStep.js +43 -0
- package/build/bdd-framework/cucumber/formatter/EventDataCollector.js +126 -0
- package/build/bdd-framework/cucumber/formatter/GherkinDocumentParser.js +72 -0
- package/build/bdd-framework/cucumber/formatter/PickleParser.js +25 -0
- package/build/bdd-framework/cucumber/formatter/durationHelpers.js +13 -0
- package/build/bdd-framework/cucumber/formatter/getColorFns.js +57 -0
- package/build/bdd-framework/cucumber/formatter/index.js +16 -0
- package/build/bdd-framework/cucumber/formatter/locationHelpers.js +16 -0
- package/build/bdd-framework/cucumber/loadConfig.js +17 -0
- package/build/bdd-framework/cucumber/loadFeatures.js +70 -0
- package/build/bdd-framework/cucumber/loadSnippetBuilder.js +20 -0
- package/build/bdd-framework/cucumber/loadSteps.js +47 -0
- package/build/bdd-framework/cucumber/resolveFeaturePaths.js +62 -0
- package/build/bdd-framework/cucumber/stepArguments.js +21 -0
- package/build/bdd-framework/cucumber/types.js +5 -0
- package/build/bdd-framework/cucumber/valueChecker.js +23 -0
- package/build/bdd-framework/decorators.js +18 -0
- package/build/bdd-framework/gen/fixtures.js +48 -0
- package/build/bdd-framework/gen/formatter.js +167 -0
- package/build/bdd-framework/gen/i18n.js +39 -0
- package/build/bdd-framework/gen/index.js +197 -0
- package/build/bdd-framework/gen/specialTags.js +70 -0
- package/build/bdd-framework/gen/testFile.js +470 -0
- package/build/bdd-framework/gen/testMeta.js +60 -0
- package/build/bdd-framework/gen/testNode.js +35 -0
- package/build/bdd-framework/gen/testPoms.js +133 -0
- package/build/bdd-framework/hooks/scenario.js +130 -0
- package/build/bdd-framework/hooks/worker.js +89 -0
- package/build/bdd-framework/index.js +52 -0
- package/build/bdd-framework/playwright/fixtureParameterNames.js +93 -0
- package/build/bdd-framework/playwright/getLocationInFile.js +79 -0
- package/build/bdd-framework/playwright/loadConfig.js +42 -0
- package/build/bdd-framework/playwright/loadUtils.js +33 -0
- package/build/bdd-framework/playwright/testTypeImpl.js +79 -0
- package/build/bdd-framework/playwright/transform.js +88 -0
- package/build/bdd-framework/playwright/types.js +12 -0
- package/build/bdd-framework/playwright/utils.js +56 -0
- package/build/bdd-framework/reporter/cucumber/base.js +52 -0
- package/build/bdd-framework/reporter/cucumber/custom.js +73 -0
- package/build/bdd-framework/reporter/cucumber/helper.js +12 -0
- package/build/bdd-framework/reporter/cucumber/html.js +40 -0
- package/build/bdd-framework/reporter/cucumber/index.js +74 -0
- package/build/bdd-framework/reporter/cucumber/json.js +312 -0
- package/build/bdd-framework/reporter/cucumber/junit.js +205 -0
- package/build/bdd-framework/reporter/cucumber/message.js +20 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/AttachmentMapper.js +82 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Builder.js +197 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocument.js +43 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocumentClone.js +52 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocuments.js +105 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Hook.js +70 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Meta.js +45 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Pickles.js +27 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Projects.js +38 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCase.js +128 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRun.js +154 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRunHooks.js +123 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepAttachments.js +67 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepRun.js +114 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/index.js +30 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/pwStepUtils.js +70 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/timing.js +35 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/types.js +5 -0
- package/build/bdd-framework/run/StepInvoker.js +69 -0
- package/build/bdd-framework/run/bddData/index.js +59 -0
- package/build/bdd-framework/run/bddData/types.js +5 -0
- package/build/bdd-framework/run/bddFixtures.js +192 -0
- package/build/bdd-framework/run/bddWorld.js +79 -0
- package/build/bdd-framework/run/bddWorldInternal.js +11 -0
- package/build/bdd-framework/snippets/index.js +132 -0
- package/build/bdd-framework/snippets/snippetSyntax.js +43 -0
- package/build/bdd-framework/snippets/snippetSyntaxDecorators.js +26 -0
- package/build/bdd-framework/snippets/snippetSyntaxTs.js +18 -0
- package/build/bdd-framework/stepDefinitions/createBdd.js +66 -0
- package/build/bdd-framework/stepDefinitions/decorators/class.js +68 -0
- package/build/bdd-framework/stepDefinitions/decorators/steps.js +99 -0
- package/build/bdd-framework/stepDefinitions/defineStep.js +62 -0
- package/build/bdd-framework/stepDefinitions/stepConfig.js +24 -0
- package/build/bdd-framework/steps/createBdd.js +78 -0
- package/build/bdd-framework/steps/decorators/class.js +68 -0
- package/build/bdd-framework/steps/decorators/steps.js +98 -0
- package/build/bdd-framework/steps/defineStep.js +62 -0
- package/build/bdd-framework/steps/stepConfig.js +24 -0
- package/build/bdd-framework/utils/AutofillMap.js +20 -0
- package/build/bdd-framework/utils/exit.js +62 -0
- package/build/bdd-framework/utils/index.js +93 -0
- package/build/bdd-framework/utils/jsStringWrap.js +44 -0
- package/build/bdd-framework/utils/logger.js +30 -0
- package/build/bdd-framework/utils/stripAnsiEscapes.js +20 -0
- package/build/core/playwright/builtInFixtures/page.js +17 -32
- package/build/core/playwright/clear-caches.js +0 -7
- package/build/core/playwright/constants/fileMutexConfig.js +3 -9
- package/build/core/playwright/helpers/auth/loginSteps.js +2 -9
- package/build/core/playwright/helpers/configFileNameProvider.js +1 -1
- package/build/core/playwright/helpers/fileMutex.js +51 -28
- package/build/core/playwright/index.js +23 -10
- package/build/core/playwright/runner/SpawnRunner.js +2 -2
- package/build/core/playwright/setup/config-creator.js +8 -15
- package/build/core/playwright/setup/config-utils.js +25 -8
- package/build/core/playwright/tagProcessor.js +34 -22
- package/build/core/playwright/test-runner.js +2 -2
- package/build/decorators.d.ts +1 -1
- package/build/decorators.js +1 -1
- package/build/setup-folder-structure/samples/auth-setup-sample.js +68 -10
- package/build/setup-folder-structure/samples/authUsers-sample.json +9 -0
- package/build/setup-folder-structure/samples/env-config-sample.json +21 -0
- package/build/setup-folder-structure/samples/uat-config-sample.js +1 -3
- package/build/setup-folder-structure/setupProject.js +5 -22
- package/build/test/core/playwright/__tests__/tagProcessor.test.js +19 -18
- package/build/test/core/playwright/helpers/__tests__/configFileNameProvider.test.js +1 -1
- package/build/test/core/playwright/helpers/__tests__/fileMutex.test.js +64 -39
- package/npm-shrinkwrap.json +3342 -7679
- package/package.json +9 -11
- package/playwright.config.js +48 -0
- package/unit_reports/unit-report.html +260 -0
- package/build/core/playwright/fixtures.js +0 -24
- package/build/setup-folder-structure/samples/accountLogin-sample.js +0 -19
- package/build/setup-folder-structure/samples/actors-index.js +0 -2
- package/build/setup-folder-structure/samples/editions-index.js +0 -3
- package/build/setup-folder-structure/samples/free-sample.json +0 -25
- package/build/setup-folder-structure/samples/settings.json +0 -7
- package/build/setup-folder-structure/samples/testSetup-sample.js +0 -14
|
@@ -10,9 +10,8 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
10
10
|
var _logger = require("../utils/logger");
|
|
11
11
|
function getScriptsToBeAdded() {
|
|
12
12
|
return {
|
|
13
|
-
"uat": "ZDTestingFramework test --mode=
|
|
14
|
-
"uat-debug": "ZDTestingFramework test --mode=
|
|
15
|
-
"uat-validate": "ZDTestingFramework validate",
|
|
13
|
+
"uat": "ZDTestingFramework test --mode=prod --headed",
|
|
14
|
+
"uat-debug": "ZDTestingFramework test --mode=prod --debug",
|
|
16
15
|
"uat-report": "ZDTestingFramework report --port=9009",
|
|
17
16
|
"codegen": "ZDTestingFramework codegen deskclientapp.localzoho.com/agent"
|
|
18
17
|
};
|
|
@@ -72,11 +71,8 @@ function createAuthenticationFile() {
|
|
|
72
71
|
});
|
|
73
72
|
}
|
|
74
73
|
(0, _fs.writeFileSync)(_path.default.resolve(process.cwd(), 'uat', 'fixtures', 'auth.setup.js'), getSetupFileAsString('auth-setup-sample.js'), null, 2);
|
|
74
|
+
(0, _fs.writeFileSync)(_path.default.resolve(process.cwd(), 'uat', 'fixtures', 'authUsers.json'), getSetupFileAsString('authUsers-sample.json'), null, 2);
|
|
75
75
|
_logger.Logger.log(_logger.Logger.INFO_TYPE, 'Creating Authentication File ....');
|
|
76
|
-
(0, _fs.writeFileSync)(_path.default.resolve(process.cwd(), 'uat', 'fixtures', 'accountLogin.js'), getSetupFileAsString('accountLogin-sample.js'), null, 2);
|
|
77
|
-
_logger.Logger.log(_logger.Logger.INFO_TYPE, 'Creating login script File ....');
|
|
78
|
-
(0, _fs.writeFileSync)(_path.default.resolve(process.cwd(), 'uat', 'fixtures', 'testSetup.js'), getSetupFileAsString('testSetup-sample.js'), null, 2);
|
|
79
|
-
_logger.Logger.log(_logger.Logger.INFO_TYPE, 'Creating testSetup File ....');
|
|
80
76
|
} catch (err) {
|
|
81
77
|
_logger.Logger.error(err);
|
|
82
78
|
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, 'Something went wrong ! Folder not Created. Please re-initialize npm init-uat');
|
|
@@ -88,21 +84,8 @@ function createAuthenticationFile() {
|
|
|
88
84
|
function createConfigJson() {
|
|
89
85
|
const uatFolder = _path.default.resolve(process.cwd(), 'uat');
|
|
90
86
|
if ((0, _fs.existsSync)(uatFolder)) {
|
|
91
|
-
_logger.Logger.log(_logger.Logger.INFO_TYPE, 'Creating
|
|
92
|
-
|
|
93
|
-
(0, _fs.mkdirSync)(_path.default.resolve(uatFolder, 'conf', 'default'), {
|
|
94
|
-
recursive: true
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
(0, _fs.writeFileSync)(_path.default.resolve(uatFolder, 'conf', 'default', './settings.json'), getSetupFileAsString('settings.json'), null, 2);
|
|
98
|
-
if (!(0, _fs.existsSync)(_path.default.resolve(uatFolder, 'conf', 'default', 'actors', 'editions'))) {
|
|
99
|
-
(0, _fs.mkdirSync)(_path.default.resolve(uatFolder, 'conf', 'default', 'actors', 'editions'), {
|
|
100
|
-
recursive: true
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
(0, _fs.writeFileSync)(_path.default.resolve(uatFolder, 'conf', 'default', 'actors', 'editions', 'free.json'), getSetupFileAsString('free-sample.json'), null, 2);
|
|
104
|
-
(0, _fs.writeFileSync)(_path.default.resolve(uatFolder, 'conf', 'default', 'actors', 'editions', 'index.js'), getSetupFileAsString('editions-index.js'), null, 2);
|
|
105
|
-
(0, _fs.writeFileSync)(_path.default.resolve(uatFolder, 'conf', 'default', 'actors', 'index.js'), getSetupFileAsString('actors-index.js'), null, 2);
|
|
87
|
+
_logger.Logger.log(_logger.Logger.INFO_TYPE, 'Creating env-config file inside UAT Folder');
|
|
88
|
+
(0, _fs.writeFileSync)(_path.default.resolve(uatFolder, './env-config.json'), getSetupFileAsString('env-config-sample.json'), null, 2);
|
|
106
89
|
} else {
|
|
107
90
|
_logger.Logger.log(_logger.Logger.INFO_TYPE, 'Something went wrong. Please re-initialize the @zohodesk/testinglibrary');
|
|
108
91
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
var _tagProcessor = _interopRequireDefault(require("../../../../../src/core/playwright/tagProcessor"));
|
|
5
|
+
var _Configuration = _interopRequireDefault(require("../../../../../src/core/playwright/configuration/Configuration.js"));
|
|
5
6
|
var _logger = require("../../../../utils/logger");
|
|
6
7
|
jest.mock('../../../../utils/logger');
|
|
7
8
|
describe('TagProcessor', () => {
|
|
@@ -11,83 +12,83 @@ describe('TagProcessor', () => {
|
|
|
11
12
|
});
|
|
12
13
|
test('should return tagArgs if no edition is provided', () => {
|
|
13
14
|
const tagProcessor = new _tagProcessor.default(editionOrder);
|
|
14
|
-
const userArgs = {
|
|
15
|
+
const userArgs = new _Configuration.default({
|
|
15
16
|
tags: 'tag1',
|
|
16
17
|
edition: null
|
|
17
|
-
};
|
|
18
|
+
});
|
|
18
19
|
const result = tagProcessor.processTags(userArgs);
|
|
19
20
|
expect(result).toBe('tag1');
|
|
20
21
|
});
|
|
21
22
|
test('should handle a single edition with <= operator', () => {
|
|
22
23
|
const tagProcessor = new _tagProcessor.default(editionOrder);
|
|
23
|
-
const userArgs = {
|
|
24
|
+
const userArgs = new _Configuration.default({
|
|
24
25
|
tags: 'tag1',
|
|
25
26
|
edition: '<=edition2'
|
|
26
|
-
};
|
|
27
|
+
});
|
|
27
28
|
const result = tagProcessor.processTags(userArgs);
|
|
28
29
|
expect(result).toBe('tag1 and not (@edition_edition3 or @edition_edition4)');
|
|
29
30
|
});
|
|
30
31
|
test('should handle a single edition with >= operator', () => {
|
|
31
32
|
const tagProcessor = new _tagProcessor.default(editionOrder);
|
|
32
|
-
const userArgs = {
|
|
33
|
+
const userArgs = new _Configuration.default({
|
|
33
34
|
tags: 'tag1',
|
|
34
35
|
edition: '>=edition2'
|
|
35
|
-
};
|
|
36
|
+
});
|
|
36
37
|
const result = tagProcessor.processTags(userArgs);
|
|
37
38
|
expect(result).toBe('tag1 and not (@edition_edition1)');
|
|
38
39
|
});
|
|
39
40
|
test('should handle a single edition with < operator', () => {
|
|
40
41
|
const tagProcessor = new _tagProcessor.default(editionOrder);
|
|
41
|
-
const userArgs = {
|
|
42
|
+
const userArgs = new _Configuration.default({
|
|
42
43
|
tags: 'tag1',
|
|
43
44
|
edition: '<edition3'
|
|
44
|
-
};
|
|
45
|
+
});
|
|
45
46
|
const result = tagProcessor.processTags(userArgs);
|
|
46
47
|
expect(result).toBe('tag1 and not (@edition_edition3 or @edition_edition4)');
|
|
47
48
|
});
|
|
48
49
|
test('should handle a single edition with > operator', () => {
|
|
49
50
|
const tagProcessor = new _tagProcessor.default(editionOrder);
|
|
50
|
-
const userArgs = {
|
|
51
|
+
const userArgs = new _Configuration.default({
|
|
51
52
|
tags: 'tag1',
|
|
52
53
|
edition: '>edition1'
|
|
53
|
-
};
|
|
54
|
+
});
|
|
54
55
|
const result = tagProcessor.processTags(userArgs);
|
|
55
56
|
expect(result).toBe('tag1 and not (@edition_edition1)');
|
|
56
57
|
});
|
|
57
58
|
test('should handle a single edition with no operator', () => {
|
|
58
59
|
const tagProcessor = new _tagProcessor.default(editionOrder);
|
|
59
|
-
const userArgs = {
|
|
60
|
+
const userArgs = new _Configuration.default({
|
|
60
61
|
tags: 'tag1',
|
|
61
62
|
edition: 'edition2'
|
|
62
|
-
};
|
|
63
|
+
});
|
|
63
64
|
const result = tagProcessor.processTags(userArgs);
|
|
64
65
|
expect(result).toBe('tag1 and not (@edition_edition1 or @edition_edition3 or @edition_edition4)');
|
|
65
66
|
});
|
|
66
67
|
test('should log a message if edition is not found', () => {
|
|
67
68
|
const tagProcessor = new _tagProcessor.default(editionOrder);
|
|
68
|
-
const userArgs = {
|
|
69
|
+
const userArgs = new _Configuration.default({
|
|
69
70
|
tags: 'tag1',
|
|
70
71
|
edition: 'nonexistentEdition'
|
|
71
|
-
};
|
|
72
|
+
});
|
|
72
73
|
const result = tagProcessor.processTags(userArgs);
|
|
73
74
|
expect(result).toBe('tag1');
|
|
74
75
|
expect(_logger.Logger.log).toHaveBeenCalledWith(_logger.Logger.INFO_TYPE, expect.stringContaining('No matching editions for nonexistentEdition found.'));
|
|
75
76
|
});
|
|
76
77
|
test('should handle multiple editions', () => {
|
|
77
78
|
const tagProcessor = new _tagProcessor.default(editionOrder);
|
|
78
|
-
const userArgs = {
|
|
79
|
+
const userArgs = new _Configuration.default({
|
|
79
80
|
tags: 'tag1',
|
|
80
81
|
edition: 'edition1,edition3'
|
|
81
|
-
};
|
|
82
|
+
});
|
|
82
83
|
const result = tagProcessor.processTags(userArgs);
|
|
83
84
|
expect(result).toBe('tag1 and not (@edition_edition2 or @edition_edition4)');
|
|
84
85
|
});
|
|
85
86
|
test('should build tags correctly when tags are empty', () => {
|
|
86
87
|
const tagProcessor = new _tagProcessor.default(editionOrder);
|
|
87
|
-
const userArgs = {
|
|
88
|
+
const userArgs = new _Configuration.default({
|
|
88
89
|
tags: '',
|
|
89
90
|
edition: 'edition1'
|
|
90
|
-
};
|
|
91
|
+
});
|
|
91
92
|
const result = tagProcessor.processTags(userArgs);
|
|
92
93
|
expect(result).toBe('not (@edition_edition2 or @edition_edition3 or @edition_edition4)');
|
|
93
94
|
});
|
|
@@ -24,7 +24,7 @@ describe('getUATFileName', () => {
|
|
|
24
24
|
});
|
|
25
25
|
test('return the default config files for pipeline matched files not exists', () => {
|
|
26
26
|
const mode = 'ci';
|
|
27
|
-
const defaultPath = `${mockCwd}/uat
|
|
27
|
+
const defaultPath = `${mockCwd}/uat.config.js`;
|
|
28
28
|
_fs.existsSync.mockReturnValue(false);
|
|
29
29
|
_path.default.resolve.mockImplementation((...args) => args.join('/'));
|
|
30
30
|
const result = (0, _configFileNameProvider.getUATFileName)(mode);
|
|
@@ -2,70 +2,95 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
var _fileMutex = _interopRequireDefault(require("../../../../../core/playwright/helpers/fileMutex"));
|
|
5
|
-
var _properLockfile = _interopRequireDefault(require("proper-lockfile"));
|
|
6
5
|
var _path = _interopRequireDefault(require("path"));
|
|
7
|
-
var _fs =
|
|
8
|
-
jest.mock('proper-lockfile');
|
|
6
|
+
var _fs = require("fs");
|
|
9
7
|
jest.mock('fs');
|
|
10
8
|
describe('FileMutex', () => {
|
|
11
9
|
const directory = '/tmp/locks';
|
|
12
10
|
const lockFileName = 'test-lock';
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
factor: 1,
|
|
18
|
-
minTimeout: 5000,
|
|
19
|
-
maxTimeout: 8000
|
|
20
|
-
}
|
|
11
|
+
const email = 'test@example.com';
|
|
12
|
+
const authFile = '/tmp/authFile';
|
|
13
|
+
const fileDeletionTimeoutConfig = {
|
|
14
|
+
timeout: 1000
|
|
21
15
|
};
|
|
22
16
|
const lockFilePath = _path.default.resolve(directory, lockFileName + '.lock');
|
|
23
17
|
let fileMutex;
|
|
24
18
|
beforeEach(() => {
|
|
25
|
-
fileMutex = new _fileMutex.default(directory, lockFileName, options);
|
|
26
19
|
jest.clearAllMocks();
|
|
20
|
+
fileMutex = new _fileMutex.default(directory, lockFileName, email, authFile, fileDeletionTimeoutConfig);
|
|
27
21
|
});
|
|
28
22
|
describe('acquire', () => {
|
|
29
|
-
it('should create
|
|
30
|
-
_fs.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
await fileMutex.acquire();
|
|
34
|
-
expect(_fs.default.existsSync).toHaveBeenCalledWith(directory);
|
|
35
|
-
expect(_fs.default.mkdirSync).toHaveBeenCalledWith(directory, {
|
|
23
|
+
it('should create directory if it does not exist', async () => {
|
|
24
|
+
_fs.existsSync.mockReturnValue(false);
|
|
25
|
+
await fileMutex.createDirectoryIfNotExist();
|
|
26
|
+
expect(_fs.mkdirSync).toHaveBeenCalledWith(directory, {
|
|
36
27
|
recursive: true
|
|
37
28
|
});
|
|
38
29
|
});
|
|
39
30
|
it('should create the lock file if it does not exist', async () => {
|
|
40
|
-
_fs.
|
|
41
|
-
_fs.
|
|
42
|
-
|
|
31
|
+
_fs.existsSync.mockImplementation(filePath => filePath === authFile ? false : false);
|
|
32
|
+
_fs.writeFileSync.mockImplementation(() => {});
|
|
33
|
+
await fileMutex.acquire();
|
|
34
|
+
expect(_fs.writeFileSync).toHaveBeenCalledWith(fileMutex.lockFilePath, 'locked');
|
|
35
|
+
});
|
|
36
|
+
it('should resolve immediately if auth file exists', async () => {
|
|
37
|
+
_fs.existsSync.mockImplementation(filePath => filePath === authFile);
|
|
43
38
|
await fileMutex.acquire();
|
|
44
|
-
expect(_fs.
|
|
45
|
-
expect(_fs.default.writeFileSync).toHaveBeenCalledWith(lockFilePath, 'locked');
|
|
39
|
+
expect(_fs.existsSync).toHaveBeenCalledWith(authFile);
|
|
46
40
|
});
|
|
47
|
-
it('should
|
|
48
|
-
_fs.
|
|
49
|
-
|
|
41
|
+
it('should wait for lock file deletion if it exists', async () => {
|
|
42
|
+
_fs.existsSync.mockImplementation(filePath => filePath === fileMutex.lockFilePath);
|
|
43
|
+
_fs.watch.mockImplementation((dir, callback) => {
|
|
44
|
+
setTimeout(() => {
|
|
45
|
+
_fs.existsSync.mockImplementation(() => false);
|
|
46
|
+
callback('rename', fileMutex.lockFileName);
|
|
47
|
+
}, fileDeletionTimeoutConfig);
|
|
48
|
+
return {
|
|
49
|
+
close: jest.fn()
|
|
50
|
+
};
|
|
51
|
+
});
|
|
50
52
|
await fileMutex.acquire();
|
|
51
|
-
expect(
|
|
53
|
+
expect(_fs.watch).toHaveBeenCalledWith(directory, expect.any(Function));
|
|
52
54
|
});
|
|
53
|
-
it('should
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
it('should reject if watch timeout exceeds', async () => {
|
|
56
|
+
_fs.existsSync.mockImplementation(filePath => filePath === lockFilePath);
|
|
57
|
+
_fs.watch.mockImplementation(() => {
|
|
58
|
+
return {
|
|
59
|
+
close: jest.fn()
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
await expect(fileMutex.acquire()).rejects.toThrow('Watch timeout exceeded');
|
|
57
63
|
});
|
|
58
64
|
});
|
|
59
65
|
describe('release', () => {
|
|
60
|
-
it('should
|
|
61
|
-
|
|
66
|
+
it('should delete the lock file if it exists', async () => {
|
|
67
|
+
_fs.existsSync.mockReturnValue(true);
|
|
68
|
+
_fs.unlinkSync.mockImplementation(() => {});
|
|
62
69
|
await fileMutex.release();
|
|
63
|
-
expect(
|
|
70
|
+
expect(_fs.existsSync).toHaveBeenCalledWith(lockFilePath);
|
|
71
|
+
expect(_fs.unlinkSync).toHaveBeenCalledWith(lockFilePath);
|
|
64
72
|
});
|
|
65
|
-
it('should
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
await
|
|
73
|
+
it('should release lock by deleting lock file', async () => {
|
|
74
|
+
_fs.existsSync.mockReturnValue(true);
|
|
75
|
+
_fs.unlinkSync.mockImplementation(() => {});
|
|
76
|
+
await fileMutex.release();
|
|
77
|
+
expect(_fs.unlinkSync).toHaveBeenCalledWith(lockFilePath);
|
|
78
|
+
});
|
|
79
|
+
it('should not attempt to delete the lock file if it does not exist', async () => {
|
|
80
|
+
_fs.existsSync.mockReturnValue(false);
|
|
81
|
+
await fileMutex.release();
|
|
82
|
+
expect(_fs.existsSync).toHaveBeenCalledWith(lockFilePath);
|
|
83
|
+
expect(_fs.unlinkSync).not.toHaveBeenCalled();
|
|
84
|
+
});
|
|
85
|
+
it('should log an error if deleting the lock file fails', async () => {
|
|
86
|
+
const errorMessage = 'Error deleting lock file';
|
|
87
|
+
_fs.existsSync.mockReturnValue(true);
|
|
88
|
+
_fs.unlinkSync.mockImplementation(() => {
|
|
89
|
+
throw new Error(errorMessage);
|
|
90
|
+
});
|
|
91
|
+
console.error = jest.fn();
|
|
92
|
+
await fileMutex.release();
|
|
93
|
+
expect(console.error).toHaveBeenCalledWith(`Error deleting lock file: ${errorMessage}`);
|
|
69
94
|
});
|
|
70
95
|
});
|
|
71
96
|
});
|