@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.
Files changed (136) hide show
  1. package/.gitlab-ci.yml +2 -2
  2. package/README.md +1 -54
  3. package/build/bdd-framework/cli/commands/env.js +42 -0
  4. package/build/bdd-framework/cli/commands/export.js +62 -0
  5. package/build/bdd-framework/cli/commands/test.js +64 -0
  6. package/build/bdd-framework/cli/index.js +11 -0
  7. package/build/bdd-framework/cli/options.js +19 -0
  8. package/build/bdd-framework/cli/worker.js +13 -0
  9. package/build/bdd-framework/config/configDir.js +35 -0
  10. package/build/bdd-framework/config/enrichReporterData.js +23 -0
  11. package/build/bdd-framework/config/env.js +50 -0
  12. package/build/bdd-framework/config/index.js +94 -0
  13. package/build/bdd-framework/config/lang.js +14 -0
  14. package/build/bdd-framework/cucumber/buildStepDefinition.js +43 -0
  15. package/build/bdd-framework/cucumber/createTestStep.js +43 -0
  16. package/build/bdd-framework/cucumber/formatter/EventDataCollector.js +126 -0
  17. package/build/bdd-framework/cucumber/formatter/GherkinDocumentParser.js +72 -0
  18. package/build/bdd-framework/cucumber/formatter/PickleParser.js +25 -0
  19. package/build/bdd-framework/cucumber/formatter/durationHelpers.js +13 -0
  20. package/build/bdd-framework/cucumber/formatter/getColorFns.js +57 -0
  21. package/build/bdd-framework/cucumber/formatter/index.js +16 -0
  22. package/build/bdd-framework/cucumber/formatter/locationHelpers.js +16 -0
  23. package/build/bdd-framework/cucumber/loadConfig.js +17 -0
  24. package/build/bdd-framework/cucumber/loadFeatures.js +70 -0
  25. package/build/bdd-framework/cucumber/loadSnippetBuilder.js +20 -0
  26. package/build/bdd-framework/cucumber/loadSteps.js +47 -0
  27. package/build/bdd-framework/cucumber/resolveFeaturePaths.js +62 -0
  28. package/build/bdd-framework/cucumber/stepArguments.js +21 -0
  29. package/build/bdd-framework/cucumber/types.js +5 -0
  30. package/build/bdd-framework/cucumber/valueChecker.js +23 -0
  31. package/build/bdd-framework/decorators.js +18 -0
  32. package/build/bdd-framework/gen/fixtures.js +48 -0
  33. package/build/bdd-framework/gen/formatter.js +167 -0
  34. package/build/bdd-framework/gen/i18n.js +39 -0
  35. package/build/bdd-framework/gen/index.js +197 -0
  36. package/build/bdd-framework/gen/specialTags.js +70 -0
  37. package/build/bdd-framework/gen/testFile.js +470 -0
  38. package/build/bdd-framework/gen/testMeta.js +60 -0
  39. package/build/bdd-framework/gen/testNode.js +35 -0
  40. package/build/bdd-framework/gen/testPoms.js +133 -0
  41. package/build/bdd-framework/hooks/scenario.js +130 -0
  42. package/build/bdd-framework/hooks/worker.js +89 -0
  43. package/build/bdd-framework/index.js +52 -0
  44. package/build/bdd-framework/playwright/fixtureParameterNames.js +93 -0
  45. package/build/bdd-framework/playwright/getLocationInFile.js +79 -0
  46. package/build/bdd-framework/playwright/loadConfig.js +42 -0
  47. package/build/bdd-framework/playwright/loadUtils.js +33 -0
  48. package/build/bdd-framework/playwright/testTypeImpl.js +79 -0
  49. package/build/bdd-framework/playwright/transform.js +88 -0
  50. package/build/bdd-framework/playwright/types.js +12 -0
  51. package/build/bdd-framework/playwright/utils.js +56 -0
  52. package/build/bdd-framework/reporter/cucumber/base.js +52 -0
  53. package/build/bdd-framework/reporter/cucumber/custom.js +73 -0
  54. package/build/bdd-framework/reporter/cucumber/helper.js +12 -0
  55. package/build/bdd-framework/reporter/cucumber/html.js +40 -0
  56. package/build/bdd-framework/reporter/cucumber/index.js +74 -0
  57. package/build/bdd-framework/reporter/cucumber/json.js +312 -0
  58. package/build/bdd-framework/reporter/cucumber/junit.js +205 -0
  59. package/build/bdd-framework/reporter/cucumber/message.js +20 -0
  60. package/build/bdd-framework/reporter/cucumber/messagesBuilder/AttachmentMapper.js +82 -0
  61. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Builder.js +197 -0
  62. package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocument.js +43 -0
  63. package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocumentClone.js +52 -0
  64. package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocuments.js +105 -0
  65. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Hook.js +70 -0
  66. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Meta.js +45 -0
  67. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Pickles.js +27 -0
  68. package/build/bdd-framework/reporter/cucumber/messagesBuilder/Projects.js +38 -0
  69. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCase.js +128 -0
  70. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRun.js +154 -0
  71. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRunHooks.js +123 -0
  72. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepAttachments.js +67 -0
  73. package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepRun.js +114 -0
  74. package/build/bdd-framework/reporter/cucumber/messagesBuilder/index.js +30 -0
  75. package/build/bdd-framework/reporter/cucumber/messagesBuilder/pwStepUtils.js +70 -0
  76. package/build/bdd-framework/reporter/cucumber/messagesBuilder/timing.js +35 -0
  77. package/build/bdd-framework/reporter/cucumber/messagesBuilder/types.js +5 -0
  78. package/build/bdd-framework/run/StepInvoker.js +69 -0
  79. package/build/bdd-framework/run/bddData/index.js +59 -0
  80. package/build/bdd-framework/run/bddData/types.js +5 -0
  81. package/build/bdd-framework/run/bddFixtures.js +192 -0
  82. package/build/bdd-framework/run/bddWorld.js +79 -0
  83. package/build/bdd-framework/run/bddWorldInternal.js +11 -0
  84. package/build/bdd-framework/snippets/index.js +132 -0
  85. package/build/bdd-framework/snippets/snippetSyntax.js +43 -0
  86. package/build/bdd-framework/snippets/snippetSyntaxDecorators.js +26 -0
  87. package/build/bdd-framework/snippets/snippetSyntaxTs.js +18 -0
  88. package/build/bdd-framework/stepDefinitions/createBdd.js +66 -0
  89. package/build/bdd-framework/stepDefinitions/decorators/class.js +68 -0
  90. package/build/bdd-framework/stepDefinitions/decorators/steps.js +99 -0
  91. package/build/bdd-framework/stepDefinitions/defineStep.js +62 -0
  92. package/build/bdd-framework/stepDefinitions/stepConfig.js +24 -0
  93. package/build/bdd-framework/steps/createBdd.js +78 -0
  94. package/build/bdd-framework/steps/decorators/class.js +68 -0
  95. package/build/bdd-framework/steps/decorators/steps.js +98 -0
  96. package/build/bdd-framework/steps/defineStep.js +62 -0
  97. package/build/bdd-framework/steps/stepConfig.js +24 -0
  98. package/build/bdd-framework/utils/AutofillMap.js +20 -0
  99. package/build/bdd-framework/utils/exit.js +62 -0
  100. package/build/bdd-framework/utils/index.js +93 -0
  101. package/build/bdd-framework/utils/jsStringWrap.js +44 -0
  102. package/build/bdd-framework/utils/logger.js +30 -0
  103. package/build/bdd-framework/utils/stripAnsiEscapes.js +20 -0
  104. package/build/core/playwright/builtInFixtures/page.js +17 -32
  105. package/build/core/playwright/clear-caches.js +0 -7
  106. package/build/core/playwright/constants/fileMutexConfig.js +3 -9
  107. package/build/core/playwright/helpers/auth/loginSteps.js +2 -9
  108. package/build/core/playwright/helpers/configFileNameProvider.js +1 -1
  109. package/build/core/playwright/helpers/fileMutex.js +51 -28
  110. package/build/core/playwright/index.js +23 -10
  111. package/build/core/playwright/runner/SpawnRunner.js +2 -2
  112. package/build/core/playwright/setup/config-creator.js +8 -15
  113. package/build/core/playwright/setup/config-utils.js +25 -8
  114. package/build/core/playwright/tagProcessor.js +34 -22
  115. package/build/core/playwright/test-runner.js +2 -2
  116. package/build/decorators.d.ts +1 -1
  117. package/build/decorators.js +1 -1
  118. package/build/setup-folder-structure/samples/auth-setup-sample.js +68 -10
  119. package/build/setup-folder-structure/samples/authUsers-sample.json +9 -0
  120. package/build/setup-folder-structure/samples/env-config-sample.json +21 -0
  121. package/build/setup-folder-structure/samples/uat-config-sample.js +1 -3
  122. package/build/setup-folder-structure/setupProject.js +5 -22
  123. package/build/test/core/playwright/__tests__/tagProcessor.test.js +19 -18
  124. package/build/test/core/playwright/helpers/__tests__/configFileNameProvider.test.js +1 -1
  125. package/build/test/core/playwright/helpers/__tests__/fileMutex.test.js +64 -39
  126. package/npm-shrinkwrap.json +3342 -7679
  127. package/package.json +9 -11
  128. package/playwright.config.js +48 -0
  129. package/unit_reports/unit-report.html +260 -0
  130. package/build/core/playwright/fixtures.js +0 -24
  131. package/build/setup-folder-structure/samples/accountLogin-sample.js +0 -19
  132. package/build/setup-folder-structure/samples/actors-index.js +0 -2
  133. package/build/setup-folder-structure/samples/editions-index.js +0 -3
  134. package/build/setup-folder-structure/samples/free-sample.json +0 -25
  135. package/build/setup-folder-structure/samples/settings.json +0 -7
  136. 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=dev --headed",
