microsoft/vscode-react-native

Public

mirrored from https://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
cdef68eb3c8280164fd0195303fcd86976b058d8

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

test/common/projectVersionHelper.test.ts

271lines · modecode

1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
4import { ProjectVersionHelper } from "../../src/common/projectVersionHelper";
5import { RN_VERSION_ERRORS } from "../../src/common/error/versionError";
6import { Node } from "../../src/common/node/node";
7
8import * as assert from "assert";
9import * as path from "path";
10import * as fs from "fs";
11import { ParsedPackage } from "../../src/common/reactNativeProjectHelper";
12
13suite("projectVersionHelper", function () {
14 const sampleReactNative022ProjectDir = path.join(
15 __dirname,
16 "..",
17 "resources",
18 "sampleReactNative022Project",
19 );
20
21 test("getReactNativeVersionsFromProjectPackage should return object containing version strings if 'version' field is found in project's package.json file", () => {
22 let additionalPackages: ParsedPackage[] = [];
23 additionalPackages.push({
24 packageName: "react-native-windows",
25 useSemverCoerce: false,
26 });
27 return ProjectVersionHelper.getReactNativeVersionsFromProjectPackage(
28 sampleReactNative022ProjectDir,
29 additionalPackages,
30 ).then(versions => {
31 assert.strictEqual(versions.reactNativeVersion, "0.22.2");
32 assert.strictEqual(versions.reactNativeWindowsVersion, "0.60.0-vnext.68");
33 });
34 });
35
36 suite("getReactNativeVersionsFromProjectWithIncorrectPackageJson", () => {
37 const packageJsonPath = path.join(sampleReactNative022ProjectDir, "package.json");
38 const packageJsonContent = fs.readFileSync(packageJsonPath, "utf8");
39 const versionObj = {
40 devDependencies: {},
41 };
42
43 suiteSetup(() => {
44 fs.writeFileSync(packageJsonPath, JSON.stringify(versionObj, null, 2));
45 });
46
47 suiteTeardown(() => {
48 fs.writeFileSync(packageJsonPath, packageJsonContent);
49 });
50
51 test("getReactNativeVersionsFromProjectPackage should return containing empty version strings if 'version' field isn't found in project's package.json file", () => {
52 let additionalPackages: ParsedPackage[] = [];
53 additionalPackages.push({
54 packageName: "react-native-windows",
55 useSemverCoerce: false,
56 });
57 return ProjectVersionHelper.getReactNativeVersionsFromProjectPackage(
58 sampleReactNative022ProjectDir,
59 additionalPackages,
60 ).then(versions => {
61 assert.strictEqual(
62 versions.reactNativeVersion,
63 "errorMissingDependenciesFieldsInProjectPackageFile",
64 );
65 assert.strictEqual(
66 versions.reactNativeWindowsVersion,
67 "errorMissingDependenciesFieldsInProjectPackageFile",
68 );
69 });
70 });
71 });
72
73 suite("getReactNativeVersionsFromNodeModules", () => {
74 const reactNativePackageDir = path.join(
75 sampleReactNative022ProjectDir,
76 "node_modules",
77 "react-native",
78 );
79 const reactNativeWindowsPackageDir = path.join(
80 sampleReactNative022ProjectDir,
81 "node_modules",
82 "react-native-windows",
83 );
84 const fsHelper = new Node.FileSystem();
85
86 suiteSetup(() => {
87 fsHelper.makeDirectoryRecursiveSync(reactNativePackageDir);
88 fsHelper.makeDirectoryRecursiveSync(reactNativeWindowsPackageDir);
89 });
90
91 suiteTeardown(() => {
92 fsHelper.removePathRecursivelySync(
93 path.join(sampleReactNative022ProjectDir, "node_modules"),
94 );
95 });
96
97 test("getReactNativePackageVersionsFromNodeModules should return object containing packages versions if 'version' field is found in react-native and react-native-windows packages package.json files from node_modules", (done: Mocha.Done) => {
98 const reactNativeVersionObj = {
99 version: "^0.20.0",
100 };
101
102 const reactNativeWindowsVersionObj = {
103 version: "^0.60.0-vnext.68",
104 };
105
106 fs.writeFileSync(
107 path.join(reactNativePackageDir, "package.json"),
108 JSON.stringify(reactNativeVersionObj, null, 2),
109 );
110 fs.writeFileSync(
111 path.join(reactNativeWindowsPackageDir, "package.json"),
112 JSON.stringify(reactNativeWindowsVersionObj, null, 2),
113 );
114
115 let additionalPackages: ParsedPackage[] = [];
116 additionalPackages.push({
117 packageName: "react-native-windows",
118 useSemverCoerce: false,
119 });
120 ProjectVersionHelper.getReactNativePackageVersionsFromNodeModules(
121 sampleReactNative022ProjectDir,
122 additionalPackages,
123 ).then(versions => {
124 assert.strictEqual(versions.reactNativeVersion, "0.20.0");
125 assert.strictEqual(versions.reactNativeWindowsVersion, "0.60.0-vnext.68");
126 done();
127 });
128 });
129
130 test("getReactNativePackageVersionsFromNodeModules should return object containing strings if version field is an URL", () => {
131 const versionObj = {
132 version: "https://github.com/expo/react-native/archive/sdk-35.0.0.tar.gz",
133 };
134
135 fs.writeFileSync(
136 path.join(reactNativePackageDir, "package.json"),
137 JSON.stringify(versionObj, null, 2),
138 );
139
140 return ProjectVersionHelper.getReactNativePackageVersionsFromNodeModules(
141 sampleReactNative022ProjectDir,
142 ).then(versions => {
143 assert.strictEqual(versions.reactNativeVersion, "SemverInvalid: URL");
144 });
145 });
146 });
147
148 test("getReactNativePackageVersionsFromNodeModules should throw ReactNativePackageIsNotInstalled error if the package is not installed", () => {
149 return ProjectVersionHelper.getReactNativePackageVersionsFromNodeModules(
150 sampleReactNative022ProjectDir,
151 ).catch(error => {
152 assert.strictEqual(error.errorCode, 606);
153 });
154 });
155
156 test("isVersionError should return true if a version string contains an error substring", (done: Mocha.Done) => {
157 assert.strictEqual(
158 ProjectVersionHelper.isVersionError(
159 RN_VERSION_ERRORS.MISSING_DEPENDENCIES_FIELDS_IN_PROJECT_PACKAGE_FILE,
160 ),
161 true,
162 );
163 assert.strictEqual(
164 ProjectVersionHelper.isVersionError(RN_VERSION_ERRORS.MISSING_PACKAGE_IN_NODE_MODULES),
165 true,
166 );
167 assert.strictEqual(
168 ProjectVersionHelper.isVersionError(
169 RN_VERSION_ERRORS.MISSING_DEPENDENCY_IN_PROJECT_PACKAGE_FILE,
170 ),
171 true,
172 );
173 assert.strictEqual(
174 ProjectVersionHelper.isVersionError(RN_VERSION_ERRORS.UNKNOWN_ERROR),
175 true,
176 );
177 assert.strictEqual(ProjectVersionHelper.isVersionError("someError"), true);
178 assert.strictEqual(ProjectVersionHelper.isVersionError("ERRORSTRING"), true);
179
180 done();
181 });
182
183 test("isVersionError should return false if a version string doesn't contain an error substring", (done: Mocha.Done) => {
184 assert.strictEqual(ProjectVersionHelper.isVersionError("^0.60.0-vnext.68"), false);
185 assert.strictEqual(
186 ProjectVersionHelper.isVersionError(
187 "https://github.com/expo/react-native/archive/sdk-35.0.0.tar.gz",
188 ),
189 false,
190 );
191 assert.strictEqual(ProjectVersionHelper.isVersionError("SemverInvalid"), false);
192 assert.strictEqual(ProjectVersionHelper.isVersionError("0.61.0"), false);
193 assert.strictEqual(ProjectVersionHelper.isVersionError("SemverInvalid: URL"), false);
194 assert.strictEqual(ProjectVersionHelper.isVersionError("*"), false);
195
196 done();
197 });
198
199 test("processVersion should return semver valid version strings or correct error strings", (done: Mocha.Done) => {
200 assert.strictEqual(
201 ProjectVersionHelper.processVersion("^0.60.0-vnext.68", false),
202 "0.60.0-vnext.68",
203 );
204 assert.strictEqual(
205 ProjectVersionHelper.processVersion("=v0.60.0-vnext.68", false),
206 "0.60.0-vnext.68",
207 );
208 assert.strictEqual(
209 ProjectVersionHelper.processVersion("1.0.0 - 2.9999.9999", false),
210 "SemverInvalid",
211 );
212 assert.strictEqual(ProjectVersionHelper.processVersion("latest", false), "SemverInvalid");
213 assert.strictEqual(ProjectVersionHelper.processVersion("~1.2", false), "SemverInvalid");
214 assert.strictEqual(ProjectVersionHelper.processVersion("2.x", false), "SemverInvalid");
215 assert.strictEqual(ProjectVersionHelper.processVersion(">=1.0.2", false), "1.0.2");
216 assert.strictEqual(ProjectVersionHelper.processVersion("<3.0.0", false), "3.0.0");
217
218 assert.strictEqual(ProjectVersionHelper.processVersion("0.61.0-rc.0"), "0.61.0");
219 assert.strictEqual(ProjectVersionHelper.processVersion("~1.2.3-beta.1"), "1.2.3");
220 assert.strictEqual(ProjectVersionHelper.processVersion("~0.61.3-dev"), "0.61.3");
221 assert.strictEqual(ProjectVersionHelper.processVersion("v0.61.3-dev"), "0.61.3");
222 assert.strictEqual(ProjectVersionHelper.processVersion("^0.61.2.0"), "0.61.2");
223 assert.strictEqual(ProjectVersionHelper.processVersion("0.61.3"), "0.61.3");
224
225 assert.strictEqual(
226 ProjectVersionHelper.processVersion(
227 "https://github.com/expo/react-native/archive/sdk-35.0.0.tar.gz",
228 ),
229 "SemverInvalid: URL",
230 );
231 assert.strictEqual(
232 ProjectVersionHelper.processVersion(
233 "/github.com/expo/react-native/archive/sdk-35.0.0.tar.gz",
234 ),
235 "35.0.0",
236 );
237 assert.strictEqual(
238 ProjectVersionHelper.processVersion("git+https://git@github.com/test/test.git"),
239 "SemverInvalid: URL",
240 );
241 assert.strictEqual(
242 ProjectVersionHelper.processVersion("/github.com/expo/react-native/archive/sdk"),
243 "SemverInvalid",
244 );
245 assert.strictEqual(
246 ProjectVersionHelper.processVersion("qwertyuiop[]asdfghjk"),
247 "SemverInvalid",
248 );
249 assert.strictEqual(
250 ProjectVersionHelper.processVersion("/Users/test/Data"),
251 "SemverInvalid",
252 );
253 assert.strictEqual(
254 ProjectVersionHelper.processVersion("@#.str?/4568-7468/.fd"),
255 "4568.0.0",
256 );
257 assert.strictEqual(ProjectVersionHelper.processVersion("^str.0.61.str.2"), "0.61.0");
258 assert.strictEqual(ProjectVersionHelper.processVersion("qwert 1 asdf"), "1.0.0");
259 assert.strictEqual(ProjectVersionHelper.processVersion("^0.str.str.2"), "0.0.0");
260 assert.strictEqual(ProjectVersionHelper.processVersion(""), "SemverInvalid");
261
262 assert.strictEqual(ProjectVersionHelper.processVersion("1.0.x"), "1.0.0");
263 assert.strictEqual(ProjectVersionHelper.processVersion("*.0.*"), "0.0.0");
264 assert.strictEqual(ProjectVersionHelper.processVersion("~1.*"), "1.0.0");
265 assert.strictEqual(ProjectVersionHelper.processVersion("1.0"), "1.0.0");
266 assert.strictEqual(ProjectVersionHelper.processVersion("~1"), "1.0.0");
267 assert.strictEqual(ProjectVersionHelper.processVersion("*"), "SemverInvalid");
268
269 done();
270 });
271});
272