UNPKG

react-native-web-headroom

Version:
278 lines (234 loc) 7.93 kB
/* * Copyright (c) 2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ /*global jasmine, describe, it, expect, afterEach*/ // NOTE: This test spawns a subprocesses that load the files from dist/, not // src/. Before running this test run `npm run build` or `npm run watch`. const TEST_TIMEOUT = 120000; jasmine.DEFAULT_TIMEOUT_INTERVAL = TEST_TIMEOUT; var fs = require('fs'); var path = require('path'); var rimraf = require('rimraf'); var temp = require('temp'); var spawn = require('cross-spawn'); function run(args, stdin) { return new Promise(resolve => { var docgen = spawn( // eslint-disable-line camelcase path.join(__dirname, '../react-docgen.js'), args ); var stdout = ''; var stderr = ''; docgen.stdout.on('data', data => stdout += data); docgen.stderr.on('data', data => stderr += data); docgen.on('close', () => resolve([stdout, stderr])); docgen.on('error', (e) => { throw e; }); if (stdin) { docgen.stdin.write(stdin); } docgen.stdin.end(); }); } var component = fs.readFileSync( path.join(__dirname, '../../example/components/Component.js') ); describe('react-docgen CLI', () => { var tempDir; var tempComponents = []; var tempNoComponents = []; function createTempfiles(suffix, dir) { if (!tempDir) { tempDir = temp.mkdirSync(); } if (!dir) { dir = tempDir; } else { dir = path.join(tempDir, dir); try { fs.mkdirSync(dir); } catch(error) { if (error.message.indexOf('EEXIST') === -1) { throw error; } } } if (!suffix) { suffix = 'js'; } var componentPath = path.join(dir, 'Component.' + suffix); var componentFile = fs.openSync(componentPath, 'w'); fs.writeSync(componentFile, component.toString()); fs.closeSync(componentFile); var noComponentPath = path.join(dir, 'NoComponent.' + suffix); var noComponentFile = fs.openSync(noComponentPath, 'w'); fs.writeSync(noComponentFile, '{}'); fs.closeSync(noComponentFile); tempComponents.push(componentPath); tempNoComponents.push(noComponentPath); return dir; } afterEach(() => { if (tempDir) { rimraf.sync(tempDir); } tempDir = null; tempComponents = []; tempNoComponents = []; }); it('reads from stdin', () => { return run([], component).then(([stdout, stderr]) => { expect(stdout).not.toBe(''); expect(stderr).toBe(''); }); }, TEST_TIMEOUT); it('reads files provided as command line arguments', () => { createTempfiles(); return run(tempComponents.concat(tempNoComponents)).then( ([stdout, stderr]) => { expect(stdout).toContain('Component'); expect(stderr).toContain('NoComponent'); } ); }, TEST_TIMEOUT); it('reads directories provided as command line arguments', () => { createTempfiles(); return run([tempDir]).then(([stdout, stderr]) => { expect(stdout).toContain('Component'); expect(stderr).toContain('NoComponent'); }); }, TEST_TIMEOUT); it('considers js and jsx by default', () => { createTempfiles(); createTempfiles('jsx'); createTempfiles('foo'); return run([tempDir]).then(([stdout, stderr]) => { expect(stdout).toContain('Component.js'); expect(stdout).toContain('Component.jsx'); expect(stdout).not.toContain('Component.foo'); expect(stderr).toContain('NoComponent.js'); expect(stderr).toContain('NoComponent.jsx'); expect(stderr).not.toContain('NoComponent.foo'); }); }, TEST_TIMEOUT); it('considers files with the specified extension', () => { createTempfiles('foo'); createTempfiles('bar'); var verify = ([stdout, stderr]) => { expect(stdout).toContain('Component.foo'); expect(stdout).toContain('Component.bar'); expect(stderr).toContain('NoComponent.foo'); expect(stderr).toContain('NoComponent.bar'); }; return Promise.all([ run(['--extension=foo', '--extension=bar', tempDir]).then(verify), run(['-x', 'foo', '-x', 'bar', tempDir]).then(verify), ]); }, TEST_TIMEOUT); it('ignores files in node_modules, __tests__ and __mocks__ by default', () => { createTempfiles(null, 'node_modules'); createTempfiles(null, '__tests__'); createTempfiles(null, '__mocks__'); return run([tempDir]).then(([stdout, stderr]) => { expect(stdout).toBe(''); expect(stderr).toBe(''); }); }, TEST_TIMEOUT); it('ignores specified folders', () => { createTempfiles(null, 'foo'); var verify = ([stdout, stderr]) => { expect(stdout).toBe(''); expect(stderr).toBe(''); }; return Promise.all([ run(['--ignore=foo', tempDir]).then(verify), run(['-i', 'foo', tempDir]).then(verify), ]); }, TEST_TIMEOUT); it('writes to stdout', () => { return run([], component).then(([stdout, stderr]) => { expect(stdout.length > 0).toBe(true); expect(stderr.length).toBe(0); }); }, TEST_TIMEOUT); it('writes to stderr', () => { return run([], '{}').then(([stdout, stderr]) => { expect(stderr.length > 0).toBe(true); expect(stdout.length).toBe(0); }); }, TEST_TIMEOUT); it('writes to a file if provided', () => { var outFile = temp.openSync(); createTempfiles(); var verify = ([stdout]) => { expect(fs.readFileSync(outFile.path)).not.toBe(''); expect(stdout).toBe(''); }; return Promise.all([ run(['--out=' + outFile.path, tempDir]).then(verify), run(['-o', outFile.path, tempDir]).then(verify), ]); }, TEST_TIMEOUT); describe('--resolver', () => { it('accepts the names of built in resolvers', () => { return Promise.all([ // No option passed: same as --resolver=findExportedComponentDefinition run([ path.join(__dirname, '../../example/components/Component.js'), ]).then(([stdout]) => { expect(stdout).toContain('Component'); }), run([ '--resolver=findExportedComponentDefinition', path.join(__dirname, '../../example/components/Component.js'), ]).then(([stdout]) => { expect(stdout).toContain('Component'); }), run([ '--resolver=findAllComponentDefinitions', path.join(__dirname, './example/MultipleComponents.js'), ]).then(([stdout]) => { expect(stdout).toContain('ComponentA'); expect(stdout).toContain('ComponentB'); }), ]); }, TEST_TIMEOUT); it('accepts a path to a resolver function', () => { return Promise.all([ run([ '--resolver='+path.join(__dirname, './example/customResolver.js'), path.join(__dirname, '../../example/components/Component.js'), ]).then(([stdout]) => { expect(stdout).toContain('Custom'); }), ]); }, TEST_TIMEOUT); }); describe('--exclude/-e', () => { it('ignores files by name', () => { createTempfiles(null, 'foo'); createTempfiles(null, 'bar'); var verify = ([stdout, stderr]) => { expect(stdout).toBe(''); expect(stderr).toBe(''); }; return run( ['--exclude=Component.js', '--exclude=NoComponent.js', tempDir] ).then(verify); }, TEST_TIMEOUT); it('ignores files by regex', () => { createTempfiles(null, 'foo'); createTempfiles(null, 'bar'); var verify = ([stdout, stderr]) => { expect(stdout).toBe(''); expect(stderr).toBe(''); }; return run(['--exclude=/.*Component\\.js/', tempDir]).then(verify); }, TEST_TIMEOUT); }); });