storybook-addon-module-mock
Version:
[](https://www.npmjs.com/package/storybook-addon-module-mock) [](https://www.npmjs.com/package/storybook-addon-module-mock) [ • 2.02 kB
JavaScript
/* eslint-disable @typescript-eslint/no-explicit-any */
import { fn, mocks } from 'storybook/test';
const hookFn = (hook) => {
const fnSrc = fn();
mocks.delete(fnSrc);
const func = Object.assign((...args) => {
const result = fnSrc(...args);
hook(fnSrc);
return result;
}, fnSrc);
func.bind(fnSrc);
Object.defineProperty(func, '_isMockFunction', { value: true });
Object.defineProperty(func, 'mock', {
get: () => {
return fnSrc.mock;
},
});
return func;
};
export const createMock = (module, name = 'default') => {
const moduleName = module.constructor.prototype.__moduleId__;
const funcName = name;
const fn = hookFn(() => {
fn.__module.event?.();
});
const descriptor = Object.getOwnPropertyDescriptor(module, name);
let original;
if (descriptor?.writable) {
const f = module[name];
module[name] = fn;
original = f;
fn.mockRestore = () => {
module[name] = f;
};
}
else {
throw new Error('Failed to write mock');
}
return Object.assign(fn, {
__module: { module, name },
__name: `[${moduleName ?? 'unknown'}]:${String(funcName)}`,
__original: original,
});
};
export const getOriginal = (mock) => {
return mock.__original;
};
export const getMock = (parameters, module, name = 'default') => {
const mock = parameters.moduleMock.mocks?.find((mock) => {
return mock.__module?.module === module && mock.__module?.name === name;
});
if (!mock)
throw new Error("Can't find mock");
return mock;
};
export const resetMock = (parameters) => {
parameters.moduleMock.mocks?.forEach((mock) => {
return mock.mockReset();
});
};
export const clearMock = (parameters) => {
parameters.moduleMock.mocks?.forEach((mock) => {
return mock.mockClear();
});
};
export const render = (parameters, args) => {
parameters.moduleMock.render(args);
};