Make production tests always run against dist/ (attempt 2) (#2942)

* Make production tests always run against dist/

* Try to mock process.stdin instead of get-stream

* fix: mock `get-stream` from `index.js`

* refactor: remove unnecessary variable

* Try `transform: {}` in jest.config.js

* Add comment explaining the unusual get-stream mocking
master
Simon Lydell 2017-10-02 17:58:55 +02:00 committed by GitHub
parent 26254ece0f
commit 43cb08c45c
10 changed files with 47 additions and 27 deletions

View File

@ -11,6 +11,7 @@ const parser = require("./src/parser");
const printDocToDebug = require("./src/doc-debug").printDocToDebug;
const config = require("./src/resolve-config");
const docblock = require("jest-docblock");
const getStream = require("get-stream");
function guessLineEnding(text) {
const index = text.indexOf("\n");
@ -353,6 +354,7 @@ module.exports = {
/* istanbul ignore next */
__debug: {
getStream,
parse: function(text, opts) {
return parser.parse(text, opts);
},

View File

@ -13,5 +13,6 @@ module.exports = {
"<rootDir>/src/doc-debug.js",
"<rootDir>/src/clean-ast.js",
"<rootDir>/src/deprecated.js"
]
],
transform: {}
};

View File

@ -4,7 +4,6 @@ const path = require("path");
const camelCase = require("camelcase");
const dashify = require("dashify");
const minimist = require("minimist");
const getStream = require("get-stream");
const fs = require("fs");
const globby = require("globby");
const ignore = require("ignore");
@ -208,7 +207,7 @@ function applyConfigPrecedence(argv, options) {
}
function formatStdin(argv) {
getStream(process.stdin).then(input => {
prettier.__debug.getStream(process.stdin).then(input => {
const filepath = argv["stdin-filepath"]
? path.resolve(process.cwd(), argv["stdin-filepath"])
: process.cwd();

View File

@ -1,4 +1,4 @@
const prettier = require("../..");
const prettier = require("../../tests_config/require_prettier");
test("translates cursor correctly in basic case", () => {
expect(prettier.formatWithCursor(" 1", { cursorOffset: 2 })).toEqual({

View File

@ -0,0 +1,6 @@
"use strict";
const isProduction = process.env.NODE_ENV === "production";
const prettier = require(isProduction ? "../dist/" : "../");
module.exports = prettier;

View File

@ -1,9 +1,8 @@
"use strict";
const isProduction = process.env.NODE_ENV === "production";
const fs = require("fs");
const extname = require("path").extname;
const prettier = require(isProduction ? "../dist/" : "../");
const prettier = require("./require_prettier");
const parser = require("../src/parser");
const massageAST = require("../src/clean-ast.js").massageAST;

View File

@ -3,7 +3,7 @@
const path = require("path");
const runPrettier = require("../runPrettier");
const prettier = require("../../");
const prettier = require("../../tests_config/require_prettier");
expect.addSnapshotSerializer(require("../path-serializer"));

View File

@ -1,6 +1,6 @@
"use strict";
const prettier = require("../..");
const prettier = require("../../tests_config/require_prettier");
const runPrettier = require("../runPrettier");
const constant = require("../../src/cli-constant");

View File

@ -1,6 +1,6 @@
"use strict";
const prettier = require("../..");
const prettier = require("../../tests_config/require_prettier");
const runPrettier = require("../runPrettier");
test("allows custom parser provided as object", () => {

View File

@ -3,6 +3,10 @@
const fs = require("fs");
const path = require("path");
const isProduction = process.env.NODE_ENV === "production";
const prettierApi = isProduction ? "../dist/index" : "../index";
const prettierCli = isProduction ? "../dist/bin/prettier" : "../bin/prettier";
function runPrettier(dir, args, options) {
args = args || [];
options = options || {};
@ -11,32 +15,35 @@ function runPrettier(dir, args, options) {
let stdout = "";
let stderr = "";
const spiedProcessExit = jest.spyOn(process, "exit");
spiedProcessExit.mockImplementation(exitCode => {
jest.spyOn(process, "exit").mockImplementation(exitCode => {
if (status === undefined) {
status = exitCode || 0;
}
});
const spiedStdoutWrite = jest.spyOn(process.stdout, "write");
spiedStdoutWrite.mockImplementation(text => appendStdout(text));
jest
.spyOn(process.stdout, "write")
.mockImplementation(text => appendStdout(text));
const spiedStderrWrite = jest.spyOn(process.stderr, "write");
spiedStderrWrite.mockImplementation(text => appendStderr(text));
jest
.spyOn(process.stderr, "write")
.mockImplementation(text => appendStderr(text));
const spiedConsoleLog = jest.spyOn(console, "log");
spiedConsoleLog.mockImplementation(text => appendStdout(text + "\n"));
jest
.spyOn(console, "log")
.mockImplementation(text => appendStdout(text + "\n"));
const spiedConsoleWarn = jest.spyOn(console, "warn");
spiedConsoleWarn.mockImplementation(text => appendStderr(text + "\n"));
jest
.spyOn(console, "warn")
.mockImplementation(text => appendStderr(text + "\n"));
const spiedConsoleError = jest.spyOn(console, "error");
spiedConsoleError.mockImplementation(text => appendStderr(text + "\n"));
jest
.spyOn(console, "error")
.mockImplementation(text => appendStderr(text + "\n"));
const write = [];
const spiedFsWriteFileSync = jest.spyOn(fs, "writeFileSync");
spiedFsWriteFileSync.mockImplementation((filename, content) => {
jest.spyOn(fs, "writeFileSync").mockImplementation((filename, content) => {
write.push({ filename, content });
});
@ -50,12 +57,18 @@ function runPrettier(dir, args, options) {
process.argv = ["path/to/node", "path/to/prettier/bin"].concat(args);
jest.resetModules();
jest.setMock("get-stream", () => ({
then: handler => handler(options.input || "")
}));
// We cannot use `jest.setMock("get-stream", impl)` here, because in the
// production build everything is bundled into one file so there is no
// "get-stream" module to mock.
jest
.spyOn(require(prettierApi).__debug, "getStream")
.mockImplementation(() => ({
then: handler => handler(options.input || "")
}));
try {
require("../bin/prettier");
require(prettierCli);
status = (status === undefined ? process.exitCode : status) || 0;
} catch (error) {
status = 1;