@camperaid/watest 2.5.1 → 2.5.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 (162) hide show
  1. package/README.md +274 -129
  2. package/bin/watest.js +36 -2
  3. package/core/core.js +43 -15
  4. package/core/deps.js +211 -0
  5. package/core/{process_args.js → process-args.js} +8 -0
  6. package/core/series.js +41 -40
  7. package/core/settings.js +27 -9
  8. package/core/util.js +1 -1
  9. package/index.js +5 -3
  10. package/interfaces/servicer.js +13 -2
  11. package/logging/logging.js +1 -1
  12. package/logging/logpipe.js +38 -21
  13. package/package.json +1 -1
  14. package/tests/base/{t_core.js → t-core.js} +10 -3
  15. package/tests/base/test.js +1 -2
  16. package/tests/deps/samples/nested/.watestrc.js +3 -0
  17. package/tests/deps/samples/nested/tests/meta.js +1 -0
  18. package/tests/deps/samples/nested/tests/services/meta.js +1 -0
  19. package/tests/deps/samples/nested/tests/services/ws/meta.js +1 -0
  20. package/tests/deps/samples/nested/tests/services/ws/webservice/meta.js +2 -0
  21. package/tests/deps/samples/nested/tests/services/ws/webservice/t-ws.js +3 -0
  22. package/tests/deps/samples/unified/.watestrc.js +3 -0
  23. package/tests/deps/samples/unified/tests/e2e/meta.js +4 -0
  24. package/tests/deps/samples/unified/tests/e2e/pages/meta.js +1 -0
  25. package/tests/deps/samples/unified/tests/e2e/pages/t-example.js +3 -0
  26. package/tests/deps/samples/unified/tests/e2e/t-example.js +3 -0
  27. package/tests/deps/samples/unified/tests/integration/meta.js +3 -0
  28. package/tests/deps/samples/unified/tests/lib/meta.js +0 -0
  29. package/tests/deps/samples/unified/tests/lib/t-example.js +3 -0
  30. package/tests/deps/samples/unified/tests/meta.js +8 -0
  31. package/tests/deps/samples/unified/tests/services/meta.js +3 -0
  32. package/tests/deps/samples/unified/tests/services/request/meta.js +1 -0
  33. package/tests/deps/samples/unified/tests/services/t-example.js +3 -0
  34. package/tests/deps/t-parse-cell-syntax.js +6 -0
  35. package/tests/deps/t-parse-grid-args.js +11 -0
  36. package/tests/deps/t-watest-deps.js +37 -0
  37. package/tests/deps/t-watest-grid.js +122 -0
  38. package/tests/deps/test.js +63 -0
  39. package/tests/e2e/samples/folder/package-lock.json +3 -1
  40. package/tests/e2e/samples/loader/package-lock.json +3 -1
  41. package/tests/e2e/samples/loader/tests/meta.js +1 -1
  42. package/tests/e2e/samples/{loader_mixed → loader-mixed}/package-lock.json +3 -1
  43. package/tests/e2e/samples/{loader_multiple/tests/core → loader-mixed/tests/ui}/meta.js +1 -1
  44. package/tests/e2e/samples/{loader_multiple → loader-multiple}/package-lock.json +3 -1
  45. package/tests/e2e/samples/{loader_multiple → loader-multiple}/tests/base/meta.js +1 -1
  46. package/tests/e2e/samples/{loader_mixed/tests/ui → loader-multiple/tests/core}/meta.js +1 -1
  47. package/tests/e2e/samples/single/package-lock.json +3 -1
  48. package/tests/e2e/samples/{wd_mixed → wd-mixed}/package-lock.json +3 -1
  49. package/tests/e2e/samples/{wd_single → wd-single}/package-lock.json +3 -1
  50. package/tests/e2e/{t_folder.js → t-folder.js} +2 -2
  51. package/tests/e2e/{t_loader_mixed.js → t-loader-mixed.js} +5 -5
  52. package/tests/e2e/{t_loader_multiple_patterns.js → t-loader-multiple-patterns.js} +6 -6
  53. package/tests/e2e/{t_loader_multiple.js → t-loader-multiple.js} +5 -5
  54. package/tests/e2e/{t_loader.js → t-loader.js} +2 -2
  55. package/tests/e2e/{t_single.js → t-single.js} +2 -2
  56. package/tests/e2e/{t_wd_firefox_chrome_pattern.js → t-wd-firefox-chrome-pattern.js} +6 -6
  57. package/tests/e2e/{t_wd_firefox_chrome.js → t-wd-firefox-chrome.js} +5 -5
  58. package/tests/e2e/{t_wd_firefox.js → t-wd-firefox.js} +3 -3
  59. package/tests/e2e/{t_wd_mixed_firefox_chrome.js → t-wd-mixed-firefox-chrome.js} +7 -7
  60. package/tests/e2e/{t_wd_mixed_firefox.js → t-wd-mixed-firefox.js} +5 -5
  61. package/tests/meta.js +1 -1
  62. package/tests/series/build/{t_webdriver_services.js → t-webdriver-services.js} +1 -0
  63. package/tests/series/logging/{t_failures.js → t-failures.js} +1 -1
  64. package/tests/series/logging/{t_success.js → t-success.js} +1 -1
  65. package/tests/series/logging/{t_verify.js → t-verify.js} +1 -1
  66. package/tests/series/servicer/mock-servicer.js +68 -0
  67. package/tests/series/servicer/t-nested-servicer-lifecycle.js +99 -0
  68. package/tests/series/servicer/t-servicer-no-services.js +53 -0
  69. package/tests/series/servicer/t-servicer-type-switching.js +139 -0
  70. package/tests/series/servicer/{t_servicer.js → t-servicer.js} +5 -38
  71. package/tests/series/test.js +1 -1
  72. package/tests/test.js +2 -0
  73. package/tests/webdriver/test.js +3 -3
  74. package/webdriver/{control_driver.js → control-driver.js} +1 -1
  75. package/webdriver/{driver_base.js → driver-base.js} +8 -1
  76. package/webdriver/driver.js +1 -1
  77. package/webdriver/session.js +57 -30
  78. /package/tests/base/{t_api.js → t-api.js} +0 -0
  79. /package/tests/base/{t_contains.js → t-contains.js} +0 -0
  80. /package/tests/base/{t_format.js → t-format.js} +0 -0
  81. /package/tests/base/{t_is_object.js → t-is-object.js} +0 -0
  82. /package/tests/base/{t_is_primitive.js → t-is-primitive.js} +0 -0
  83. /package/tests/base/{t_is_string.js → t-is-string.js} +0 -0
  84. /package/tests/base/{t_is.js → t-is.js} +0 -0
  85. /package/tests/base/{t_ok.js → t-ok.js} +0 -0
  86. /package/tests/base/{t_stringify.js → t-stringify.js} +0 -0
  87. /package/tests/base/{t_system.js → t-system.js} +0 -0
  88. /package/tests/base/{t_test_.js → t-test-.js} +0 -0
  89. /package/tests/base/{t_throws.js → t-throws.js} +0 -0
  90. /package/tests/e2e/samples/folder/tests/unit/{t_test.js → t-test.js} +0 -0
  91. /package/tests/e2e/samples/{loader_multiple/tests/module_mock.js → loader/tests/module-mock.js} +0 -0
  92. /package/tests/e2e/samples/loader/tests/{t_test.js → t-test.js} +0 -0
  93. /package/tests/e2e/samples/{loader_mixed → loader-mixed}/.watestrc.js +0 -0
  94. /package/tests/e2e/samples/{loader_mixed → loader-mixed}/package.json +0 -0
  95. /package/tests/e2e/samples/{loader_mixed → loader-mixed}/tests/meta.js +0 -0
  96. /package/tests/e2e/samples/{loader/tests/module_mock.js → loader-mixed/tests/module-mock.js} +0 -0
  97. /package/tests/e2e/samples/{loader_mixed → loader-mixed}/tests/module.js +0 -0
  98. /package/tests/e2e/samples/{loader_mixed/tests/ui/t_test.js → loader-mixed/tests/ui/t-test.js} +0 -0
  99. /package/tests/e2e/samples/{loader_mixed/tests/unit/t_test.js → loader-mixed/tests/unit/t-test.js} +0 -0
  100. /package/tests/e2e/samples/{loader_multiple → loader-multiple}/.watestrc.js +0 -0
  101. /package/tests/e2e/samples/{loader_multiple → loader-multiple}/package.json +0 -0
  102. /package/tests/e2e/samples/{loader_multiple/tests/base/t_btest.js → loader-multiple/tests/base/t-btest.js} +0 -0
  103. /package/tests/e2e/samples/{loader_multiple/tests/core/t_ctest.js → loader-multiple/tests/core/t-ctest.js} +0 -0
  104. /package/tests/e2e/samples/{loader_multiple → loader-multiple}/tests/meta.js +0 -0
  105. /package/tests/e2e/samples/{loader_mixed/tests/module_mock.js → loader-multiple/tests/module-mock.js} +0 -0
  106. /package/tests/e2e/samples/{loader_multiple → loader-multiple}/tests/module.js +0 -0
  107. /package/tests/e2e/samples/single/tests/{t_test.js → t-test.js} +0 -0
  108. /package/tests/e2e/samples/{wd_mixed → wd-mixed}/.watestrc.js +0 -0
  109. /package/tests/e2e/samples/{wd_mixed → wd-mixed}/package.json +0 -0
  110. /package/tests/e2e/samples/{wd_mixed → wd-mixed}/tests/meta.js +0 -0
  111. /package/tests/e2e/samples/{wd_mixed → wd-mixed}/tests/ui/meta.js +0 -0
  112. /package/tests/e2e/samples/{wd_mixed/tests/ui/t_test.js → wd-mixed/tests/ui/t-test.js} +0 -0
  113. /package/tests/e2e/samples/{wd_mixed/tests/unit/t_test.js → wd-mixed/tests/unit/t-test.js} +0 -0
  114. /package/tests/e2e/samples/{wd_single → wd-single}/.watestrc.js +0 -0
  115. /package/tests/e2e/samples/{wd_single → wd-single}/package.json +0 -0
  116. /package/tests/e2e/samples/{wd_single → wd-single}/tests/meta.js +0 -0
  117. /package/tests/e2e/samples/{wd_single/tests/t_test.js → wd-single/tests/t-test.js} +0 -0
  118. /package/tests/series/build/{t_adjust_names_webdriver.js → t-adjust-names-webdriver.js} +0 -0
  119. /package/tests/series/build/{t_adjust_names.js → t-adjust-names.js} +0 -0
  120. /package/tests/series/build/{t_expected_failures.js → t-expected-failures.js} +0 -0
  121. /package/tests/series/build/{t_loader_mixed.js → t-loader-mixed.js} +0 -0
  122. /package/tests/series/build/{t_loader.js → t-loader.js} +0 -0
  123. /package/tests/series/build/{t_mixed.js → t-mixed.js} +0 -0
  124. /package/tests/series/build/{t_nested.js → t-nested.js} +0 -0
  125. /package/tests/series/build/{t_pattern_filtering.js → t-pattern-filtering.js} +0 -0
  126. /package/tests/series/build/{t_patterns_loader.js → t-patterns-loader.js} +0 -0
  127. /package/tests/series/build/{t_patterns_webdriver.js → t-patterns-webdriver.js} +0 -0
  128. /package/tests/series/build/{t_webdriver_firefox_mixed.js → t-webdriver-firefox-mixed.js} +0 -0
  129. /package/tests/series/build/{t_webdriver_nested.js → t-webdriver-nested.js} +0 -0
  130. /package/tests/series/build/{t_webdriver.js → t-webdriver.js} +0 -0
  131. /package/tests/series/generic/{t_failures_info.js → t-failures-info.js} +0 -0
  132. /package/tests/series/{mock_series.js → mock-series.js} +0 -0
  133. /package/tests/series/perform/{t_failure_notest.js → t-failure-notest.js} +0 -0
  134. /package/tests/series/perform/{t_failure.js → t-failure.js} +0 -0
  135. /package/tests/series/perform/{t_intermittent_global.js → t-intermittent-global.js} +0 -0
  136. /package/tests/series/perform/{t_intermittent.js → t-intermittent.js} +0 -0
  137. /package/tests/series/perform/{t_missing_perma.js → t-missing-perma.js} +0 -0
  138. /package/tests/series/perform/{t_nested.js → t-nested.js} +0 -0
  139. /package/tests/series/perform/{t_perma.js → t-perma.js} +0 -0
  140. /package/tests/series/perform/{t_success.js → t-success.js} +0 -0
  141. /package/tests/series/run/{t_debunk_failure.js → t-debunk-failure.js} +0 -0
  142. /package/tests/series/run/{t_debunk_success.js → t-debunk-success.js} +0 -0
  143. /package/tests/series/run/{t_nested.js → t-nested.js} +0 -0
  144. /package/tests/series/run/{t_verify_webdriver.js → t-verify-webdriver.js} +0 -0
  145. /package/tests/series/run/{t_verify.js → t-verify.js} +0 -0
  146. /package/tests/webdriver/{t_app_driver_selectors.js → t-app-driver-selectors.js} +0 -0
  147. /package/tests/webdriver/{t_app_driver.js → t-app-driver.js} +0 -0
  148. /package/tests/webdriver/{t_attribute_all.js → t-attribute-all.js} +0 -0
  149. /package/tests/webdriver/{t_attribute.js → t-attribute.js} +0 -0
  150. /package/tests/webdriver/{t_doubleclick.js → t-doubleclick.js} +0 -0
  151. /package/tests/webdriver/{t_doubleclickat.js → t-doubleclickat.js} +0 -0
  152. /package/tests/webdriver/{t_execute.js → t-execute.js} +0 -0
  153. /package/tests/webdriver/{t_if_has_elements.js → t-if-has-elements.js} +0 -0
  154. /package/tests/webdriver/{t_if_no_elements.js → t-if-no-elements.js} +0 -0
  155. /package/tests/webdriver/{t_no_elements_or_not_visible.js → t-no-elements-or-not-visible.js} +0 -0
  156. /package/tests/webdriver/{t_properties.js → t-properties.js} +0 -0
  157. /package/tests/webdriver/{t_script.js → t-script.js} +0 -0
  158. /package/tests/webdriver/{t_select_all.js → t-select-all.js} +0 -0
  159. /package/tests/webdriver/{t_selection.js → t-selection.js} +0 -0
  160. /package/tests/webdriver/{t_text_all.js → t-text-all.js} +0 -0
  161. /package/tests/webdriver/{t_text.js → t-text.js} +0 -0
  162. /package/webdriver/{app_driver.js → app-driver.js} +0 -0
