| /** |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| http://www.apache.org/licenses/LICENSE-2.0 |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| */ |
| |
| const path = require('node:path'); |
| const fs = require('node:fs'); |
| const rewire = require('rewire'); |
| |
| const { tmpDir: getTmpDir, testPlatform, setDefaultTimeout } = require('../spec/helpers'); |
| const { listPlatforms } = require('../src/cordova/util'); |
| const cordova = require('../src/cordova/cordova'); |
| const plugman = require('../src/plugman/plugman'); |
| |
| const fixturesDir = path.join(__dirname, '..', 'spec', 'cordova', 'fixtures'); |
| const pluginFixturesDir = path.join(fixturesDir, 'plugins'); |
| |
| describe('cordova/platform end-to-end', () => { |
| const TIMEOUT = 240 * 1000; |
| setDefaultTimeout(TIMEOUT); |
| |
| let tmpDir, project, pluginsDir, platformsDir, nodeModulesDir, testPlatformDir; |
| |
| beforeEach(() => { |
| tmpDir = getTmpDir('cordova-platform-e2e-test'); |
| project = path.join(tmpDir, 'project'); |
| pluginsDir = path.join(project, 'plugins'); |
| platformsDir = path.join(project, 'platforms'); |
| nodeModulesDir = path.join(project, 'node_modules'); |
| testPlatformDir = path.join(platformsDir, testPlatform); |
| |
| fs.cpSync(path.join(fixturesDir, 'basePkgJson'), project, { recursive: true }); |
| process.chdir(project); |
| }); |
| |
| afterEach(() => { |
| process.chdir(__dirname); // Needed to rm the dir on Windows. |
| fs.rmSync(tmpDir, { recursive: true, force: true }); |
| }); |
| |
| function installedPlatforms () { |
| return listPlatforms(project); |
| } |
| |
| it('Test 001 : should successfully run', () => { |
| // Check there are no platforms yet. |
| expect(installedPlatforms()).toEqual([]); |
| |
| return Promise.resolve() |
| .then(() => { |
| // Add the testing platform. |
| return cordova.platform('add', [testPlatform]); |
| }) |
| .then(() => { |
| // Check the platform add was successful. |
| expect(testPlatformDir).toExist(); |
| expect(path.join(testPlatformDir, 'cordova')).toExist(); |
| expect(installedPlatforms()).toEqual([testPlatform]); |
| }) |
| .then(() => { |
| // Spy on Api.updatePlatform since it always rejects otherwise |
| const Api = require(path.join(nodeModulesDir, 'cordova-android')); |
| spyOn(Api, 'updatePlatform').and.returnValue(Promise.resolve()); |
| spyOn(require('../src/cordova/util'), 'getPlatformApiFunction').and.returnValue(Api); |
| |
| return cordova.platform('update', [testPlatform]).then(_ => Api); |
| }) |
| .then(Api => { |
| expect(Api.updatePlatform).toHaveBeenCalled(); |
| // Platform should still be in platform ls. |
| expect(installedPlatforms()).toEqual([testPlatform]); |
| }) |
| .then(() => { |
| // And now remove it. |
| return cordova.platform('rm', [testPlatform]); |
| }) |
| .then(() => { |
| // It should be gone. |
| expect(testPlatformDir).not.toExist(); |
| expect(installedPlatforms()).toEqual([]); |
| }); |
| }); |
| |
| it('Test 002 : should install plugins correctly while adding platform', () => { |
| spyOn(plugman, 'install').and.callThrough(); |
| const prepare = require('../src/cordova/prepare'); |
| const prepareSpy = jasmine.createSpy('prepare', prepare).and.callThrough(); |
| Object.assign(prepareSpy, prepare); |
| |
| // This is all just to get the prepareSpy to be used by `platform.add` |
| const platform = rewire('../src/cordova/platform'); |
| const addHelper = rewire('../src/cordova/platform/addHelper'); |
| const requireFake = jasmine.createSpy('require', addHelper.__get__('require')).and.callThrough(); |
| requireFake.withArgs('../prepare').and.returnValue(prepareSpy); |
| addHelper.__set__({ require: requireFake }); |
| platform.__set__({ addHelper }); |
| |
| return Promise.resolve() |
| .then(() => { |
| return cordova.plugin('add', path.join(pluginFixturesDir, 'test')); |
| }) |
| .then(() => { |
| return platform('add', [testPlatform]); |
| }) |
| .then(() => { |
| // Check the platform add was successful. |
| expect(testPlatformDir).toExist(); |
| // Check that plugin files exists in www dir |
| expect(path.join(testPlatformDir, 'platform_www/test.js')).toExist(); |
| // should call prepare after plugins were installed into platform |
| expect(plugman.install).toHaveBeenCalledBefore(prepareSpy); |
| }); |
| }); |
| |
| it('Test 007 : should add and remove platform from node_modules directory', () => { |
| return Promise.resolve() |
| .then(() => { |
| return cordova.platform('add', 'ios', { save: true }); |
| }) |
| .then(() => { |
| expect(path.join(nodeModulesDir, 'cordova-ios')).toExist(); |
| expect(path.join(platformsDir, 'ios')).toExist(); |
| return cordova.platform('add', 'android@9.0.0'); |
| }) |
| .then(() => { |
| expect(path.join(nodeModulesDir, 'cordova-android')).toExist(); |
| expect(path.join(platformsDir, 'android')).toExist(); |
| return cordova.platform('rm', 'ios', { save: true }); |
| }) |
| .then(() => { |
| expect(path.join(nodeModulesDir, 'cordova-ios')).not.toExist(); |
| expect(path.join(platformsDir, 'ios')).not.toExist(); |
| return cordova.platform('rm', 'android', { save: true }); |
| }) |
| .then(() => { |
| expect(path.join(nodeModulesDir, 'cordova-android')).not.toExist(); |
| expect(path.join(platformsDir, 'android')).not.toExist(); |
| }); |
| }); |
| |
| it('Test 008 : should remove dependency when removing parent plugin', () => { |
| return Promise.resolve() |
| .then(() => { |
| return cordova.platform('add', testPlatform); |
| }) |
| .then(() => { |
| return cordova.plugin('add', 'cordova-plugin-media', { save: true }); |
| }) |
| .then(() => { |
| expect(path.join(pluginsDir, 'cordova-plugin-media')).toExist(); |
| expect(path.join(pluginsDir, 'cordova-plugin-file')).toExist(); |
| expect(path.join(nodeModulesDir, 'cordova-plugin-media')).toExist(); |
| expect(path.join(nodeModulesDir, 'cordova-plugin-file')).toExist(); |
| return cordova.plugin('rm', 'cordova-plugin-media', { save: true }); |
| }) |
| .then(() => { |
| expect(path.join(pluginsDir, 'cordova-plugin-media')).not.toExist(); |
| expect(path.join(pluginsDir, 'cordova-plugin-file')).not.toExist(); |
| expect(path.join(nodeModulesDir, 'cordova-plugin-media')).not.toExist(); |
| expect(path.join(nodeModulesDir, 'cordova-plugin-file')).not.toExist(); |
| }); |
| }); |
| |
| it('Test 009 : should add and remove 3rd party platforms', () => { |
| return Promise.resolve() |
| .then(() => { |
| // add cordova-android instead of android |
| return cordova.platform('add', 'cordova-android@9.0.0'); |
| }) |
| .then(() => { |
| // 3rd party platform from npm |
| return cordova.platform('add', 'cordova-platform-test'); |
| }) |
| .then(() => { |
| expect(path.join(platformsDir, 'android')).toExist(); |
| expect(path.join(platformsDir, 'cordova-platform-test')).toExist(); |
| expect(installedPlatforms()).toEqual(jasmine.arrayWithExactContents([ |
| 'android', 'cordova-platform-test' |
| ])); |
| }); |
| }); |
| }); |