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