@@ -1,8 +1,7 @@
1
1
  import { testflow } from '../../core/core.js';
2
2
  import { is_output as is_output_base } from '../../core/base.js';
3
3
 
4
- export * from '../../core/base.js';
5
- export * from '../../core/core.js';
4
+ export * from '../test.js';
6
5
  export * from '../../core/format.js';
7
6
 
8
7
  function is_output(func, out, err, msg) {
@@ -0,0 +1,3 @@
1
+ export default {
2
+ tests_folder: 'tests',
3
+ };
@@ -0,0 +1 @@
1
+ export const folders = ['services'];
@@ -0,0 +1 @@
1
+ export const folders = ['ws'];
@@ -0,0 +1 @@
1
+ export const folders = ['webservice'];
@@ -0,0 +1,2 @@
1
+ export const servicer = 'docker';
2
+ export const services = ['ws'];
@@ -0,0 +1,3 @@
1
+ export async function test() {
2
+ // Dummy test
3
+ }
@@ -0,0 +1,3 @@
1
+ export default {
2
+ webdrivers: ['chrome', 'firefox'],
3
+ };
@@ -0,0 +1,4 @@
1
+ export const servicer = 'kubernetes';
2
+ export const webdriver = true;
3
+ export const services = ['db', ['nginx', { env: { CA_TEST: 'value' } }]];
4
+ export const folders = ['pages'];
@@ -0,0 +1 @@
1
+ export const services = ['request'];
@@ -0,0 +1,3 @@
1
+ export async function test() {
2
+ // Dummy test
3
+ }
@@ -0,0 +1,3 @@
1
+ export async function test() {
2
+ // Dummy test
3
+ }
@@ -0,0 +1,3 @@
1
+ export const webdriver = true;
2
+ export const servicer = 'docker';
3
+ export const services = ['db'];
File without changes
@@ -0,0 +1,3 @@
1
+ export async function test() {
2
+ // Dummy test
3
+ }
@@ -0,0 +1,8 @@
1
+ export const folders = ['e2e', 'integration', 'lib', 'services'];
2
+
3
+ export const grid = {
4
+ 'e2e+': ['tests/e2e'],
5
+ 'integration': ['tests/integration'],
6
+ 'lib': ['tests/lib'],
7
+ 'services': ['tests/services'],
8
+ };
@@ -0,0 +1,3 @@
1
+ export const servicer = 'docker';
2
+ export const services = ['inbucket'];
3
+ export const folders = ['request'];
@@ -0,0 +1 @@
1
+ export const services = ['request'];
@@ -0,0 +1,3 @@
1
+ export async function test() {
2
+ // Dummy test
3
+ }
@@ -0,0 +1,6 @@
1
+ import { is, parseCellSyntax } from './test.js';
2
+
3
+ export async function test() {
4
+ is(parseCellSyntax('e2e'), { name: 'e2e', split: false }, 'without +');
5
+ is(parseCellSyntax('e2e+'), { name: 'e2e', split: true }, 'with +');
6
+ }
@@ -0,0 +1,11 @@
1
+ import { is, parseGridArgs } from './test.js';
2
+
3
+ export async function test() {
4
+ const args1 = parseGridArgs(['tests/e2e', 'tests/www', 'chrome', 'firefox']);
5
+ is(args1.paths, ['tests/e2e', 'tests/www'], 'paths');
6
+ is(args1.webdrivers, ['chrome', 'firefox'], 'webdrivers');
7
+
8
+ const args2 = parseGridArgs([]);
9
+ is(args2.paths, [], 'empty paths');
10
+ is(args2.webdrivers, [], 'empty webdrivers');
11
+ }
@@ -0,0 +1,37 @@
1
+ import { testDeps } from './test.js';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ const unifiedSamplePath = path.join(__dirname, 'samples/unified');
7
+ const nestedSamplePath = path.join(__dirname, 'samples/nested');
8
+
9
+ export async function test() {
10
+ // Test specific path: tests/e2e
11
+ await testDeps(['tests/e2e'], unifiedSamplePath, {
12
+ servicers: ['kubernetes'],
13
+ webdriver: true,
14
+ services: ['db', 'nginx', 'request'],
15
+ });
16
+
17
+ // Test no arguments (should default to tests/)
18
+ await testDeps([], unifiedSamplePath, {
19
+ servicers: ['kubernetes', 'docker'],
20
+ webdriver: true,
21
+ services: ['db', 'nginx', 'request', 'inbucket'],
22
+ });
23
+
24
+ // Test with deeply nested test file path
25
+ await testDeps(['tests/services/ws/webservice/t-ws.js'], nestedSamplePath, {
26
+ servicers: ['docker'],
27
+ webdriver: false,
28
+ services: ['ws'],
29
+ });
30
+
31
+ // Test with nested directory path
32
+ await testDeps(['tests/services/ws/webservice'], nestedSamplePath, {
33
+ servicers: ['docker'],
34
+ webdriver: false,
35
+ services: ['ws'],
36
+ });
37
+ }
@@ -0,0 +1,122 @@
1
+ import { is, testGrid } from './test.js';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ const samplesPath = path.join(__dirname, 'samples/unified');
7
+
8
+ export async function test() {
9
+ // Default browsers from .watestrc.js (chrome, firefox) - splits + cells
10
+ const result1 = await testGrid([], samplesPath);
11
+ is(
12
+ result1,
13
+ {
14
+ 'e2e-chrome': {
15
+ paths: ['tests/e2e'],
16
+ webdrivers: 'chrome',
17
+ servicers: ['kubernetes'],
18
+ services: ['db', 'nginx', 'request'],
19
+ },
20
+ 'e2e-firefox': {
21
+ paths: ['tests/e2e'],
22
+ webdrivers: 'firefox',
23
+ servicers: ['kubernetes'],
24
+ services: ['db', 'nginx', 'request'],
25
+ },
26
+ 'integration': {
27
+ paths: ['tests/integration'],
28
+ webdrivers: 'chrome firefox',
29
+ servicers: ['docker'],
30
+ services: ['db'],
31
+ },
32
+ 'lib': {
33
+ paths: ['tests/lib'],
34
+ webdrivers: '',
35
+ servicers: [],
36
+ services: [],
37
+ },
38
+ 'services': {
39
+ paths: ['tests/services'],
40
+ webdrivers: '',
41
+ servicers: ['docker'],
42
+ services: ['inbucket', 'request'],
43
+ },
44
+ },
45
+ 'default browsers split + cells',
46
+ );
47
+
48
+ // Single browser - no split even for + cells
49
+ const result2 = await testGrid(['chrome'], samplesPath);
50
+ is(
51
+ result2,
52
+ {
53
+ e2e: {
54
+ paths: ['tests/e2e'],
55
+ webdrivers: 'chrome',
56
+ servicers: ['kubernetes'],
57
+ services: ['db', 'nginx', 'request'],
58
+ },
59
+ integration: {
60
+ paths: ['tests/integration'],
61
+ webdrivers: 'chrome',
62
+ servicers: ['docker'],
63
+ services: ['db'],
64
+ },
65
+ lib: {
66
+ paths: ['tests/lib'],
67
+ webdrivers: '',
68
+ servicers: [],
69
+ services: [],
70
+ },
71
+ services: {
72
+ paths: ['tests/services'],
73
+ webdrivers: '',
74
+ servicers: ['docker'],
75
+ services: ['inbucket', 'request'],
76
+ },
77
+ },
78
+ 'single browser no split',
79
+ );
80
+
81
+ // Multiple browsers without split (no + cells, explicit browsers)
82
+ const result3 = await testGrid(
83
+ ['tests/lib', 'chrome', 'firefox'],
84
+ samplesPath,
85
+ );
86
+ is(
87
+ result3,
88
+ {
89
+ lib: {
90
+ paths: ['tests/lib'],
91
+ webdrivers: '',
92
+ servicers: [],
93
+ services: [],
94
+ },
95
+ },
96
+ 'no webdriver cell with multiple browsers',
97
+ );
98
+
99
+ // Filter by paths with multiple browsers (+ cell splits)
100
+ const result4 = await testGrid(
101
+ ['tests/e2e', 'chrome', 'firefox'],
102
+ samplesPath,
103
+ );
104
+ is(
105
+ result4,
106
+ {
107
+ 'e2e-chrome': {
108
+ paths: ['tests/e2e'],
109
+ webdrivers: 'chrome',
110
+ servicers: ['kubernetes'],
111
+ services: ['db', 'nginx', 'request'],
112
+ },
113
+ 'e2e-firefox': {
114
+ paths: ['tests/e2e'],
115
+ webdrivers: 'firefox',
116
+ servicers: ['kubernetes'],
117
+ services: ['db', 'nginx', 'request'],
118
+ },
119
+ },
120
+ 'filtered paths with split',
121
+ );
122
+ }
@@ -0,0 +1,63 @@
1
+ export * from '../test.js';
2
+ export * from '../../core/deps.js';
3
+
4
+ import { is } from '../test.js';
5
+ import { spawn } from '../../core/spawn.js';
6
+ import path from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+
11
+ /**
12
+ * Helper to test watest --deps command
13
+ * @param {string[]} paths - Paths to pass to --deps (empty array for no args)
14
+ * @param {string} samplesPath - Path to samples directory
15
+ * @param {Object} expected - Expected metadata result
16
+ */
17
+ export async function testDeps(paths, samplesPath, expected) {
18
+ let stdout = '';
19
+ let stderr = '';
20
+
21
+ const args = ['../../../../bin/watest.js', '--deps', ...paths];
22
+
23
+ await spawn('node', args, { cwd: samplesPath }, buffer => {
24
+ for (let { str_data, is_stdout } of buffer) {
25
+ if (is_stdout) stdout += str_data;
26
+ else stderr += str_data;
27
+ }
28
+ });
29
+
30
+ is(stderr, '', 'no errors');
31
+
32
+ // Filter out Settings lines before JSON
33
+ const jsonStart = stdout.indexOf('{');
34
+ const jsonStr = jsonStart >= 0 ? stdout.slice(jsonStart) : stdout;
35
+
36
+ const meta = JSON.parse(jsonStr);
37
+ const pathsDesc =
38
+ paths.length === 0 ? 'no args (defaults to tests/)' : paths.join(', ');
39
+ is(meta, expected, `deps for ${pathsDesc}`);
40
+ }
41
+
42
+ /**
43
+ * Helper to test watest --grid command
44
+ * @param {string[]} args - Arguments to pass to --grid
45
+ * @param {string} cwd - Working directory for the command
46
+ * @returns {Promise<Object>} Parsed grid JSON output
47
+ */
48
+ export async function testGrid(args, cwd) {
49
+ let stdout = '';
50
+ const watestBin = path.join(__dirname, '../../bin/watest.js');
51
+
52
+ await spawn('node', [watestBin, '--grid', ...args], { cwd }, buffer => {
53
+ for (let { str_data, is_stdout } of buffer) {
54
+ if (is_stdout) stdout += str_data;
55
+ }
56
+ });
57
+
58
+ const jsonStart = stdout.indexOf('{');
59
+ if (jsonStart < 0) {
60
+ throw new Error(`No JSON in output: ${stdout}`);
61
+ }
62
+ return JSON.parse(stdout.slice(jsonStart));
63
+ }
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "../../../..": {
18
18
  "name": "@camperaid/watest",
19
- "version": "2.4.10",
19
+ "version": "2.5.1",
20
20
  "dev": true,
21
21
  "license": "MPL",
22
22
  "dependencies": {
@@ -187,6 +187,7 @@
187
187
  "version": "8.12.1",
188
188
  "dev": true,
189
189
  "license": "MIT",
190
+ "peer": true,
190
191
  "bin": {
191
192
  "acorn": "bin/acorn"
192
193
  },
@@ -450,6 +451,7 @@
450
451
  "version": "9.8.0",
451
452
  "dev": true,
452
453
  "license": "MIT",
454
+ "peer": true,
453
455
  "dependencies": {
454
456
  "@eslint-community/eslint-utils": "^4.2.0",
455
457
  "@eslint-community/regexpp": "^4.11.0",
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "../../../..": {
18
18
  "name": "@camperaid/watest",
19
- "version": "2.4.10",
19
+ "version": "2.5.1",
20
20
  "dev": true,
21
21
  "license": "MPL",
22
22
  "dependencies": {
@@ -187,6 +187,7 @@
187
187
  "version": "8.12.1",
188
188
  "dev": true,
189
189
  "license": "MIT",
190
+ "peer": true,
190
191
  "bin": {
191
192
  "acorn": "bin/acorn"
192
193
  },
@@ -450,6 +451,7 @@
450
451
  "version": "9.8.0",
451
452
  "dev": true,
452
453
  "license": "MIT",
454
+ "peer": true,
453
455
  "dependencies": {
454
456
  "@eslint-community/eslint-utils": "^4.2.0",
455
457
  "@eslint-community/regexpp": "^4.11.0",
@@ -3,7 +3,7 @@ export const loader = true;
3
3
  export async function resolve(specifier, context, nextResolve) {
4
4
  switch (specifier) {
5
5
  case './module.js':
6
- specifier = './module_mock.js';
6
+ specifier = './module-mock.js';
7
7
  break;
8
8
  }
9
9
  return nextResolve(specifier, context);
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "../../../..": {
18
18
  "name": "@camperaid/watest",
19
- "version": "2.4.10",
19
+ "version": "2.5.1",
20
20
  "dev": true,
21
21
  "license": "MPL",
22
22
  "dependencies": {
@@ -187,6 +187,7 @@
187
187
  "version": "8.12.1",
188
188
  "dev": true,
189
189
  "license": "MIT",
190
+ "peer": true,
190
191
  "bin": {
191
192
  "acorn": "bin/acorn"
192
193
  },
@@ -450,6 +451,7 @@
450
451
  "version": "9.8.0",
451
452
  "dev": true,
452
453
  "license": "MIT",
454
+ "peer": true,
453
455
  "dependencies": {
454
456
  "@eslint-community/eslint-utils": "^4.2.0",
455
457
  "@eslint-community/regexpp": "^4.11.0",
@@ -3,7 +3,7 @@ export const loader = true;
3
3
  export async function resolve(specifier, context, nextResolve) {
4
4
  switch (specifier) {
5
5
  case '../module.js':
6
- specifier = '../module_mock.js';
6
+ specifier = '../module-mock.js';
7
7
  break;
8
8
  }
9
9
  return nextResolve(specifier, context);
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "../../../..": {
18
18
  "name": "@camperaid/watest",
19
- "version": "2.4.10",
19
+ "version": "2.5.1",
20
20
  "dev": true,
21
21
  "license": "MPL",
22
22
  "dependencies": {
@@ -187,6 +187,7 @@
187
187
  "version": "8.12.1",
188
188
  "dev": true,
189
189
  "license": "MIT",
190
+ "peer": true,
190
191
  "bin": {
191
192
  "acorn": "bin/acorn"
192
193
  },
@@ -450,6 +451,7 @@
450
451
  "version": "9.8.0",
451
452
  "dev": true,
452
453
  "license": "MIT",
454
+ "peer": true,
453
455
  "dependencies": {
454
456
  "@eslint-community/eslint-utils": "^4.2.0",
455
457
  "@eslint-community/regexpp": "^4.11.0",
@@ -3,7 +3,7 @@ export const loader = true;
3
3
  export async function resolve(specifier, context, nextResolve) {
4
4
  switch (specifier) {
5
5
  case '../module.js':
6
- specifier = '../module_mock.js';
6
+ specifier = '../module-mock.js';
7
7
  break;
8
8
  }
9
9
  return nextResolve(specifier, context);
@@ -3,7 +3,7 @@ export const loader = true;
3
3
  export async function resolve(specifier, context, nextResolve) {
4
4
  switch (specifier) {
5
5
  case '../module.js':
6
- specifier = '../module_mock.js';
6
+ specifier = '../module-mock.js';
7
7
  break;
8
8
  }
9
9
  return nextResolve(specifier, context);
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "../../../..": {
18
18
  "name": "@camperaid/watest",
19
- "version": "2.4.10",
19
+ "version": "2.5.1",
20
20
  "dev": true,
21
21
  "license": "MPL",
22
22
  "dependencies": {
@@ -187,6 +187,7 @@
187
187
  "version": "8.12.1",
188
188
  "dev": true,
189
189
  "license": "MIT",
190
+ "peer": true,
190
191
  "bin": {
191
192
  "acorn": "bin/acorn"
192
193
  },
@@ -450,6 +451,7 @@
450
451
  "version": "9.8.0",
451
452
  "dev": true,
452
453
  "license": "MIT",
454
+ "peer": true,
453
455
  "dependencies": {
454
456
  "@eslint-community/eslint-utils": "^4.2.0",
455
457
  "@eslint-community/regexpp": "^4.11.0",
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "../../../..": {
18
18
  "name": "@camperaid/watest",
19
- "version": "2.4.10",
19
+ "version": "2.5.1",
20
20
  "dev": true,
21
21
  "license": "MPL",
22
22
  "dependencies": {
@@ -187,6 +187,7 @@
187
187
  "version": "8.12.1",
188
188
  "dev": true,
189
189
  "license": "MIT",
190
+ "peer": true,
190
191
  "bin": {
191
192
  "acorn": "bin/acorn"
192
193
  },
@@ -450,6 +451,7 @@
450
451
  "version": "9.8.0",
451
452
  "dev": true,
452
453
  "license": "MIT",
454
+ "peer": true,
453
455
  "dependencies": {
454
456
  "@eslint-community/eslint-utils": "^4.2.0",
455
457
  "@eslint-community/regexpp": "^4.11.0",
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "../../../..": {
18
18
  "name": "@camperaid/watest",
19
- "version": "2.4.10",
19
+ "version": "2.5.1",
20
20
  "dev": true,
21
21
  "license": "MPL",
22
22
  "dependencies": {
@@ -187,6 +187,7 @@
187
187
  "version": "8.12.1",
188
188
  "dev": true,
189
189
  "license": "MIT",
190
+ "peer": true,
190
191
  "bin": {
191
192
  "acorn": "bin/acorn"
192
193
  },
@@ -450,6 +451,7 @@
450
451
  "version": "9.8.0",
451
452
  "dev": true,
452
453
  "license": "MIT",
454
+ "peer": true,
453
455
  "dependencies": {
454
456
  "@eslint-community/eslint-utils": "^4.2.0",
455
457
  "@eslint-community/regexpp": "^4.11.0",
@@ -7,9 +7,9 @@ export async function test() {
7
7
  [
8
8
  '\x1B[38;5;99mStarted\x1B[0m sample/',
9
9
  '\x1B[38;5;99mStarted\x1B[0m sample/unit',
10
- '!Running: sample/unit/t_test.js, path: tests/unit/t_test.js',
10
+ '!Running: sample/unit/t-test.js, path: tests/unit/t-test.js',
11
11
  '\x1B[32mOk:\x1B[0m works!',
12
- '>sample/unit/t_test.js completed in',
12
+ '>sample/unit/t-test.js completed in',
13
13
  '\x1B[38;5;243mCompleted\x1B[0m sample/unit',
14
14
  '\x1B[102mSuccess!\x1B[0m Total: 1',
15
15
  '\x1B[38;5;243mCompleted\x1B[0m sample/',
@@ -1,20 +1,20 @@
1
1
  import { is, run_e2e_tests } from './test.js';
2
2
 
3
3
  export async function test() {
4
- let output = await run_e2e_tests('loader_mixed');
4
+ let output = await run_e2e_tests('loader-mixed');
5
5
  is(
6
6
  output.stdout,
7
7
  [
8
8
  '\x1B[38;5;99mStarted\x1B[0m sample/',
9
9
  '\x1B[38;5;99mStarted\x1B[0m sample/unit',
10
- '!Running: sample/unit/t_test.js, path: tests/unit/t_test.js',
10
+ '!Running: sample/unit/t-test.js, path: tests/unit/t-test.js',
11
11
  '\x1B[32mOk:\x1B[0m Real!, got: real',
12
- '>sample/unit/t_test.js completed in',
12
+ '>sample/unit/t-test.js completed in',
13
13
  '\x1B[38;5;243mCompleted\x1B[0m sample/unit',
14
14
  '\x1B[38;5;99mStarted\x1B[0m sample/ui',
15
- '!Running: sample/ui/t_test.js, path: tests/ui/t_test.js',
15
+ '!Running: sample/ui/t-test.js, path: tests/ui/t-test.js',
16
16
  '\x1B[32mOk:\x1B[0m Mocked!, got: mocked',
17
- '>sample/ui/t_test.js completed in',
17
+ '>sample/ui/t-test.js completed in',
18
18
  '\x1B[38;5;243mCompleted\x1B[0m sample/ui',
19
19
  'Elapsed:',
20
20
  'Testsuite: shutdown',
@@ -1,24 +1,24 @@
1
1
  import { is, run_e2e_tests } from './test.js';
2
2
 
3
3
  export async function test() {
4
- let output = await run_e2e_tests('loader_multiple', {
5
- patterns: ['tests/base/t_btest.js', 'tests/core/t_ctest.js'],
4
+ let output = await run_e2e_tests('loader-multiple', {
5
+ patterns: ['tests/base/t-btest.js', 'tests/core/t-ctest.js'],
6
6
  });
7
7
  is(
8
8
  output.stdout,
9
9
  [
10
10
  '\x1B[38;5;99mStarted\x1B[0m sample/',
11
11
  '\x1B[38;5;99mStarted\x1B[0m sample/base',
12
- '!Running: sample/base/t_btest.js, path: tests/base/t_btest.js',
12
+ '!Running: sample/base/t-btest.js, path: tests/base/t-btest.js',
13
13
  '\x1B[32mOk:\x1B[0m Mocked!, got: mocked',
14
- '>sample/base/t_btest.js completed in',
14
+ '>sample/base/t-btest.js completed in',
15
15
  '\x1B[38;5;243mCompleted\x1B[0m sample/base',
16
16
  'Elapsed:',
17
17
  'Testsuite: shutdown',
18
18
  '\x1B[38;5;99mStarted\x1B[0m sample/core',
19
- '!Running: sample/core/t_ctest.js, path: tests/core/t_ctest.js',
19
+ '!Running: sample/core/t-ctest.js, path: tests/core/t-ctest.js',
20
20
  '\x1B[32mOk:\x1B[0m Mocked!, got: mocked',
21
- '>sample/core/t_ctest.js completed in',
21
+ '>sample/core/t-ctest.js completed in',
22
22
  '\x1B[38;5;243mCompleted\x1B[0m sample/core',
23
23
  'Elapsed:',
24
24
  'Testsuite: shutdown',