123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- /**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
- /* global expect, describe, it */
- 'use strict';
- const fs = require('fs');
- const path = require('path');
- function applyTransform(module, options, input, testOptions = {}) {
- // Handle ES6 modules using default export for the transform
- const transform = module.default ? module.default : module;
- // Jest resets the module registry after each test, so we need to always get
- // a fresh copy of jscodeshift on every test run.
- let jscodeshift = require('./core');
- if (testOptions.parser || module.parser) {
- jscodeshift = jscodeshift.withParser(testOptions.parser || module.parser);
- }
- const output = transform(
- input,
- {
- jscodeshift,
- stats: () => {},
- },
- options || {}
- );
- return (output || '').trim();
- }
- exports.applyTransform = applyTransform;
- function runSnapshotTest(module, options, input) {
- const output = applyTransform(module, options, input);
- expect(output).toMatchSnapshot();
- return output;
- }
- exports.runSnapshotTest = runSnapshotTest;
- function runInlineTest(module, options, input, expectedOutput, testOptions) {
- const output = applyTransform(module, options, input, testOptions);
- expect(output).toEqual(expectedOutput.trim());
- return output;
- }
- exports.runInlineTest = runInlineTest;
- function extensionForParser(parser) {
- switch (parser) {
- case 'ts':
- case 'tsx':
- return parser;
- default:
- return 'js'
- }
- }
- /**
- * Utility function to run a jscodeshift script within a unit test. This makes
- * several assumptions about the environment:
- *
- * - `dirName` contains the name of the directory the test is located in. This
- * should normally be passed via __dirname.
- * - The test should be located in a subdirectory next to the transform itself.
- * Commonly tests are located in a directory called __tests__.
- * - `transformName` contains the filename of the transform being tested,
- * excluding the .js extension.
- * - `testFilePrefix` optionally contains the name of the file with the test
- * data. If not specified, it defaults to the same value as `transformName`.
- * This will be suffixed with ".input.js" for the input file and ".output.js"
- * for the expected output. For example, if set to "foo", we will read the
- * "foo.input.js" file, pass this to the transform, and expect its output to
- * be equal to the contents of "foo.output.js".
- * - Test data should be located in a directory called __testfixtures__
- * alongside the transform and __tests__ directory.
- */
- function runTest(dirName, transformName, options, testFilePrefix, testOptions = {}) {
- if (!testFilePrefix) {
- testFilePrefix = transformName;
- }
- const extension = extensionForParser(testOptions.parser)
- const fixtureDir = path.join(dirName, '..', '__testfixtures__');
- const inputPath = path.join(fixtureDir, testFilePrefix + `.input.${extension}`);
- const source = fs.readFileSync(inputPath, 'utf8');
- const expectedOutput = fs.readFileSync(
- path.join(fixtureDir, testFilePrefix + `.output.${extension}`),
- 'utf8'
- );
- // Assumes transform is one level up from __tests__ directory
- const module = require(path.join(dirName, '..', transformName));
- runInlineTest(module, options, {
- path: inputPath,
- source
- }, expectedOutput, testOptions);
- }
- exports.runTest = runTest;
- /**
- * Handles some boilerplate around defining a simple jest/Jasmine test for a
- * jscodeshift transform.
- */
- function defineTest(dirName, transformName, options, testFilePrefix, testOptions) {
- const testName = testFilePrefix
- ? `transforms correctly using "${testFilePrefix}" data`
- : 'transforms correctly';
- describe(transformName, () => {
- it(testName, () => {
- runTest(dirName, transformName, options, testFilePrefix, testOptions);
- });
- });
- }
- exports.defineTest = defineTest;
- function defineInlineTest(module, options, input, expectedOutput, testName) {
- it(testName || 'transforms correctly', () => {
- runInlineTest(module, options, {
- source: input
- }, expectedOutput);
- });
- }
- exports.defineInlineTest = defineInlineTest;
- function defineSnapshotTest(module, options, input, testName) {
- it(testName || 'transforms correctly', () => {
- runSnapshotTest(module, options, {
- source: input
- });
- });
- }
- exports.defineSnapshotTest = defineSnapshotTest;
|