| /** |
| 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 helpers = require('../spec/helpers'); |
| const cordova = require('../src/cordova/cordova'); |
| |
| const TIMEOUT = 60 * 1000; |
| const plugins_dir = path.join(__dirname, '..', 'spec', 'plugman', 'plugins'); |
| |
| const plugins = { |
| Test1: path.join(plugins_dir, 'dependencies', 'Test1'), |
| Test2: path.join(plugins_dir, 'dependencies', 'Test2'), |
| Test3: path.join(plugins_dir, 'dependencies', 'Test3'), |
| Test4: path.join(plugins_dir, 'dependencies', 'Test4') |
| }; |
| |
| describe('end-to-end plugin dependency tests', function () { |
| helpers.setDefaultTimeout(TIMEOUT); |
| |
| // This prepares a project that we will copy and use for all tests |
| let preparedProject; |
| beforeAll(function () { |
| preparedProject = helpers.tmpDir('plugin_dependency_test_project'); |
| return helpers.getFixture('projectWithPlatform').copyTo(preparedProject); |
| }); |
| |
| afterAll(function () { |
| process.chdir(__dirname); // Needed to rm the dir on Windows. |
| fs.rmSync(preparedProject, { recursive: true, force: true }); |
| }); |
| |
| let tmpDir, project, pluginsDir; |
| beforeEach(function () { |
| tmpDir = helpers.tmpDir('plugin_dependency_test'); |
| project = path.join(tmpDir, 'project'); |
| pluginsDir = path.join(project, 'plugins'); |
| |
| fs.cpSync(preparedProject, project, { recursive: true }); |
| process.chdir(project); |
| delete process.env.PWD; |
| }); |
| |
| afterEach(function () { |
| process.chdir(__dirname); // Needed to rm the dir on Windows. |
| fs.rmSync(tmpDir, { recursive: true, force: true }); |
| }); |
| |
| it('Test 029 : should fail if dependency already installed is wrong version', function () { |
| return Promise.resolve() |
| .then(function () { |
| return cordova.plugin('add', 'cordova-plugin-file'); |
| }).then(function () { |
| expect(path.join(pluginsDir, 'cordova-plugin-file')).toExist(); |
| return cordova.plugin('add', plugins.Test1); |
| }).catch(function (err) { |
| expect(err.message).toContain('does not satisfy dependency plugin requirement'); |
| }); |
| }); |
| |
| it('Test 030 : should pass if dependency already installed is wrong version with --force', function () { |
| return Promise.resolve() |
| .then(function () { |
| return cordova.plugin('add', 'cordova-plugin-file'); |
| }) |
| .then(function () { |
| expect(path.join(pluginsDir, 'cordova-plugin-file')).toExist(); |
| return cordova.plugin('add', plugins.Test1, { force: true }); |
| }) |
| .then(function () { |
| expect(path.join(pluginsDir, 'Test1')).toExist(); |
| }); |
| }); |
| |
| it('Test 031 : should pass if dependency already installed is same major version (if specific version is specified)', function () { |
| // Test1 requires cordova-plugin-file version 2.0.0 (which should automatically turn into ^2.0.0); we'll install version 2.1.0 |
| return Promise.resolve() |
| .then(function () { |
| return cordova.plugin('add', 'cordova-plugin-file@2.1.0'); |
| }) |
| .then(function () { |
| expect(path.join(pluginsDir, 'cordova-plugin-file')).toExist(); |
| return cordova.plugin('add', plugins.Test1); |
| }) |
| .then(function () { |
| expect(path.join(pluginsDir, 'Test1')).toExist(); |
| }); |
| }); |
| |
| it('Test 032 : should handle two plugins with same dependent plugin', function () { |
| // Test1 and Test2 have compatible dependencies on cordova-plugin-file |
| // Test1 and Test3 have incompatible dependencies on cordova-plugin-file |
| return Promise.resolve() |
| .then(function () { |
| return cordova.plugin('add', plugins.Test1); |
| }) |
| .then(function () { |
| expect(path.join(pluginsDir, 'cordova-plugin-file')).toExist(); |
| expect(path.join(pluginsDir, 'Test1')).toExist(); |
| return cordova.plugin('add', plugins.Test2); |
| }) |
| .then(function () { |
| return cordova.plugin('add', plugins.Test3); |
| }) |
| .catch(function (err) { |
| expect(path.join(pluginsDir, 'Test2')).toExist(); |
| expect(path.join(pluginsDir, 'Test3')).not.toExist(); |
| expect(err.message).toContain('does not satisfy dependency plugin requirement'); |
| }); |
| }); |
| |
| it('Test 033 : should use a dev version of a dependent plugin if it is already installed', function () { |
| // Test4 has this dependency in its plugin.xml: |
| // <dependency id="cordova-plugin-file" url="https://github.com/apache/cordova-plugin-file" /> |
| return Promise.resolve() |
| .then(function () { |
| return cordova.plugin('add', 'https://github.com/apache/cordova-plugin-file'); |
| }) |
| .then(function () { |
| return cordova.plugin('add', plugins.Test4); |
| }) |
| .then(function () { |
| expect(path.join(pluginsDir, 'cordova-plugin-file')).toExist(); |
| expect(path.join(pluginsDir, 'Test4')).toExist(); |
| }); |
| }); |
| }); |