@storybook/react-native
Version:
A better way to develop React Native Components for your app
137 lines (116 loc) • 4.62 kB
JavaScript
const { describe, it, beforeEach, mock } = require('node:test');
const assert = require('node:assert');
const path = require('node:path');
const { generate } = require('./generate');
let pathMock;
let fileContentMock;
global.window = { navigator: {} };
const mockFs = {
writeFileSync: (filePath, fileContent, opts) => {
pathMock = filePath;
fileContentMock = fileContent;
},
};
describe('loader', () => {
beforeEach(() => {
pathMock = undefined;
fileContentMock = undefined;
});
describe('writeRequires', () => {
describe('when there is a story glob', () => {
it('writes the story imports', async (t) => {
mock.method(require('fs'), 'writeFileSync', mockFs.writeFileSync);
await generate({ configPath: 'scripts/mocks/all-config-files' });
mock.reset();
assert.strictEqual(
pathMock,
path.resolve(__dirname, 'mocks/all-config-files/storybook.requires.ts')
);
t.assert.snapshot(fileContentMock);
});
});
describe('when using js', () => {
it('writes the story imports without types', async (t) => {
mock.method(require('fs'), 'writeFileSync', mockFs.writeFileSync);
await generate({ configPath: 'scripts/mocks/all-config-files', useJs: true });
mock.reset();
assert.strictEqual(
pathMock,
path.resolve(__dirname, 'mocks/all-config-files/storybook.requires.js')
);
t.assert.snapshot(fileContentMock);
});
});
describe('when there are different file extensions', () => {
it('writes the story imports', async (t) => {
mock.method(require('fs'), 'writeFileSync', mockFs.writeFileSync);
await generate({ configPath: 'scripts/mocks/file-extensions' });
mock.reset();
assert.strictEqual(
pathMock,
path.resolve(__dirname, 'mocks/file-extensions/storybook.requires.ts')
);
t.assert.snapshot(fileContentMock);
});
});
// TODO can we support exclude globs?
// describe('when there is a story glob and exclude paths globs', () => {
// it('writes the story imports', () => {
// generate({ configPath: 'scripts/mocks/exclude-config-files' });
// assert.strictEqual(
// pathMock,
// path.resolve(__dirname, 'mocks/exclude-config-files/storybook.requires.ts')
// );
// assert.ok(fileContentMock.includes('include-components/FakeStory.stories.tsx'));
// assert.ok(!fileContentMock.includes('exclude-components/FakeStory.stories.tsx'));
// t.assert.snapshot(fileContentMock);
// });
// });
describe('when there is no story glob or addons', () => {
it('throws an error', async () => {
mock.method(require('fs'), 'writeFileSync', mockFs.writeFileSync);
await assert.rejects(
async () => await generate({ configPath: 'scripts/mocks/blank-config' }),
Error
);
mock.reset();
});
});
describe('when there is no preview', () => {
it('does not add preview related stuff', async (t) => {
mock.method(require('fs'), 'writeFileSync', mockFs.writeFileSync);
await generate({ configPath: 'scripts/mocks/no-preview' });
mock.reset();
assert.strictEqual(
pathMock,
path.resolve(__dirname, 'mocks/no-preview/storybook.requires.ts')
);
t.assert.snapshot(fileContentMock);
});
});
// TODO does this still make sense?
// describe('when the absolute option is true', () => {
// it('should write absolute paths to the requires file', () => {
// generate({ configPath: 'scripts/mocks/all-config-files', absolute: true });
// assert.strictEqual(
// pathMock,
// path.resolve(__dirname, 'mocks/all-config-files/storybook.requires.ts')
// );
// // assert.ok(fileContentMock.includes(`FakeStory.stories.tsx`));
// assert.ok(fileContentMock.includes(path.resolve(__dirname, 'mocks/all-config-files')));
// });
// });
describe('when there is a configuration object', () => {
it('writes the story imports', async (t) => {
mock.method(require('fs'), 'writeFileSync', mockFs.writeFileSync);
await generate({ configPath: 'scripts/mocks/configuration-objects' });
mock.reset();
assert.strictEqual(
pathMock,
path.resolve(__dirname, 'mocks/configuration-objects/storybook.requires.ts')
);
t.assert.snapshot(fileContentMock);
});
});
});
});