14
- "uat-debug": "ZDTestingFramework test --mode=dev --debug",
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 settings.json file inside UAT Folder');
92
- if (!(0, _fs.existsSync)(_path.default.resolve(uatFolder, 'conf', 'default'))) {
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/conf/default/uat.config.js`;
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 = _interopRequireDefault(require("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 options = {
14
- stale: 10000,
15
- retries: {
16
- retries: 5,
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 the directory if it does not exist', async () => {
30
- _fs.default.existsSync.mockReturnValue(false);
31
- _fs.default.mkdirSync.mockImplementation(() => {});
32
- _properLockfile.default.lock.mockResolvedValue();
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.default.existsSync.mockImplementation(filePath => filePath !== lockFilePath);
41
- _fs.default.writeFileSync.mockImplementation(() => {});
42
- _properLockfile.default.lock.mockResolvedValue();
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.default.existsSync).toHaveBeenCalledWith(lockFilePath);
45
- expect(_fs.default.writeFileSync).toHaveBeenCalledWith(lockFilePath, 'locked');
39
+ expect(_fs.existsSync).toHaveBeenCalledWith(authFile);
46
40
  });
47
- it('should acquire the lock using proper-lockfile', async () => {
48
- _fs.default.existsSync.mockReturnValue(true);
49
- _properLockfile.default.lock.mockResolvedValue();
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(_properLockfile.default.lock).toHaveBeenCalledWith(lockFilePath, options);
53
+ expect(_fs.watch).toHaveBeenCalledWith(directory, expect.any(Function));
52
54
  });
53
- it('should throw an error if lock acquisition fails', async () => {
54
- const errorMessage = 'Lock acquisition failed';
55
- _properLockfile.default.lock.mockRejectedValue(new Error(errorMessage));
56
- await expect(fileMutex.acquire()).rejects.toThrow(`Failed to acquire lock after ${options.retries.retries} attempts: ${errorMessage}`);
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 release the lock using proper-lockfile', async () => {
61
- _properLockfile.default.unlock.mockResolvedValue();
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(_properLockfile.default.unlock).toHaveBeenCalledWith(lockFilePath);
70
+ expect(_fs.existsSync).toHaveBeenCalledWith(lockFilePath);
71
+ expect(_fs.unlinkSync).toHaveBeenCalledWith(lockFilePath);
64
72
  });
65
- it('should throw an error if lock release fails', async () => {
66
- const errorMessage = 'Lock release failed';
67
- _properLockfile.default.unlock.mockRejectedValue(new Error(errorMessage));
68
- await expect(fileMutex.release()).rejects.toThrow(`Failed to release lock: ${errorMessage}`);
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
  });