react-native-integrate
Version:
Automate integration of additional code into React Native projects
179 lines (178 loc) • 8.04 kB
JavaScript
;
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');
});
});
});