@monorepolint/rules 0.5.0-alpha.9 → 0.5.0-alpha.95

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/lib/__tests__/alphabeticalScripts.spec.d.ts +8 -0
  2. package/lib/__tests__/alphabeticalScripts.spec.d.ts.map +1 -0
  3. package/lib/__tests__/alphabeticalScripts.spec.js +61 -0
  4. package/lib/__tests__/alphabeticalScripts.spec.js.map +1 -0
  5. package/lib/__tests__/bannedDependencies.spec.d.ts +2 -0
  6. package/lib/__tests__/bannedDependencies.spec.d.ts.map +1 -0
  7. package/lib/__tests__/bannedDependencies.spec.js +161 -0
  8. package/lib/__tests__/bannedDependencies.spec.js.map +1 -0
  9. package/lib/__tests__/consistentDependencies.spec.js +30 -23
  10. package/lib/__tests__/consistentDependencies.spec.js.map +1 -1
  11. package/lib/__tests__/consistentVersions.spec.d.ts +8 -0
  12. package/lib/__tests__/consistentVersions.spec.d.ts.map +1 -0
  13. package/lib/__tests__/consistentVersions.spec.js +183 -0
  14. package/lib/__tests__/consistentVersions.spec.js.map +1 -0
  15. package/lib/__tests__/fileContents.spec.d.ts +8 -0
  16. package/lib/__tests__/fileContents.spec.d.ts.map +1 -0
  17. package/lib/__tests__/fileContents.spec.js +59 -0
  18. package/lib/__tests__/fileContents.spec.js.map +1 -0
  19. package/lib/__tests__/mustSatisfyPeerDependencies.spec.d.ts +8 -0
  20. package/lib/__tests__/mustSatisfyPeerDependencies.spec.d.ts.map +1 -0
  21. package/lib/__tests__/mustSatisfyPeerDependencies.spec.js +1063 -0
  22. package/lib/__tests__/mustSatisfyPeerDependencies.spec.js.map +1 -0
  23. package/lib/__tests__/nestedWorkspaces.spec.d.ts +2 -0
  24. package/lib/__tests__/nestedWorkspaces.spec.d.ts.map +1 -0
  25. package/lib/__tests__/nestedWorkspaces.spec.js +124 -0
  26. package/lib/__tests__/nestedWorkspaces.spec.js.map +1 -0
  27. package/lib/__tests__/packageEntry.spec.js +72 -27
  28. package/lib/__tests__/packageEntry.spec.js.map +1 -1
  29. package/lib/__tests__/packageOrder.spec.js +34 -33
  30. package/lib/__tests__/packageOrder.spec.js.map +1 -1
  31. package/lib/__tests__/packageScript.spec.js +50 -51
  32. package/lib/__tests__/packageScript.spec.js.map +1 -1
  33. package/lib/__tests__/requireDependency.spec.d.ts +2 -0
  34. package/lib/__tests__/requireDependency.spec.d.ts.map +1 -0
  35. package/lib/__tests__/requireDependency.spec.js +123 -0
  36. package/lib/__tests__/requireDependency.spec.js.map +1 -0
  37. package/lib/__tests__/utils.d.ts +69 -1
  38. package/lib/__tests__/utils.d.ts.map +1 -1
  39. package/lib/__tests__/utils.js +72 -12
  40. package/lib/__tests__/utils.js.map +1 -1
  41. package/lib/alphabeticalDependencies.d.ts +3 -1
  42. package/lib/alphabeticalDependencies.d.ts.map +1 -1
  43. package/lib/alphabeticalDependencies.js +5 -39
  44. package/lib/alphabeticalDependencies.js.map +1 -1
  45. package/lib/alphabeticalScripts.d.ts +12 -0
  46. package/lib/alphabeticalScripts.d.ts.map +1 -0
  47. package/lib/alphabeticalScripts.js +20 -0
  48. package/lib/alphabeticalScripts.js.map +1 -0
  49. package/lib/bannedDependencies.d.ts +23 -5
  50. package/lib/bannedDependencies.d.ts.map +1 -1
  51. package/lib/bannedDependencies.js +110 -36
  52. package/lib/bannedDependencies.js.map +1 -1
  53. package/lib/consistentDependencies.d.ts +8 -1
  54. package/lib/consistentDependencies.d.ts.map +1 -1
  55. package/lib/consistentDependencies.js +30 -12
  56. package/lib/consistentDependencies.js.map +1 -1
  57. package/lib/consistentVersions.d.ts +14 -0
  58. package/lib/consistentVersions.d.ts.map +1 -0
  59. package/lib/consistentVersions.js +94 -0
  60. package/lib/consistentVersions.js.map +1 -0
  61. package/lib/fileContents.d.ts +8 -8
  62. package/lib/fileContents.d.ts.map +1 -1
  63. package/lib/fileContents.js +32 -27
  64. package/lib/fileContents.js.map +1 -1
  65. package/lib/index.d.ts +5 -0
  66. package/lib/index.d.ts.map +1 -1
  67. package/lib/index.js +19 -8
  68. package/lib/index.js.map +1 -1
  69. package/lib/mustSatisfyPeerDependencies.d.ts +240 -0
  70. package/lib/mustSatisfyPeerDependencies.d.ts.map +1 -0
  71. package/lib/mustSatisfyPeerDependencies.js +636 -0
  72. package/lib/mustSatisfyPeerDependencies.js.map +1 -0
  73. package/lib/nestedWorkspaces.d.ts +13 -0
  74. package/lib/nestedWorkspaces.d.ts.map +1 -0
  75. package/lib/nestedWorkspaces.js +50 -0
  76. package/lib/nestedWorkspaces.js.map +1 -0
  77. package/lib/packageEntry.d.ts +15 -6
  78. package/lib/packageEntry.d.ts.map +1 -1
  79. package/lib/packageEntry.js +53 -18
  80. package/lib/packageEntry.js.map +1 -1
  81. package/lib/packageOrder.d.ts +3 -3
  82. package/lib/packageOrder.d.ts.map +1 -1
  83. package/lib/packageOrder.js +8 -7
  84. package/lib/packageOrder.js.map +1 -1
  85. package/lib/packageScript.d.ts +10 -10
  86. package/lib/packageScript.js +6 -5
  87. package/lib/packageScript.js.map +1 -1
  88. package/lib/requireDependency.d.ts +15 -0
  89. package/lib/requireDependency.d.ts.map +1 -0
  90. package/lib/requireDependency.js +65 -0
  91. package/lib/requireDependency.js.map +1 -0
  92. package/lib/standardTsconfig.d.ts +20 -8
  93. package/lib/standardTsconfig.d.ts.map +1 -1
  94. package/lib/standardTsconfig.js +36 -18
  95. package/lib/standardTsconfig.js.map +1 -1
  96. package/lib/util/checkAlpha.d.ts +10 -0
  97. package/lib/util/checkAlpha.d.ts.map +1 -0
  98. package/lib/util/checkAlpha.js +51 -0
  99. package/lib/util/checkAlpha.js.map +1 -0
  100. package/lib/util/makeDirectory.d.ts +8 -0
  101. package/lib/util/makeDirectory.d.ts.map +1 -0
  102. package/lib/util/makeDirectory.js +28 -0
  103. package/lib/util/makeDirectory.js.map +1 -0
  104. package/lib/util/packageDependencyGraphService.d.ts +37 -0
  105. package/lib/util/packageDependencyGraphService.d.ts.map +1 -0
  106. package/lib/util/packageDependencyGraphService.js +70 -0
  107. package/lib/util/packageDependencyGraphService.js.map +1 -0
  108. package/package.json +18 -15
  109. package/src/__tests__/alphabeticalScripts.spec.ts +75 -0
  110. package/src/__tests__/bannedDependencies.spec.ts +191 -0
  111. package/src/__tests__/consistentDependencies.spec.ts +39 -26
  112. package/src/__tests__/consistentVersions.spec.ts +223 -0
  113. package/src/__tests__/fileContents.spec.ts +74 -0
  114. package/src/__tests__/mustSatisfyPeerDependencies.spec.ts +1188 -0
  115. package/src/__tests__/nestedWorkspaces.spec.ts +152 -0
  116. package/src/__tests__/packageEntry.spec.ts +98 -31
  117. package/src/__tests__/packageOrder.spec.ts +46 -40
  118. package/src/__tests__/packageScript.spec.ts +62 -54
  119. package/src/__tests__/requireDependency.spec.ts +151 -0
  120. package/src/__tests__/utils.ts +113 -11
  121. package/src/alphabeticalDependencies.ts +3 -47
  122. package/src/alphabeticalScripts.ts +19 -0
  123. package/src/bannedDependencies.ts +133 -43
  124. package/src/consistentDependencies.ts +34 -12
  125. package/src/consistentVersions.ts +140 -0
  126. package/src/fileContents.ts +31 -27
  127. package/src/index.ts +5 -0
  128. package/src/mustSatisfyPeerDependencies.ts +739 -0
  129. package/src/nestedWorkspaces.ts +59 -0
  130. package/src/packageEntry.ts +67 -24
  131. package/src/packageOrder.ts +6 -6
  132. package/src/packageScript.ts +3 -3
  133. package/src/requireDependency.ts +69 -0
  134. package/src/standardTsconfig.ts +40 -18
  135. package/src/util/checkAlpha.ts +59 -0
  136. package/src/util/makeDirectory.ts +24 -0
  137. package/src/util/packageDependencyGraphService.ts +114 -0
  138. package/tsconfig.tsbuildinfo +1 -2439
