@jsenv/snapshot 2.6.11 → 2.7.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/snapshot",
3
- "version": "2.6.11",
3
+ "version": "2.7.1",
4
4
  "description": "Snapshot testing",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -21,7 +21,7 @@ export const replaceFluctuatingValues = (
21
21
  stringType,
22
22
  rootDirectoryUrl,
23
23
  fileUrl,
24
- removeAnsi = true,
24
+ preserveAnsi,
25
25
  // for unit test
26
26
  replaceFilesystemWellKnownValues = createReplaceFilesystemWellKnownValues({
27
27
  rootDirectoryUrl,
@@ -51,7 +51,7 @@ export const replaceFluctuatingValues = (
51
51
  if (stringType === "filesystem") {
52
52
  return replaceFilesystemWellKnownValues(value);
53
53
  }
54
- if (removeAnsi) {
54
+ if (!preserveAnsi) {
55
55
  value = stripAnsi(value);
56
56
  }
57
57
  value = replaceFilesystemWellKnownValues(value, {
@@ -37,6 +37,10 @@ export const spyFilesystemCalls = (
37
37
  const fileDescriptorPathMap = new Map();
38
38
  const fileRestoreMap = new Map();
39
39
  const onWriteFileDone = (fileUrl, stateBefore, stateAfter) => {
40
+ if (!stateAfter.found) {
41
+ // seems to be possible somehow
42
+ return;
43
+ }
40
44
  // we use same type because we don't want to differentiate between
41
45
  // - writing file for the 1st time
42
46
  // - updating file content
@@ -29,6 +29,9 @@ export const hookIntoMethod = (
29
29
  const callHooks = (hookCallbackSet, ...args) => {
30
30
  hookExecuting = true;
31
31
  for (const hookCallback of hookCallbackSet) {
32
+ if (!hookCallback.initCallback.installed) {
33
+ continue;
34
+ }
32
35
  hookCallback(...args);
33
36
  }
34
37
  hookExecuting = false;
@@ -62,15 +65,19 @@ export const hookIntoMethod = (
62
65
  allWantsToPreventOriginalCall = false;
63
66
  }
64
67
  if (hooks.returnPromise) {
68
+ hooks.returnPromise.initCallback = initCallback;
65
69
  returnPromiseCallbackSet.add(hooks.returnPromise);
66
70
  }
67
71
  if (hooks.return) {
72
+ hooks.return.initCallback = initCallback;
68
73
  returnCallbackSet.add(hooks.return);
69
74
  }
70
75
  if (hooks.catch) {
76
+ hooks.catch.initCallback = initCallback;
71
77
  catchCallbackSet.add(hooks.catch);
72
78
  }
73
79
  if (hooks.finally) {
80
+ hooks.finally.initCallback = initCallback;
74
81
  finallyCallbackSet.add(hooks.catch);
75
82
  }
76
83
  }
@@ -124,6 +131,7 @@ export const hookIntoMethod = (
124
131
  };
125
132
  object[method] = proxy;
126
133
  }
134
+ initCallback.installed = true;
127
135
  addInitCallback(initCallback);
128
136
  const hook = {
129
137
  disable: () => {
@@ -133,6 +141,7 @@ export const hookIntoMethod = (
133
141
  initCallback.disabled = false;
134
142
  },
135
143
  remove: () => {
144
+ initCallback.installed = false;
136
145
  removeInitCallback(initCallback);
137
146
  },
138
147
  };
@@ -220,7 +229,9 @@ export const METHOD_EXECUTION_NODE_CALLBACK = ({
220
229
  // useless because are a copy of the args
221
230
  // so the mutation we do above ( args[lastArgIndex] =)
222
231
  // cannot be important for the method being proxied
223
- args[lastArgIndex] = lastArg;
232
+ if (args[lastArgIndex] === callbackProxy) {
233
+ args[lastArgIndex] = lastArg;
234
+ }
224
235
  };
225
236
  });
226
237
  }
@@ -230,7 +241,9 @@ export const METHOD_EXECUTION_NODE_CALLBACK = ({
230
241
  return installProxyAndCall(originalCallback, (callbackProxy) => {
231
242
  lastArg.context.callback = callbackProxy;
232
243
  return () => {
233
- lastArg.context.callback = originalCallback;
244
+ if (lastArg.context.callback === callbackProxy) {
245
+ lastArg.context.callback = originalCallback;
246
+ }
234
247
  };
235
248
  });
236
249
  }
@@ -239,7 +252,9 @@ export const METHOD_EXECUTION_NODE_CALLBACK = ({
239
252
  return installProxyAndCall(originalCallback, (callbackProxy) => {
240
253
  lastArg.oncomplete = callbackProxy;
241
254
  return () => {
242
- lastArg.oncomplete = originalCallback;
255
+ if (lastArg.oncomplete === callbackProxy) {
256
+ lastArg.oncomplete = originalCallback;
257
+ }
243
258
  };
244
259
  });
245
260
  }
@@ -246,6 +246,7 @@ const renderText = (
246
246
  typeof value.stack === "string")
247
247
  ) {
248
248
  onRenderError();
249
+ // return renderMarkdownBlock(text.value.stack);
249
250
  const exception = createException(text.value, { rootDirectoryUrl });
250
251
  const exceptionText = errorStackHidden
251
252
  ? `${exception.name}: ${exception.message}`
@@ -306,24 +307,36 @@ const renderPotentialAnsi = (
306
307
  string,
307
308
  { stringType, sideEffect, sideEffectFileUrl, generateOutFileUrl, replace },
308
309
  ) => {
310
+ const rawTextBlock = renderMarkdownBlock(
311
+ replace(string, { stringType }),
312
+ "console",
313
+ );
309
314
  // for assert we want ideally hummm
310
315
  // colored in details block?
311
316
  const includesAnsi = ansiRegex().test(string);
312
317
  if (!includesAnsi) {
313
- return renderMarkdownBlock(replace(string, { stringType }), "console");
318
+ return rawTextBlock;
314
319
  }
315
320
  const svgFilename = `${sideEffect.code}${sideEffect.counter ? `_${sideEffect.counter}` : ""}.svg`;
316
321
  const svgFileUrl = generateOutFileUrl(svgFilename);
317
- let svgFileContent = renderTerminalSvg(string, {
318
- head: false,
319
- paddingTop: 10,
320
- paddingBottom: 10,
321
- });
322
+ let svgFileContent = renderTerminalSvg(
323
+ replace(string, { stringType: "console", preserveAnsi: true }),
324
+ {
325
+ head: false,
326
+ paddingTop: 10,
327
+ paddingBottom: 10,
328
+ },
329
+ );
322
330
  svgFileContent = replace(svgFileContent, { fileUrl: svgFileUrl });
323
331
  writeFileSync(svgFileUrl, svgFileContent);
324
332
  const svgFileRelativeUrl = urlToRelativeUrl(svgFileUrl, sideEffectFileUrl);
325
- return `![img](${svgFileRelativeUrl})`;
326
- // we will write a svg file
333
+ let md = `![img](${svgFileRelativeUrl})`;
334
+ md += "\n\n";
335
+ md += renderMarkdownDetails(`${rawTextBlock}`, {
336
+ summary: "see without style",
337
+ });
338
+ md += "\n";
339
+ return md;
327
340
  };
328
341
 
329
342
  export const renderFileContent = (text, { sideEffect, replace }) => {
@@ -11,21 +11,21 @@ export const snapshotSideEffects = (
11
11
  fn,
12
12
  {
13
13
  sideEffectFileUrl,
14
- sideEffectFilePattern = "./output/[basename].md",
15
- outDirectoryPattern = "./output/[basename]/",
16
- outFilePattern = "./output/[basename]/[filename]",
14
+ outDirectoryPattern = "./side_effects/",
15
+ sideEffectFilePattern = "./side_effects/[basename].md",
16
+ outFilePattern = "./side_effects/[name]/[filename]",
17
17
  generateOutFileUrl,
18
18
  outDirectoryUrl,
19
19
  errorStackHidden,
20
20
  ...captureOptions
21
21
  } = {},
22
22
  ) => {
23
- const basename = urlToBasename(sourceFileUrl, true);
23
+ const name = urlToBasename(sourceFileUrl, true);
24
+ const basename = urlToBasename(sourceFileUrl);
24
25
  if (sideEffectFileUrl === undefined) {
25
- const sideEffectFileRelativeUrl = sideEffectFilePattern.replaceAll(
26
- "[basename]",
27
- basename,
28
- );
26
+ const sideEffectFileRelativeUrl = sideEffectFilePattern
27
+ .replaceAll("[basename]", basename)
28
+ .replaceAll("[name]", name);
29
29
  sideEffectFileUrl = new URL(sideEffectFileRelativeUrl, sourceFileUrl);
30
30
  } else {
31
31
  sideEffectFileUrl = new URL(sideEffectFileUrl, sourceFileUrl);
@@ -42,6 +42,7 @@ export const snapshotSideEffects = (
42
42
  if (generateOutFileUrl === undefined) {
43
43
  generateOutFileUrl = (filename) => {
44
44
  const outRelativeUrl = outFilePattern
45
+ .replaceAll("[name]", name)
45
46
  .replaceAll("[basename]", basename)
46
47
  .replaceAll("[filename]", filename);
47
48
  const outFileUrl = new URL(outRelativeUrl, new URL("./", sourceFileUrl))
@@ -1,4 +1,4 @@
1
- import { urlToBasename, urlToFilename, urlToRelativeUrl } from "@jsenv/urls";
1
+ import { urlToBasename, urlToRelativeUrl } from "@jsenv/urls";
2
2
  import {
3
3
  takeDirectorySnapshot,
4
4
  takeFileSnapshot,
@@ -22,9 +22,9 @@ export const snapshotTests = async (
22
22
  {
23
23
  testName = urlToBasename(testFileUrl, true),
24
24
  sideEffectFileUrl,
25
- sideEffectFilePattern = "./output/[test_name]/[test_name].md",
26
- outDirectoryPattern = "./output/[test_name]/",
27
- outFilePattern = "./output/[test_name]/[test_scenario]_[filename]",
25
+ outDirectoryPattern = "./side_effects/",
26
+ sideEffectFilePattern = "./side_effects/[test_basename].md",
27
+ outFilePattern = "./side_effects/[test_name]/[test_scenario]/[filename]",
28
28
  rootDirectoryUrl,
29
29
  generatedBy = true,
30
30
  linkToSource = true,
@@ -35,11 +35,11 @@ export const snapshotTests = async (
35
35
  throwWhenDiff = process.env.CI,
36
36
  } = {},
37
37
  ) => {
38
+ const testBasename = urlToBasename(testFileUrl);
38
39
  if (sideEffectFileUrl === undefined) {
39
- const sideEffectFileRelativeUrl = sideEffectFilePattern.replaceAll(
40
- "[test_name]",
41
- testName,
42
- );
40
+ const sideEffectFileRelativeUrl = sideEffectFilePattern
41
+ .replaceAll("[test_name]", testName)
42
+ .replaceAll("[test_basename]", testBasename);
43
43
  sideEffectFileUrl = new URL(sideEffectFileRelativeUrl, testFileUrl);
44
44
  } else {
45
45
  sideEffectFileUrl = new URL(sideEffectFileUrl, testFileUrl);
@@ -62,7 +62,7 @@ export const snapshotTests = async (
62
62
  filesystemEffects,
63
63
  });
64
64
  let markdown = "";
65
- markdown += `# ${urlToFilename(sideEffectFileUrl)}`;
65
+ markdown += `# ${testName}`;
66
66
  if (generatedBy) {
67
67
  let generatedByLink = renderSmallLink(
68
68
  {
@@ -103,6 +103,7 @@ export const snapshotTests = async (
103
103
  const generateOutFileUrl = (filename) => {
104
104
  const outFileRelativeUrl = outFilePattern
105
105
  .replaceAll("[test_name]", testName)
106
+ .replaceAll("[test_basename]", testBasename)
106
107
  .replaceAll("[test_scenario]", testScenario)
107
108
  .replaceAll("[filename]", filename);
108
109
  const outFileUrl = new URL(outFileRelativeUrl, testFileUrl).href;