Skip to content

Commit 1f8f414

Browse files
author
Josh Goldberg
authored
Stubbed out and tested createNewConfiguration (#24)
1 parent df0faf8 commit 1f8f414

File tree

6 files changed

+145
-53
lines changed

6 files changed

+145
-53
lines changed

.gitignore

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,3 @@
55
coverage/
66
node_modules/
77
src/**/*.js
8-
9-
# https://github.com/JoshuaKGoldberg/tslint-to-eslint-config/issues/9
10-
.eslintrc.json

src/cli/main.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { EOL } from "os";
44
import { promisify } from "util";
55

66
import { convertConfig } from "../convertConfig";
7+
import { createNewConfiguration } from "../creation/createNewConfiguration";
78
import { findTslintRules } from "../input/findTslintRules";
89
import { TSLintToESLintSettings } from "../types";
910
import { runCli } from "./runCli";
@@ -23,7 +24,14 @@ const fileExists = (filePath: string) => Promise.resolve(fs.existsSync(filePath)
2324

2425
const runtime = {
2526
convertConfig: (settings: TSLintToESLintSettings) =>
26-
convertConfig(settings, logger, ruleFinder, fileExists),
27+
convertConfig({
28+
createNewConfiguration: configConversionResults =>
29+
createNewConfiguration(configConversionResults, fs.promises.writeFile),
30+
fileExists,
31+
logger,
32+
ruleFinder,
33+
settings,
34+
}),
2735
logger,
2836
ruleFinder,
2937
};

src/convertConfig.test.ts

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,66 +2,72 @@ import { createStubLogger } from "./stubs";
22
import { convertConfig } from "./convertConfig";
33
import { ResultStatus } from "./types";
44

5+
const defaultRequest = {
6+
settings: {},
7+
logger: createStubLogger(),
8+
ruleFinder: jest.fn().mockReturnValue(Promise.resolve(new Error())),
9+
fileExists: jest.fn().mockReturnValue(Promise.resolve(true)),
10+
createNewConfiguration: jest.fn().mockReturnValue(Promise.resolve()),
11+
};
12+
513
describe("convertConfig", () => {
614
it("complains when the provided config file does not exist", async () => {
715
// Arrange
8-
const settings = {
9-
config: "./stub/tslint.json",
16+
const request = {
17+
...defaultRequest,
18+
fileExists: jest.fn().mockReturnValue(Promise.resolve(false)),
1019
};
11-
const logger = createStubLogger();
12-
const ruleFinder = jest.fn().mockReturnValue(Promise.resolve(new Error()));
13-
const fileExists = jest.fn().mockReturnValue(Promise.resolve(false));
1420

1521
// Act
16-
const result = await convertConfig(settings, logger, ruleFinder, fileExists);
22+
const result = await convertConfig(request);
1723

1824
// Assert
1925
expect(result).toEqual({
20-
complaint: `${settings.config} does not seem to exist.`,
26+
complaint: `./tslint.json does not seem to exist.`,
2127
status: ResultStatus.ConfigurationError,
2228
});
2329
});
2430

2531
it("searches for settings.config when settings.config is provided", async () => {
2632
// Arrange
27-
const settings = {
28-
config: "./stub/tslint.json",
33+
const request = {
34+
...defaultRequest,
35+
settings: {
36+
config: "./stub/tslint.json",
37+
},
2938
};
30-
const logger = createStubLogger();
31-
const ruleFinder = jest.fn().mockReturnValue(Promise.resolve(new Error()));
32-
const fileExists = jest.fn().mockReturnValue(Promise.resolve(true));
3339

3440
// Act
35-
await convertConfig(settings, logger, ruleFinder, fileExists);
41+
await convertConfig(request);
3642

3743
// Assert
38-
expect(ruleFinder).toHaveBeenLastCalledWith(settings.config);
44+
expect(request.ruleFinder).toHaveBeenLastCalledWith(request.settings.config);
3945
});
4046

4147
it("searches for ./tslint.json by default when no settings.config is provided", async () => {
4248
// Arrange
43-
const settings = {};
44-
const logger = createStubLogger();
45-
const ruleFinder = jest.fn().mockReturnValue(Promise.resolve(new Error()));
46-
const fileExists = jest.fn().mockReturnValue(Promise.resolve(true));
49+
const request = {
50+
...defaultRequest,
51+
settings: {},
52+
};
4753

4854
// Act
49-
await convertConfig(settings, logger, ruleFinder, fileExists);
55+
await convertConfig(request);
5056

5157
// Assert
52-
expect(ruleFinder).toHaveBeenLastCalledWith("./tslint.json");
58+
expect(request.ruleFinder).toHaveBeenLastCalledWith("./tslint.json");
5359
});
5460

5561
it("returns a failure result when ruleFinder returns an error", async () => {
5662
// Arrange
57-
const settings = {};
58-
const logger = createStubLogger();
5963
const error = new Error("oh no");
60-
const ruleFinder = jest.fn().mockReturnValue(Promise.resolve(error));
61-
const fileExists = jest.fn().mockReturnValue(Promise.resolve(true));
64+
const request = {
65+
...defaultRequest,
66+
ruleFinder: jest.fn().mockReturnValue(Promise.resolve(error)),
67+
};
6268

6369
// Act
64-
const result = await convertConfig(settings, logger, ruleFinder, fileExists);
70+
const result = await convertConfig(request);
6571

6672
// Assert
6773
expect(result).toEqual({
@@ -72,20 +78,20 @@ describe("convertConfig", () => {
7278

7379
it("creates a new configuration when ruleFinder returns rules", async () => {
7480
// Arrange
75-
const settings = {};
76-
const logger = createStubLogger();
77-
const ruleFinder = jest.fn().mockReturnValue({
78-
rules: {
79-
"sample-rule": {
80-
ruleArguments: ["one", "two"],
81-
ruleName: "sample-rule",
81+
const request = {
82+
...defaultRequest,
83+
ruleFinder: jest.fn().mockReturnValue({
84+
rules: {
85+
"sample-rule": {
86+
ruleArguments: ["one", "two"],
87+
ruleName: "sample-rule",
88+
},
8289
},
83-
},
84-
});
85-
const fileExists = jest.fn().mockReturnValue(Promise.resolve(true));
90+
}),
91+
};
8692

8793
// Act
88-
const result = await convertConfig(settings, logger, ruleFinder, fileExists);
94+
const result = await convertConfig(request);
8995

9096
// Assert
9197
expect(result).toEqual({

src/convertConfig.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
1-
import { createNewConfiguration } from "./creation/createNewConfiguration";
21
import { FoundTSLintRules } from "./input/findTslintRules";
32
import { ProcessLogger } from "./logger";
43
import { reportConversionResults } from "./reportConversionResults";
5-
import { convertRules } from "./rules/convertRules";
4+
import { convertRules, ConfigConversionResults } from "./rules/convertRules";
65
import { converters } from "./rules/converters";
76
import { TSLintToESLintSettings, TSLintToESLintResult, ResultStatus } from "./types";
87

9-
export type RuleFinder = (config: string) => Promise<FoundTSLintRules | Error>;
8+
export type CreateNewConfiguration = (conversionResults: ConfigConversionResults) => Promise<void>;
109

1110
export type FileExists = (filePath: string) => Promise<boolean>;
1211

13-
export const convertConfig = async (
14-
settings: TSLintToESLintSettings,
15-
logger: ProcessLogger,
16-
ruleFinder: RuleFinder,
17-
fileExists: FileExists,
18-
): Promise<TSLintToESLintResult> => {
12+
export type RuleFinder = (config: string) => Promise<FoundTSLintRules | Error>;
13+
14+
export type ConvertConfigRequest = {
15+
createNewConfiguration: CreateNewConfiguration;
16+
fileExists: FileExists;
17+
logger: ProcessLogger;
18+
ruleFinder: RuleFinder;
19+
settings: TSLintToESLintSettings;
20+
};
21+
22+
export const convertConfig = async ({
23+
createNewConfiguration,
24+
fileExists,
25+
logger,
26+
ruleFinder,
27+
settings,
28+
}: ConvertConfigRequest): Promise<TSLintToESLintResult> => {
1929
const { config = "./tslint.json" } = settings;
2030
if (!(await fileExists(config))) {
2131
return {
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { emptyConversionResults } from "../stubs";
2+
import { createNewConfiguration } from "./createNewConfiguration";
3+
import { ConfigConversionResults } from "../rules/convertRules";
4+
5+
describe("createNewConfiguration", () => {
6+
it("writes only formatted rules when there are no missing rules", async () => {
7+
// Arrange
8+
const conversionResults: ConfigConversionResults = {
9+
...emptyConversionResults,
10+
converted: new Map(),
11+
};
12+
const writeFile = jest.fn().mockReturnValue(Promise.resolve());
13+
14+
// Act
15+
await createNewConfiguration(conversionResults, writeFile);
16+
17+
// Assert
18+
expect(writeFile).toHaveBeenLastCalledWith(
19+
".eslintrc.json",
20+
JSON.stringify({ rules: {} }, undefined, 4),
21+
);
22+
});
23+
24+
it("includes typescript-eslint plugin settings when there are missing rules", async () => {
25+
// Arrange
26+
const conversionResults: ConfigConversionResults = {
27+
...emptyConversionResults,
28+
converted: new Map(),
29+
missing: [
30+
{
31+
ruleArguments: [],
32+
ruleName: "tslint-rule-one",
33+
ruleSeverity: "error",
34+
},
35+
],
36+
};
37+
const writeFile = jest.fn().mockReturnValue(Promise.resolve());
38+
39+
// Act
40+
await createNewConfiguration(conversionResults, writeFile);
41+
42+
// Assert
43+
expect(writeFile).toHaveBeenLastCalledWith(
44+
".eslintrc.json",
45+
JSON.stringify(
46+
{
47+
plugins: ["@typescript-eslint/tslint"],
48+
parser: "@typescript-eslint/parser",
49+
parserOptions: {
50+
project: "tsconfig.json",
51+
},
52+
rules: {
53+
"@typescript-eslint/tslint/config": [
54+
"error",
55+
{
56+
rules: {
57+
"tslint-rule-one": true,
58+
},
59+
},
60+
],
61+
},
62+
},
63+
undefined,
64+
4,
65+
),
66+
);
67+
});
68+
});
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
import * as fs from "fs";
2-
31
import { ConfigConversionResults } from "../rules/convertRules";
42
import { formatConvertedRules } from "./formatConvertedRules";
53

6-
export const createNewConfiguration = async (conversionResults: ConfigConversionResults) => {
4+
export type WriteFile = (filePath: string, contents: string) => Promise<void>;
5+
6+
export const createNewConfiguration = async (
7+
conversionResults: ConfigConversionResults,
8+
writeFile: WriteFile,
9+
) => {
710
const output = {
811
...(conversionResults.missing.length && {
912
plugins: ["@typescript-eslint/tslint"],
@@ -15,5 +18,5 @@ export const createNewConfiguration = async (conversionResults: ConfigConversion
1518
rules: formatConvertedRules(conversionResults),
1619
};
1720

18-
await fs.promises.writeFile(".eslintrc.json", JSON.stringify(output, undefined, 4));
21+
await writeFile(".eslintrc.json", JSON.stringify(output, undefined, 4));
1922
};

0 commit comments

Comments
 (0)