@@ -0,0 +1,152 @@
1
+ /*!
2
+ * Copyright 2019 Palantir Technologies, Inc.
3
+ *
4
+ * Licensed under the MIT license. See LICENSE file in the project root for details.
5
+ *
6
+ */
7
+ import { WorkspaceContext } from "@monorepolint/core";
8
+ import { SimpleHost } from "@monorepolint/utils";
9
+ import { writeFileSync } from "fs";
10
+ import * as path from "path";
11
+ import * as tmp from "tmp";
12
+ import { nestedWorkspaces } from "../nestedWorkspaces";
13
+ import { makeDirectoryRecursively } from "../util/makeDirectory";
14
+ import { jsonToString } from "./utils";
15
+
16
+ const EMPTY_PACKAGE = jsonToString({});
17
+
18
+ const PACKAGE_ROOT_WITH_PACKAGES_STAR = jsonToString({
19
+ workspaces: {
20
+ packages: ["packages/*"],
21
+ },
22
+ });
23
+
24
+ const PACKAGE_ROOT_WITH_TWO_LEVEL = jsonToString({
25
+ workspaces: {
26
+ packages: ["packages/*", "packages/deep/*"],
27
+ },
28
+ });
29
+
30
+ const PACKAGE_ROOT_WITH_THREE_LEVEL = jsonToString({
31
+ workspaces: {
32
+ packages: ["packages/*", "packages/deep/*", "packages/very/deep/*"],
33
+ },
34
+ });
35
+
36
+ describe("nestedWorkspaces", () => {
37
+ tmp.setGracefulCleanup();
38
+
39
+ let cleanupJobs: Array<() => void> = [];
40
+ let cwd: string | undefined;
41
+
42
+ beforeEach(() => {
43
+ const dir = tmp.dirSync({ unsafeCleanup: true });
44
+ cleanupJobs.push(() => dir.removeCallback());
45
+ cwd = dir.name;
46
+
47
+ const spy = jest.spyOn(process, "cwd");
48
+ spy.mockReturnValue(cwd);
49
+ });
50
+
51
+ afterEach(() => {
52
+ for (const cleanupJob of cleanupJobs) {
53
+ cleanupJob();
54
+ }
55
+ cleanupJobs = [];
56
+ });
57
+
58
+ function makeWorkspace() {
59
+ const host = new SimpleHost();
60
+ const workspaceContext = new WorkspaceContext(
61
+ cwd!,
62
+ {
63
+ rules: [],
64
+ fix: false,
65
+ verbose: false,
66
+ silent: true,
67
+ },
68
+ host
69
+ );
70
+
71
+ async function checkAndSpy() {
72
+ const addErrorSpy = jest.spyOn(workspaceContext, "addError");
73
+
74
+ await nestedWorkspaces.check(workspaceContext, undefined);
75
+ return { addErrorSpy };
76
+ }
77
+
78
+ function addFile(filePath: string, content: string) {
79
+ const dirPath = path.resolve(cwd!, path.dirname(filePath));
80
+ const resolvedFilePath = path.resolve(cwd!, filePath);
81
+
82
+ makeDirectoryRecursively(dirPath);
83
+ writeFileSync(resolvedFilePath, content);
84
+ return resolvedFilePath;
85
+ }
86
+
87
+ return { addFile, workspaceContext, checkAndSpy };
88
+ }
89
+
90
+ it("checks correctly when no packages", async () => {
91
+ const { addFile, checkAndSpy } = makeWorkspace();
92
+ addFile("./package.json", EMPTY_PACKAGE);
93
+
94
+ expect((await checkAndSpy()).addErrorSpy).toHaveBeenCalledTimes(0);
95
+ });
96
+
97
+ it("checks correctly when one level packages", async () => {
98
+ const { addFile, checkAndSpy } = makeWorkspace();
99
+ addFile("./package.json", PACKAGE_ROOT_WITH_PACKAGES_STAR);
100
+ addFile("./packages/star/package.json", EMPTY_PACKAGE);
101
+
102
+ expect((await checkAndSpy()).addErrorSpy).toHaveBeenCalledTimes(0);
103
+ });
104
+
105
+ it("checks fail when one level packages with no workspaces field", async () => {
106
+ const { addFile, checkAndSpy } = makeWorkspace();
107
+ const packageJsonPath = addFile("./package.json", EMPTY_PACKAGE);
108
+ addFile("./packages/star/package.json", EMPTY_PACKAGE);
109
+
110
+ const spy = (await checkAndSpy()).addErrorSpy;
111
+ expect(spy).toHaveBeenCalledTimes(1);
112
+ expect(spy).toHaveBeenCalledWith({
113
+ file: packageJsonPath,
114
+ message: 'The "workspace" field is missing, even though there are workspaces in the repository.',
115
+ });
116
+ });
117
+
118
+ it("checks correctly when two level packages with two level workspaces field", async () => {
119
+ const { addFile, checkAndSpy } = makeWorkspace();
120
+ addFile("./package.json", PACKAGE_ROOT_WITH_TWO_LEVEL);
121
+ addFile("./packages/star/package.json", EMPTY_PACKAGE);
122
+ addFile("./packages/deep/star/package.json", EMPTY_PACKAGE);
123
+
124
+ expect((await checkAndSpy()).addErrorSpy).toHaveBeenCalledTimes(0);
125
+ });
126
+
127
+ it("checks fail when two level packages with one level workspaces field", async () => {
128
+ const { addFile, checkAndSpy } = makeWorkspace();
129
+ const packageJsonPath = addFile("./package.json", PACKAGE_ROOT_WITH_PACKAGES_STAR);
130
+ addFile("./packages/star/package.json", EMPTY_PACKAGE);
131
+ addFile("./packages/deep/star/package.json", EMPTY_PACKAGE);
132
+
133
+ const spy = (await checkAndSpy()).addErrorSpy;
134
+ expect(spy).toHaveBeenCalledTimes(1);
135
+ expect(spy).toHaveBeenCalledWith({
136
+ file: packageJsonPath,
137
+ message:
138
+ 'The "workspace" field is missing one or more values: packages/deep/star. ' +
139
+ 'You may be able to use a glob to avoid listing each workspace individually, e.g. "packages/nested-workspace/*".',
140
+ });
141
+ });
142
+
143
+ it("checks correctly when three level packages with three level workspaces field", async () => {
144
+ const { addFile, checkAndSpy } = makeWorkspace();
145
+ addFile("./package.json", PACKAGE_ROOT_WITH_THREE_LEVEL);
146
+ addFile("./packages/star/package.json", EMPTY_PACKAGE);
147
+ addFile("./packages/deep/star/package.json", EMPTY_PACKAGE);
148
+ addFile("./packages/very/deep/star/package.json", EMPTY_PACKAGE);
149
+
150
+ expect((await checkAndSpy()).addErrorSpy).toHaveBeenCalledTimes(0);
151
+ });
152
+ });
@@ -6,13 +6,10 @@
6
6
  */
