Skip to content

Commit a07f475

Browse files
MrCube42Josh Goldberg
authored and
Josh Goldberg
committed
Test/dry convert rules 142 (#213)
* refactor (test): Extract creation of sample ts-lint rule into function * refactor (test): Extract the setup of the conversion environment into a method * refactor (test): Add better types to Maps * refactor (test): Extract parametrized converter and merger creation into method
1 parent 5f5a77f commit a07f475

File tree

1 file changed

+79
-69
lines changed

1 file changed

+79
-69
lines changed

src/rules/convertRules.test.ts

Lines changed: 79 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
import { ConversionError } from "../errors/conversionError";
22
import { convertRules } from "./convertRules";
3-
import { TSLintRuleOptions } from "./types";
3+
import { TSLintRuleOptions, TSLintRuleSeverity } from "./types";
4+
import { RuleConverter, ConversionResult } from "./converter";
5+
import { RuleMerger } from "./merger";
46

57
describe("convertRules", () => {
68
it("doesn't marks a disabled rule as missing when its converter returns undefined", () => {
79
// Arrange
8-
const tslintRule: TSLintRuleOptions = {
9-
ruleArguments: [],
10-
ruleName: "tslint-rule-a",
10+
const { tslintRule, converters, mergers } = setupConversionEnvironment({
1111
ruleSeverity: "off",
12-
};
13-
const converters = new Map();
14-
const mergers = new Map();
12+
});
1513

1614
// Act
1715
const { missing } = convertRules(
@@ -25,13 +23,7 @@ describe("convertRules", () => {
2523

2624
it("marks an enabled rule as missing when its converter returns undefined", () => {
2725
// Arrange
28-
const tslintRule: TSLintRuleOptions = {
29-
ruleArguments: [],
30-
ruleName: "tslint-rule-a",
31-
ruleSeverity: "error",
32-
};
33-
const converters = new Map();
34-
const mergers = new Map();
26+
const { tslintRule, converters, mergers } = setupConversionEnvironment();
3527

3628
// Act
3729
const { missing } = convertRules(
@@ -45,14 +37,9 @@ describe("convertRules", () => {
4537

4638
it("marks a conversion as failed when returned a conversion error", () => {
4739
// Arrange
48-
const tslintRule: TSLintRuleOptions = {
49-
ruleArguments: [],
50-
ruleName: "tslint-rule-a",
51-
ruleSeverity: "error",
52-
};
40+
const { tslintRule, converters, mergers } = setupConversionEnvironment();
5341
const conversionError = ConversionError.forRuleError(new Error(), tslintRule);
54-
const converters = new Map([[tslintRule.ruleName, () => conversionError]]);
55-
const mergers = new Map();
42+
converters.set(tslintRule.ruleName, () => conversionError);
5643

5744
// Act
5845
const { failed } = convertRules(
@@ -66,20 +53,16 @@ describe("convertRules", () => {
6653

6754
it("marks a converted rule name as converted when a conversion has rules", () => {
6855
// Arrange
69-
const tslintRule: TSLintRuleOptions = {
70-
ruleArguments: [],
71-
ruleName: "tslint-rule-a",
72-
ruleSeverity: "error",
73-
};
7456
const conversionResult = {
7557
rules: [
7658
{
7759
ruleName: "eslint-rule-a",
7860
},
7961
],
8062
};
81-
const converters = new Map([[tslintRule.ruleName, () => conversionResult]]);
82-
const mergers = new Map();
63+
const { tslintRule, converters, mergers } = setupConversionEnvironment({
64+
conversionResult,
65+
});
8366

8467
// Act
8568
const { converted } = convertRules(
@@ -103,11 +86,6 @@ describe("convertRules", () => {
10386

10487
it("reports a failure when two outputs exist for a converted rule without a merger", () => {
10588
// Arrange
106-
const tslintRule: TSLintRuleOptions = {
107-
ruleArguments: [],
108-
ruleName: "tslint-rule-a",
109-
ruleSeverity: "error",
110-
};
11189
const conversionResult = {
11290
rules: [
11391
{
@@ -118,8 +96,9 @@ describe("convertRules", () => {
11896
},
11997
],
12098
};
121-
const converters = new Map([[tslintRule.ruleName, () => conversionResult]]);
122-
const mergers = new Map();
99+
const { tslintRule, converters, mergers } = setupConversionEnvironment({
100+
conversionResult,
101+
});
123102

124103
// Act
125104
const { failed } = convertRules(
@@ -133,11 +112,6 @@ describe("convertRules", () => {
133112

134113
it("merges rule arguments two outputs exist for a converted rule with a merger", () => {
135114
// Arrange
136-
const tslintRule: TSLintRuleOptions = {
137-
ruleArguments: [],
138-
ruleName: "tslint-rule-a",
139-
ruleSeverity: "error",
140-
};
141115
const conversionResult = {
142116
rules: [
143117
{
@@ -148,9 +122,10 @@ describe("convertRules", () => {
148122
},
149123
],
150124
};
151-
const mergedArguments = [{ merged: true }];
152-
const converters = new Map([[tslintRule.ruleName, () => conversionResult]]);
153-
const mergers = new Map([[conversionResult.rules[0].ruleName, () => mergedArguments]]);
125+
const { tslintRule, converters, mergers } = setupConversionEnvironment({
126+
conversionResult,
127+
ruleToMerge: conversionResult.rules[0].ruleName,
128+
});
154129

155130
// Act
156131
const { converted } = convertRules(
@@ -164,7 +139,7 @@ describe("convertRules", () => {
164139
[
165140
"eslint-rule-a",
166141
{
167-
ruleArguments: mergedArguments,
142+
ruleArguments: [{ merged: true }],
168143
ruleName: "eslint-rule-a",
169144
ruleSeverity: "error",
170145
notices: [],
@@ -176,11 +151,6 @@ describe("convertRules", () => {
176151

177152
it("merges and deduplicates rule notices", () => {
178153
// Arrange
179-
const tslintRule: TSLintRuleOptions = {
180-
ruleArguments: [],
181-
ruleName: "tslint-rule-a",
182-
ruleSeverity: "error",
183-
};
184154
const conversionResult = {
185155
rules: [
186156
{
@@ -193,9 +163,10 @@ describe("convertRules", () => {
193163
},
194164
],
195165
};
196-
const mergedArguments = [{ merged: true }];
197-
const converters = new Map([[tslintRule.ruleName, () => conversionResult]]);
198-
const mergers = new Map([[conversionResult.rules[0].ruleName, () => mergedArguments]]);
166+
const { tslintRule, converters, mergers } = setupConversionEnvironment({
167+
conversionResult,
168+
ruleToMerge: conversionResult.rules[0].ruleName,
169+
});
199170

200171
// Act
201172
const { converted } = convertRules(
@@ -209,7 +180,7 @@ describe("convertRules", () => {
209180
[
210181
"eslint-rule-a",
211182
{
212-
ruleArguments: mergedArguments,
183+
ruleArguments: [{ merged: true }],
213184
ruleName: "eslint-rule-a",
214185
ruleSeverity: "error",
215186
notices: ["notice-1", "notice-2"],
@@ -221,11 +192,6 @@ describe("convertRules", () => {
221192

222193
it("merges undefined notices", () => {
223194
// Arrange
224-
const tslintRule: TSLintRuleOptions = {
225-
ruleArguments: [],
226-
ruleName: "tslint-rule-a",
227-
ruleSeverity: "error",
228-
};
229195
const conversionResult = {
230196
rules: [
231197
{
@@ -238,9 +204,10 @@ describe("convertRules", () => {
238204
},
239205
],
240206
};
241-
const mergedArguments = [{ merged: true }];
242-
const converters = new Map([[tslintRule.ruleName, () => conversionResult]]);
243-
const mergers = new Map([[conversionResult.rules[0].ruleName, () => mergedArguments]]);
207+
const { tslintRule, converters, mergers } = setupConversionEnvironment({
208+
conversionResult,
209+
ruleToMerge: conversionResult.rules[0].ruleName,
210+
});
244211

245212
// Act
246213
const { converted } = convertRules(
@@ -254,7 +221,7 @@ describe("convertRules", () => {
254221
[
255222
"eslint-rule-a",
256223
{
257-
ruleArguments: mergedArguments,
224+
ruleArguments: [{ merged: true }],
258225
ruleName: "eslint-rule-a",
259226
ruleSeverity: "error",
260227
notices: [],
@@ -266,17 +233,13 @@ describe("convertRules", () => {
266233

267234
it("marks a new plugin when a conversion has a new plugin", () => {
268235
// Arrange
269-
const tslintRule: TSLintRuleOptions = {
270-
ruleArguments: [],
271-
ruleName: "tslint-rule-a",
272-
ruleSeverity: "error",
273-
};
274236
const conversionResult = {
275237
plugins: ["extra-plugin"],
276238
rules: [],
277239
};
278-
const converters = new Map([[tslintRule.ruleName, () => conversionResult]]);
279-
const mergers = new Map();
240+
const { tslintRule, converters, mergers } = setupConversionEnvironment({
241+
conversionResult,
242+
});
280243

281244
// Act
282245
const { plugins } = convertRules(
@@ -288,3 +251,50 @@ describe("convertRules", () => {
288251
expect(plugins).toEqual(new Set(["extra-plugin"]));
289252
});
290253
});
254+
255+
function setupConversionEnvironment(
256+
config: {
257+
ruleSeverity?: TSLintRuleSeverity;
258+
conversionResult?: ConversionResult;
259+
ruleToMerge?: string;
260+
} = {},
261+
) {
262+
const { ruleSeverity, conversionResult, ruleToMerge } = config;
263+
264+
const tslintRule = createSampleTsLintRule(ruleSeverity);
265+
const converters = createConverters(tslintRule, conversionResult);
266+
const mergers = createMergers(ruleToMerge);
267+
268+
return { tslintRule, converters, mergers };
269+
}
270+
271+
function createSampleTsLintRule(ruleSeverity: TSLintRuleSeverity = "error"): TSLintRuleOptions {
272+
return {
273+
ruleArguments: [],
274+
ruleName: "tslint-rule-a",
275+
ruleSeverity,
276+
};
277+
}
278+
279+
function createConverters(
280+
tslintRule: TSLintRuleOptions,
281+
conversionResult?: ConversionResult,
282+
): Map<string, RuleConverter> {
283+
const converters = new Map<string, RuleConverter>();
284+
285+
if (conversionResult !== undefined) {
286+
converters.set(tslintRule.ruleName, () => conversionResult);
287+
}
288+
289+
return converters;
290+
}
291+
292+
function createMergers(ruleToMerge?: string): Map<string, RuleMerger> {
293+
const mergers = new Map<string, RuleMerger>();
294+
295+
if (ruleToMerge !== undefined) {
296+
mergers.set(ruleToMerge, () => [{ merged: true }]);
297+
}
298+
299+
return mergers;
300+
}

0 commit comments

Comments
 (0)