UNPKG

react-native-integrate

Version:

Automate integration of additional code into React Native projects

179 lines (178 loc) 8.04 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); require('../../../../mocks/mockAll'); const mockSpawn = jest.spyOn(require('child_process'), 'spawn'); const path_1 = __importDefault(require("path")); const constants_1 = require("../../../../../constants"); const getProjectPath_1 = require("../../../../../utils/getProjectPath"); const importPackageJson_1 = require("../../../../../utils/upgrade/other/importPackageJson"); const mockFs_1 = require("../../../../mocks/mockFs"); const mockPrompter_1 = require("../../../../mocks/mockPrompter"); describe('importPackageJson', () => { it('should get package.json', async () => { mockFs_1.mockFs.writeFileSync('/oldProject/' + constants_1.Constants.PACKAGE_JSON_FILE_NAME, JSON.stringify({ name: 'test', version: '1.0.0', description: 'old', scripts: { start: 'start', }, dependencies: { 'react-native': '1.0.0', 'mock-package': '1.0.0', 'non-integrated-mock-package': '1.0.0', }, devDependencies: { 'some-package': '1.0.0', }, something: 'value', engines: { node: '>=14', }, }, null, 2)); const importGetter = (0, importPackageJson_1.importPackageJson)('/oldProject'); expect(importGetter).toBeTruthy(); expect(importGetter.value).toEqual('test@1.0.0'); await importGetter.apply(); expect(mockFs_1.mockFs.readFileSync(path_1.default.join((0, getProjectPath_1.getProjectPath)(), constants_1.Constants.PACKAGE_JSON_FILE_NAME))).toContain('non-integrated-mock-package'); }); it('should get package.json on windows', async () => { mockFs_1.mockFs.writeFileSync('/oldProject/' + constants_1.Constants.PACKAGE_JSON_FILE_NAME, JSON.stringify({ name: 'test', dependencies: { 'react-native': '1.0.0', 'some-package': '1.0.0', }, }, null, 2)); const originalPlatform = process.platform; Object.defineProperty(process, 'platform', { value: 'win32', }); const importGetter = (0, importPackageJson_1.importPackageJson)('/oldProject'); await importGetter.apply(); Object.defineProperty(process, 'platform', { value: originalPlatform, }); }); it('should handle errors', () => { mockFs_1.mockFs.setReadPermission(false); mockFs_1.mockFs.writeFileSync('/oldProject/' + constants_1.Constants.PACKAGE_JSON_FILE_NAME, ''); const importGetter = (0, importPackageJson_1.importPackageJson)('/oldProject'); expect(importGetter).toBeNull(); }); it('should handle not finding react-native in package lock', () => { mockFs_1.mockFs.writeFileSync('/oldProject/' + constants_1.Constants.PACKAGE_JSON_FILE_NAME, JSON.stringify({ name: 'test', version: '1.0.0', dependencies: { 'mock-package': '1.0.0', 'non-integrated-mock-package': '1.0.0', }, }, null, 2)); const importGetter = (0, importPackageJson_1.importPackageJson)('/oldProject'); expect(importGetter).toBeNull(); }); it('should remove deprecated packages', async () => { mockFs_1.mockFs.writeFileSync('/oldProject/' + constants_1.Constants.PACKAGE_JSON_FILE_NAME, JSON.stringify({ name: 'test', dependencies: { 'react-native': '1.0.0', 'some-package': '1.0.0', }, devDependencies: { 'dev-package': '1.0.0', }, }, null, 2)); const importGetter = (0, importPackageJson_1.importPackageJson)('/oldProject'); await importGetter.apply(); expect(mockFs_1.mockFs.readFileSync(path_1.default.join((0, getProjectPath_1.getProjectPath)(), constants_1.Constants.PACKAGE_JSON_FILE_NAME))).not.toContain('some-package'); expect(mockFs_1.mockFs.readFileSync(path_1.default.join((0, getProjectPath_1.getProjectPath)(), constants_1.Constants.PACKAGE_JSON_FILE_NAME))).not.toContain('dev-package'); }); describe('installModules', () => { it('should install modules', async () => { mockFs_1.mockFs.writeFileSync('/oldProject/' + constants_1.Constants.PACKAGE_JSON_FILE_NAME, JSON.stringify({ name: 'test', dependencies: { 'react-native': '1.0.0', 'some-package': '1.0.0', }, }, null, 2)); mockSpawn.mockImplementationOnce(() => ({ on: (_event, cb) => { cb(0); }, stdout: { on: (_event, cb) => { cb('stdout'); }, }, stderr: { on: (_event, cb) => { cb('stderr'); }, }, })); const originalPlatform = process.platform; Object.defineProperty(process, 'platform', { value: 'win32', }); await (0, importPackageJson_1.installModules)('/oldProject'); expect(mockSpawn).toHaveBeenCalledWith('npm', ['install'], { shell: true, cwd: (0, getProjectPath_1.getProjectPath)(), }); Object.defineProperty(process, 'platform', { value: originalPlatform, }); }); it('should handle failed module installation', async () => { mockFs_1.mockFs.writeFileSync('/oldProject/' + constants_1.Constants.PACKAGE_JSON_FILE_NAME, JSON.stringify({ name: 'test', dependencies: { 'react-native': '1.0.0', 'some-package': '1.0.0', }, }, null, 2)); mockSpawn.mockImplementationOnce(() => ({ on: (_event, cb) => { cb(1); }, stdout: { on: (_event, cb) => { cb('stdout'); }, }, stderr: { on: (_event, cb) => { cb('stderr'); }, }, })); mockPrompter_1.mockPrompter.multiselect.mockClear(); await (0, importPackageJson_1.installModules)('/oldProject'); expect(mockPrompter_1.mockPrompter.multiselect).toHaveBeenCalled(); }); }); describe('getInstallCommand', () => { it('should ask user when multiple lock exists', async () => { mockFs_1.mockFs.writeFileSync('/oldProject/package-lock.json', ''); mockFs_1.mockFs.writeFileSync('/oldProject/yarn.lock', ''); mockFs_1.mockFs.writeFileSync('/oldProject/pnpm-lock.yaml', ''); mockFs_1.mockFs.writeFileSync('/oldProject/bun.lockb', ''); mockPrompter_1.mockPrompter.select.mockClear(); const cmd = await (0, importPackageJson_1.getInstallCommand)('/oldProject'); expect(mockPrompter_1.mockPrompter.select).toHaveBeenCalled(); expect(cmd).toEqual('npm install'); }); it('should proceed when single lock exists', async () => { mockFs_1.mockFs.writeFileSync('/oldProject/yarn.lock', ''); mockPrompter_1.mockPrompter.select.mockClear(); const cmd = await (0, importPackageJson_1.getInstallCommand)('/oldProject'); expect(mockPrompter_1.mockPrompter.select).not.toHaveBeenCalled(); expect(cmd).toEqual('yarn install'); }); }); });