7
7
 
8
8
  // tslint:disable:no-console
9
- import { createMockFiles } from "./utils";
10
9
 
11
- // done first since this also mocks 'fs'
12
- const mockFiles: Map<string, string> = createMockFiles();
13
-
14
- import { Failure, PackageContext } from "@monorepolint/core";
15
- import { packageEntry } from "../packageEntry";
10
+ import { Context, Failure } from "@monorepolint/core";
11
+ import { createExpectedEntryErrorMessage, createStandardizedEntryErrorMessage, packageEntry } from "../packageEntry";
12
+ import { AddErrorSpy, createTestingWorkspace, HOST_FACTORIES, TestingWorkspace } from "./utils";
16
13
 
17
14
  const PACKAGE_MISSING_ENTRY =
18
15
  JSON.stringify(
@@ -55,45 +52,52 @@ const PACKAGE_REPOSITORY =
55
52
  2
56
53
  ) + "\n";
57
54
 
58
- describe("expectPackageEntries", () => {
59
- afterEach(() => {
60
- mockFiles.clear();
61
- });
62
-
55
+ describe.each(HOST_FACTORIES)("expectPackageEntries ($name)", (hostFactory) => {
63
56
  describe("fix: true", () => {
64
- const context = new PackageContext(".", {
65
- rules: [],
66
- fix: true,
67
- verbose: false,
68
- silent: true,
57
+ let workspace: TestingWorkspace;
58
+ let spy: AddErrorSpy;
59
+ let context: Context;
60
+
61
+ beforeEach(async () => {
62
+ workspace = await createTestingWorkspace({
63
+ fixFlag: true,
64
+ host: hostFactory.make(),
65
+ });
66
+ context = workspace.context; // minimizing delta
67
+
68
+ spy = jest.spyOn(workspace.context, "addError");
69
69
  });
70
- const spy = jest.spyOn(context, "addError");
71
70
 
72
71
  afterEach(() => {
73
72
  spy.mockClear();
74
73
  });
75
74
 
76
75
  it("fixes missing entries", () => {
77
- mockFiles.set("package.json", PACKAGE_MISSING_ENTRY);
76
+ workspace.writeFile("package.json", PACKAGE_MISSING_ENTRY);
78
77
 
79
78
  packageEntry.check(context, {
80
79
  entries: {
81
80
  license: "UNLICENSED",
82
81
  },
82
+ entriesExist: undefined,
83
83
  });
84
84
 
85
85
  expect(spy).toHaveBeenCalledTimes(1);
86
86
 
87
87
  const failure: Failure = spy.mock.calls[0][0];
88
- expect(failure.file).toBe("package.json");
89
- expect(failure.fixer).not.toBeUndefined();
90
- expect(failure.message).toBe("Expected standardized entry for 'license'");
91
-
92
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_LICENSE);
88
+ expect(failure).toMatchObject(
89
+ workspace.failureMatcher({
90
+ file: "package.json",
91
+ hasFixer: true,
92
+ message: createStandardizedEntryErrorMessage("license"),
93
+ })
94
+ );
95
+
96
+ expect(workspace.readFile("package.json")).toEqual(PACKAGE_LICENSE);
93
97
  });
94
98
 
95
99
  it("fixes missing nested entries", () => {
96
- mockFiles.set("package.json", PACKAGE_MISSING_ENTRY);
100
+ workspace.writeFile("package.json", PACKAGE_MISSING_ENTRY);
97
101
 
98
102
  packageEntry.check(context, {
99
103
  entries: {
@@ -102,20 +106,25 @@ describe("expectPackageEntries", () => {
102
106
  url: "https://github.com:foo/foo",
103
107
  },
104
108
  },
109
+ entriesExist: undefined,
105
110
  });
106
111
 
107
112
  expect(spy).toHaveBeenCalledTimes(1);
108
113
 
109
114
  const failure: Failure = spy.mock.calls[0][0];
110
- expect(failure.file).toBe("package.json");
111
- expect(failure.fixer).not.toBeUndefined();
112
- expect(failure.message).toBe("Expected standardized entry for 'repository'");
113
-
114
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_REPOSITORY);
115
+ expect(failure).toMatchObject(
116
+ workspace.failureMatcher({
117
+ file: "package.json",
118
+ hasFixer: true,
119
+ message: createStandardizedEntryErrorMessage("repository"),
120
+ })
121
+ );
122
+
123
+ expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
115
124
  });
116
125
 
117
126
  it("doesn't error for nested entries that are defined", () => {
118
- mockFiles.set("package.json", PACKAGE_REPOSITORY);
127
+ workspace.writeFile("package.json", PACKAGE_REPOSITORY);
119
128
 
120
129
  packageEntry.check(context, {
121
130
  entries: {
@@ -124,10 +133,68 @@ describe("expectPackageEntries", () => {
124
133
  url: "https://github.com:foo/foo",
125
134
  },
126
135
  },
136
+ entriesExist: undefined,
127
137
  });
128
138
 
129
139
  expect(spy).toHaveBeenCalledTimes(0);
130
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_REPOSITORY);
140
+ expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
141
+ });
142
+
143
+ it("errors for keys that are missing", () => {
144
+ workspace.writeFile("package.json", PACKAGE_REPOSITORY);
145
+
146
+ packageEntry.check(context, {
147
+ entries: undefined,
148
+ entriesExist: ["bugs"],
149
+ });
150
+
151
+ expect(spy).toHaveBeenCalledTimes(1);
152
+
153
+ const failure: Failure = spy.mock.calls[0][0];
154
+ expect(failure).toMatchObject(
155
+ workspace.failureMatcher({
156
+ file: "package.json",
157
+ hasFixer: false,
158
+ message: createExpectedEntryErrorMessage("bugs"),
159
+ })
160
+ );
161
+ expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
162
+ });
163
+
164
+ it("handles both entries and entriesExist", () => {
165
+ workspace.writeFile("package.json", PACKAGE_MISSING_ENTRY);
166
+
167
+ packageEntry.check(context, {
168
+ entries: {
169
+ repository: {
170
+ type: "git",
171
+ url: "https://github.com:foo/foo",
172
+ },
173
+ },
174
+ entriesExist: ["bugs"],
175
+ });
176
+
177
+ expect(spy).toHaveBeenCalledTimes(2);
178
+
179
+ const failure: Failure = spy.mock.calls[0][0];
180
+ expect(failure).toMatchObject(
181
+ workspace.failureMatcher({
182
+ file: "package.json",
183
+ hasFixer: true,
184
+ message: createStandardizedEntryErrorMessage("repository"),
185
+ })
186
+ );
187
+
188
+ const failure2: Failure = spy.mock.calls[1][0];
189
+ expect(failure2).toMatchObject(
190
+ workspace.failureMatcher({
191
+ file: "package.json",
192
+ hasFixer: false,
193
+ message: createExpectedEntryErrorMessage("bugs"),
194
+ })
195
+ );
196
+
197
+ expect(workspace.readFile("package.json")).toEqual(PACKAGE_REPOSITORY);
131
198
  });
132
199
  });
133
200
  });
@@ -6,12 +6,8 @@
6
6
  */
7
7
 
8
8
  // tslint:disable:no-console
9
- import { createMockFiles } from "./utils";
10
-
11
- // done first since this also mocks 'fs'
12
- const mockFiles: Map<string, string> = createMockFiles();
13
-
14
- import { Context, Failure, PackageContext } from "@monorepolint/core";
9
+ import { AddErrorSpy, createTestingWorkspace, HOST_FACTORIES, TestingWorkspace } from "./utils";
10
+ import { Context, Failure } from "@monorepolint/core";
15
11
  import { packageOrder } from "../packageOrder";
16
12
 
17
13
  const PACKAGE_UNORDERED =
@@ -85,26 +81,24 @@ const PACKAGE_ORDERED_UNKOWN_KEYS =
85
81
  2
86
82
  ) + "\n";
87
83
 
88
- describe("expectPackageOrder", () => {
89
- afterEach(() => {
90
- mockFiles.clear();
91
- });
92
-
84
+ describe.each(HOST_FACTORIES)("expectPackageOrder ($name)", (hostFactory) => {
93
85
  describe("fix: true", () => {
94
- const context = new PackageContext(".", {
95
- rules: [],
96
- fix: true,
97
- verbose: false,
98
- silent: true,
99
- });
100
- const spy = jest.spyOn(context, "addError");
86
+ let workspace: TestingWorkspace;
87
+ let spy: AddErrorSpy;
88
+ let context: Context;
89
+
90
+ beforeEach(async () => {
91
+ workspace = await createTestingWorkspace({
92
+ fixFlag: true,
93
+ host: hostFactory.make(),
94
+ });
95
+ context = workspace.context; // minimizing delta
101
96
 
102
- afterEach(() => {
103
- spy.mockClear();
97
+ spy = jest.spyOn(workspace.context, "addError");
104
98
  });
105
99
 
106
100
  it("fixes order for expected keys", () => {
107
- mockFiles.set("package.json", PACKAGE_UNORDERED);
101
+ workspace.writeFile("package.json", PACKAGE_UNORDERED);
108
102
 
109
103
  packageOrder.check(context, {
110
104
  order: orderArray,
@@ -113,15 +107,19 @@ describe("expectPackageOrder", () => {
113
107
  expect(spy).toHaveBeenCalledTimes(1);
114
108
 
115
109
  const failure: Failure = spy.mock.calls[0][0];
116
- expect(failure.file).toBe("package.json");
117
- expect(failure.fixer).not.toBeUndefined();
118
- expect(failure.message).toBe("Incorrect order of fields in package.json");
119
-
120
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_ORDERED);
110
+ expect(failure).toMatchObject(
111
+ workspace.failureMatcher({
112
+ file: "package.json",
113
+ hasFixer: true,
114
+ message: "Incorrect order of fields in package.json",
115
+ })
116
+ );
117
+
118
+ expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED);
121
119
  });
122
120
 
123
121
  it("fixes order for unexpected keys", () => {
124
- mockFiles.set("package.json", PACKAGE_UNORDERED_UNKOWN_KEYS);
122
+ workspace.writeFile("package.json", PACKAGE_UNORDERED_UNKOWN_KEYS);
125
123
 
126
124
  packageOrder.check(context, {
127
125
  order: orderArray,
@@ -130,15 +128,19 @@ describe("expectPackageOrder", () => {
130
128
  expect(spy).toHaveBeenCalledTimes(1);
131
129
 
132
130
  const failure: Failure = spy.mock.calls[0][0];
133
- expect(failure.file).toBe("package.json");
134
- expect(failure.fixer).not.toBeUndefined();
135
- expect(failure.message).toBe("Incorrect order of fields in package.json");
136
-
137
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
131
+ expect(failure).toMatchObject(
132
+ workspace.failureMatcher({
133
+ file: "package.json",
134
+ hasFixer: true,
135
+ message: "Incorrect order of fields in package.json",
136
+ })
137
+ );
138
+
139
+ expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
138
140
  });
139
141
 
140
142
  it("fixes order using function", () => {
141
- mockFiles.set("package.json", PACKAGE_UNORDERED);
143
+ workspace.writeFile("package.json", PACKAGE_UNORDERED);
142
144
 
143
145
  packageOrder.check(context, {
144
146
  order: orderFunction,
@@ -147,15 +149,19 @@ describe("expectPackageOrder", () => {
147
149
  expect(spy).toHaveBeenCalledTimes(1);
148
150
 
149
151
  const failure: Failure = spy.mock.calls[0][0];
150
- expect(failure.file).toBe("package.json");
151
- expect(failure.fixer).not.toBeUndefined();
152
- expect(failure.message).toBe("Incorrect order of fields in package.json");
153
-
154
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_ORDERED_BY_LENGTH);
152
+ expect(failure).toMatchObject(
153
+ workspace.failureMatcher({
154
+ file: "package.json",
155
+ hasFixer: true,
156
+ message: "Incorrect order of fields in package.json",
157
+ })
158
+ );
159
+
160
+ expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_BY_LENGTH);
155
161
  });
156
162
 
157
163
  it("does nothing if already order", () => {
158
- mockFiles.set("package.json", PACKAGE_ORDERED_UNKOWN_KEYS);
164
+ workspace.writeFile("package.json", PACKAGE_ORDERED_UNKOWN_KEYS);
159
165
 
160
166
  packageOrder.check(context, {
161
167
  order: orderArray,
@@ -163,7 +169,7 @@ describe("expectPackageOrder", () => {
163
169
 
164
170
  expect(spy).not.toHaveBeenCalled();
165
171
 
166
- expect(mockFiles.get("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
172
+ expect(workspace.readFile("package.json")).toEqual(PACKAGE_ORDERED_UNKOWN_KEYS);
167
173
  });
168
174
  });
169
175
  });