blob: 161f6f555c48fe7ccdfed997f3b125c81e7a7149 [file] [log] [blame]
/**
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.
*/
var fs = require('fs');
var os = require('os');
var et = require('elementtree');
var path = require('path');
var shell = require('shelljs');
var rewire = require('rewire');
var PluginHandler = rewire('../../../template/cordova/lib/PluginHandler');
var JsprojManager = require('../../../template/cordova/lib/JsprojManager');
var cordovaProjectDir = path.join(os.tmpdir(), 'plugman');
var cordovaProjectWindowsPlatformDir = path.join(cordovaProjectDir, 'platforms', 'windows');
var cordovaProjectPluginsDir = path.join(cordovaProjectDir, 'plugins');
var PluginInfo = require('cordova-common').PluginInfo;
var dummyplugin = path.join(__dirname, '../fixtures/testProj/plugins/org.test.plugins.dummyplugin');
var dummyPluginInfo = new PluginInfo(dummyplugin);
var valid_source = dummyPluginInfo.getSourceFiles('windows');
var valid_resourceFiles = dummyPluginInfo.getResourceFiles('windows');
var valid_libfiles = dummyPluginInfo.getLibFiles('windows');
var valid_frameworks = dummyPluginInfo.getFrameworks('windows');
var faultyplugin = path.join(__dirname, '../fixtures/org.test.plugins.faultyplugin');
var faultyPluginInfo = new PluginInfo(faultyplugin);
var invalid_source = faultyPluginInfo.getSourceFiles('windows');
var invalid_resourceFiles = faultyPluginInfo.getResourceFiles('windows');
var invalid_libfiles = faultyPluginInfo.getLibFiles('windows');
function copyArray(arr) {
return Array.prototype.slice.call(arr, 0);
}
function winJoin() {
// use Node API when possible
if (path.win32) return path.win32.join.apply(path, arguments);
return copyArray(arguments).join('\\').replace(/\//g, '\\');
}
beforeEach(function () {
this.addMatchers({
toContainXmlPath: function (xpath) {
var xml = this.actual;
var notText = this.isNot ? 'not ' : '';
this.message = function () {
return 'Expected xml \'' + et.tostring(xml) + '\' ' + notText + 'to contain elements matching \'' + xpath + '\'.';
};
return xml.find(xpath) !== null;
}
});
});
var getPluginFilePath = PluginHandler.__get__('getPluginFilePath');
var computeResourcePath = function(resourceFile) {
return getPluginFilePath(dummyPluginInfo, resourceFile.src, cordovaProjectWindowsPlatformDir);
};
var PLATFORM_PROJECTS = {
all: 'CordovaApp.projitems',
phone: 'CordovaApp.Phone.jsproj',
windows: 'CordovaApp.Windows.jsproj',
windows8: 'CordovaApp.Windows80.jsproj',
windows10: 'CordovaApp.Windows10.jsproj'
};
describe('windows project handler', function () {
var dummyProject;
beforeEach(function () {
shell.mkdir('-p', cordovaProjectWindowsPlatformDir);
shell.cp('-rf', path.join(__dirname, '../fixtures/DummyProject/*'), cordovaProjectWindowsPlatformDir);
dummyProject = JsprojManager.getProject(cordovaProjectWindowsPlatformDir);
shell.mkdir('-p', cordovaProjectPluginsDir);
shell.cp('-rf', dummyplugin, cordovaProjectPluginsDir);
// CB-11558 Reinitialize plugin.dir to become project_root/plugins/plugin.id to avoid
// different drives issue resulting in absolute path in projectReferences.
dummyPluginInfo = new PluginInfo(path.join(cordovaProjectPluginsDir, dummyPluginInfo.id));
});
afterEach(function () {
shell.rm('-rf', cordovaProjectDir);
});
describe('installation', function () {
var copyFileOrig = PluginHandler.__get__('copyFile');
var copyFileSpy = jasmine.createSpy('copyFile');
beforeEach(function () {
PluginHandler.__set__('copyFile', copyFileSpy.andCallFake(copyFileOrig));
});
afterEach(function() {
PluginHandler.__set__('copyFile', copyFileOrig);
});
function validateInstalledProjects(tag, elementToInstall, xpath, supportedPlatforms) {
jasmine.getEnv().currentSpec.removeAllSpies();
var projects = copyArray(dummyProject.projects);
projects.push(dummyProject.master);
// Check that installed framework reference is properly added to project.
var checkInstalledFrameworkReference = function (tag, elementToInstall, xml) {
var frameworkCustomPathElement = xml.find(xpath);
expect(frameworkCustomPathElement).not.toBe(null);
var frameworkCustomPath = frameworkCustomPathElement.text;
expect(frameworkCustomPath).not.toBe(null);
var targetDir = elementToInstall.targetDir || '';
var frameworkCustomExpectedPath = path.join('plugins', dummyPluginInfo.id, targetDir,
path.basename(elementToInstall.src));
expect(frameworkCustomPath).toEqual(frameworkCustomExpectedPath);
};
// Check that framework file was copied to correct path
var checkInstalledFrameworkPath = function (framework) {
var targetDir = framework.targetDir || '';
var dest = path.join(cordovaProjectWindowsPlatformDir, 'plugins', dummyPluginInfo.id, targetDir, path.basename(framework.src));
var copiedSuccessfully = fs.existsSync(path.resolve(dest));
expect(copiedSuccessfully).toBe(true);
};
var appendToRootFake = function (itemGroup) {
// In case we install framework with 'custom' attribute set to 'true'
// we verify that file is copied to correct dir and reference is added properly.
// This is not required in case of 'projectReference' attribute is used.
if (tag === 'framework' && elementToInstall.type !== 'projectReference') {
checkInstalledFrameworkReference(tag, elementToInstall, itemGroup);
checkInstalledFrameworkPath(elementToInstall);
return;
}
expect(itemGroup).toContainXmlPath(xpath);
};
var projectsAddedToSpies = [];
var projectsNotAddedToSpies = [];
var projectsAddedTo = [];
supportedPlatforms.forEach(function (platform) {
var platformProject = PLATFORM_PROJECTS[platform];
if (platformProject) {
projectsAddedTo.push(PLATFORM_PROJECTS[platform]);
}
});
projects.forEach(function (project) {
if (projectsAddedTo.indexOf(path.basename(project.location)) > -1) {
projectsAddedToSpies.push(spyOn(project, 'appendToRoot').andCallFake(appendToRootFake));
} else {
projectsNotAddedToSpies.push(spyOn(project, 'appendToRoot'));
}
});
PluginHandler.getInstaller(tag)(elementToInstall, dummyPluginInfo, dummyProject);
projectsAddedToSpies.forEach(function (spy) {
expect(spy).toHaveBeenCalled();
});
projectsNotAddedToSpies.forEach(function (spy) {
expect(spy).not.toHaveBeenCalled();
});
}
describe('of <source-file> elements', function () {
var install = PluginHandler.getInstaller('source-file');
it('should copy stuff from one location to another by calling common.copyFile', function () {
var source = copyArray(valid_source);
install(source[0], dummyPluginInfo, dummyProject);
expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, 'src/windows/dummer.js', cordovaProjectWindowsPlatformDir, path.join('plugins', 'org.test.plugins.dummyplugin', 'dummer.js'), false);
});
it('should throw if source-file src cannot be found', function () {
var source = copyArray(invalid_source);
copyFileSpy.andCallFake(copyFileOrig);
expect(function () {
install(source[1], faultyPluginInfo, dummyProject);
}).toThrow('"' + path.resolve(faultyplugin, 'src/windows/NotHere.js') + '" not found!');
});
it('should throw if source-file target already exists', function () {
var source = copyArray(valid_source);
var target = path.join(cordovaProjectWindowsPlatformDir, 'plugins', dummyPluginInfo.id, 'dummer.js');
shell.mkdir('-p', path.dirname(target));
fs.writeFileSync(target, 'some bs', 'utf-8');
expect(function () {
install(source[0], dummyPluginInfo, dummyProject);
}).toThrow('"' + target + '" already exists!');
});
});
describe('of <resource-file> elements', function () {
var resourceFiles = copyArray(valid_resourceFiles);
var invalidResourceFiles = copyArray(invalid_resourceFiles);
var install = PluginHandler.getInstaller('resource-file');
// This could be separated into individual specs, but that results in a lot of copying and deleting the
// project files, which is not needed.
it('should write to correct project files when conditions are specified', function () {
var xpath = 'Content[@Include="' + computeResourcePath(resourceFiles[0]) + '"][@Condition="\'$(Platform)\'==\'x86\'"]';
validateInstalledProjects('resource-file', resourceFiles[0], xpath, ['all']);
xpath = 'Content[@Include="' + computeResourcePath(resourceFiles[1]) + '"]';
validateInstalledProjects('resource-file', resourceFiles[1], xpath, ['windows', 'phone', 'windows10']);
xpath = 'Content[@Include="' + computeResourcePath(resourceFiles[2]) + '"]';
validateInstalledProjects('resource-file', resourceFiles[2], xpath, ['phone']);
xpath = 'Content[@Include="' + computeResourcePath(resourceFiles[3]) + '"][@Condition="\'$(Platform)\'==\'x64\'"]';
validateInstalledProjects('resource-file', resourceFiles[3], xpath, ['windows8']);
});
it('should throw if conditions are invalid', function () {
expect(function () {
install(invalidResourceFiles[0], faultyPluginInfo, dummyProject);
}).toThrow('Invalid arch attribute (must be "x86", "x64" or "ARM"): x85');
expect(function () {
install(invalidResourceFiles[1], faultyPluginInfo, dummyProject);
}).toThrow('Invalid versions attribute (must be a valid semantic version range): 8.0a');
expect(function () {
install(invalidResourceFiles[2], faultyPluginInfo, dummyProject);
}).toThrow('Invalid device-target attribute (must be "all", "phone", "windows" or "win"): daphne');
});
});
describe('of <lib-file> elements', function () {
var libfiles = copyArray(valid_libfiles);
var invalidLibFiles = copyArray(invalid_libfiles);
var install = PluginHandler.getInstaller('lib-file');
// This could be separated into individual specs, but that results in a lot of copying and deleting the
// project files, which is not needed.
it('should write to correct project files when conditions are specified', function () {
var xpath = 'SDKReference[@Include="TestSDK1, Version=1.0"][@Condition="\'$(Platform)\'==\'x86\'"]';
validateInstalledProjects('lib-file', libfiles[0], xpath, ['all']);
xpath = 'SDKReference[@Include="TestSDK2, Version=1.0"]';
validateInstalledProjects('lib-file', libfiles[1], xpath, ['windows', 'phone', 'windows10']);
xpath = 'SDKReference[@Include="TestSDK3, Version=1.0"]';
validateInstalledProjects('lib-file', libfiles[2], xpath, ['phone']);
xpath = 'SDKReference[@Include="TestSDK4, Version=1.0"]';
validateInstalledProjects('lib-file', libfiles[3], xpath, ['windows8']);
});
it('should throw if conditions are invalid', function () {
expect(function () {
install(invalidLibFiles[0], faultyPluginInfo, dummyProject);
}).toThrow('Invalid arch attribute (must be "x86", "x64" or "ARM"): x85');
expect(function () {
install(invalidLibFiles[1], faultyPluginInfo, dummyProject);
}).toThrow('Invalid versions attribute (must be a valid semantic version range): 8.0a');
expect(function () {
install(invalidLibFiles[2], faultyPluginInfo, dummyProject);
}).toThrow('Invalid device-target attribute (must be "all", "phone", "windows" or "win"): daphne');
});
});
describe('of <framework> elements', function () {
var frameworks = copyArray(valid_frameworks);
// This could be separated into individual specs, but that results in a lot of copying and deleting the
// project files, which is not needed.
it('should write to correct project files when conditions are specified', function () {
var xpath = 'Reference[@Include="dummy1"][@Condition="\'$(Platform)\'==\'x64\'"]/HintPath';
validateInstalledProjects('framework', frameworks[0], xpath, ['all']);
xpath = 'Reference[@Include="dummy2"]/HintPath';
validateInstalledProjects('framework', frameworks[1], xpath, ['all']);
xpath = 'Reference[@Include="dummy3"]/HintPath';
validateInstalledProjects('framework', frameworks[2], xpath, ['windows', 'windows8', 'windows10']);
xpath = 'Reference[@Include="dummy4"][@Condition="\'$(Platform)\'==\'ARM\'"]/HintPath';
validateInstalledProjects('framework', frameworks[3], xpath, ['phone']);
xpath = 'Reference[@Include="dummy5"]/HintPath';
validateInstalledProjects('framework', frameworks[4], xpath, ['phone']);
xpath = 'Reference[@Include="dummy6"]/HintPath';
validateInstalledProjects('framework', frameworks[5], xpath, ['windows', 'windows10', 'phone']);
});
});
describe('of <framework> elements of type \'projectReference\'', function () {
var frameworks = copyArray(valid_frameworks);
it('should write to correct project files when conditions are specified', function () {
var curDir;
var xpath;
curDir = __dirname;
process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
xpath = 'ProjectReference[@Include="' + winJoin('..', '..', 'plugins', 'org.test.plugins.dummyplugin', 'src', 'windows', 'dummy1.vcxproj') + '"][@Condition="\'$(Platform)\'==\'x64\'"]';
validateInstalledProjects('framework', frameworks[6], xpath, ['all']);
xpath = 'ProjectReference[@Include="' + winJoin('..', '..', 'plugins', 'org.test.plugins.dummyplugin', 'src', 'windows', 'dummy2.vcxproj') + '"]';
validateInstalledProjects('framework', frameworks[7], xpath, ['windows8']);
xpath = 'ProjectReference[@Include="' + winJoin('..', '..', 'plugins', 'org.test.plugins.dummyplugin', 'src', 'windows', 'dummy3.vcxproj') + '"]';
validateInstalledProjects('framework', frameworks[8], xpath, ['windows', 'windows8', 'windows10']);
xpath = 'ProjectReference[@Include="' + winJoin('..', '..', 'plugins', 'org.test.plugins.dummyplugin', 'src', 'windows', 'dummy4.vcxproj') + '"]';
validateInstalledProjects('framework', frameworks[9], xpath, ['windows', 'phone']);
process.chdir(path.join(curDir, '..', '..', '..'));
});
});
describe('of <js-module> elements', function() {
var jsModule = {src: 'www/dummyplugin.js'};
var wwwDest, platformWwwDest;
var install = PluginHandler.getInstaller('js-module');
beforeEach(function () {
spyOn(fs, 'writeFileSync');
wwwDest = path.resolve(dummyProject.www, 'plugins', dummyPluginInfo.id, jsModule.src);
platformWwwDest = path.resolve(dummyProject.platformWww, 'plugins', dummyPluginInfo.id, jsModule.src);
});
it('should put module to both www and platform_www when options.usePlatformWww flag is specified', function () {
install(jsModule, dummyPluginInfo, dummyProject, {usePlatformWww: true});
expect(fs.writeFileSync).toHaveBeenCalledWith(wwwDest, jasmine.any(String), 'utf-8');
expect(fs.writeFileSync).toHaveBeenCalledWith(platformWwwDest, jasmine.any(String), 'utf-8');
});
it('should put module to www only when options.usePlatformWww flag is not specified', function () {
install(jsModule, dummyPluginInfo, dummyProject);
expect(fs.writeFileSync).toHaveBeenCalledWith(wwwDest, jasmine.any(String), 'utf-8');
expect(fs.writeFileSync).not.toHaveBeenCalledWith(platformWwwDest, jasmine.any(String), 'utf-8');
});
});
describe('of <asset> elements', function() {
var asset = {src: 'www/dummyplugin.js', target: 'foo/dummy.js'};
var wwwDest, platformWwwDest;
var install = PluginHandler.getInstaller('asset');
beforeEach(function () {
copyFileSpy.reset();
wwwDest = path.resolve(dummyProject.www, asset.target);
platformWwwDest = path.resolve(dummyProject.platformWww, asset.target);
});
it('should put asset to both www and platform_www when options.usePlatformWww flag is specified', function () {
install(asset, dummyPluginInfo, dummyProject, {usePlatformWww: true});
expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.www, asset.target);
expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.platformWww, asset.target);
});
it('should put asset to www only when options.usePlatformWww flag is not specified', function () {
install(asset, dummyPluginInfo, dummyProject);
expect(copyFileSpy).toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.www, asset.target);
expect(copyFileSpy).not.toHaveBeenCalledWith(dummyPluginInfo.dir, asset.src, dummyProject.platformWww, asset.target);
});
});
});
describe('uninstallation', function () {
var removeFileOrig = PluginHandler.__get__('removeFile');
var removeFileSpy = jasmine.createSpy('removeFile');
beforeEach(function () {
PluginHandler.__set__('removeFile', removeFileSpy.andCallFake(removeFileOrig));
});
afterEach(function () {
PluginHandler.__set__('removeFile', removeFileOrig);
});
function validateUninstalledProjects(tag, elementToUninstall, xmlPath, incText, targetConditions, supportedPlatforms) {
jasmine.getEnv().currentSpec.removeAllSpies();
var projects = copyArray(dummyProject.projects);
projects.push(dummyProject.master);
var projectsAddedToSpies = [];
var projectsNotAddedToSpies = [];
var projectsAddedTo = [];
supportedPlatforms.forEach(function (platform) {
var platformProject = PLATFORM_PROJECTS[platform];
if (platformProject) {
projectsAddedTo.push(PLATFORM_PROJECTS[platform]);
}
});
projects.forEach(function (project) {
var spy = spyOn(project, 'removeItemGroupElement');
if (projectsAddedTo.indexOf(path.basename(project.location)) > -1) {
projectsAddedToSpies.push(spy);
} else {
projectsNotAddedToSpies.push(spy);
}
});
PluginHandler.getUninstaller(tag)(elementToUninstall, dummyPluginInfo, dummyProject);
projectsAddedToSpies.forEach(function (spy) {
expect(spy).toHaveBeenCalledWith(xmlPath, incText, targetConditions);
});
projectsNotAddedToSpies.forEach(function (spy) {
expect(spy).not.toHaveBeenCalled();
});
}
describe('of <source-file> elements', function () {
var install = PluginHandler.getInstaller('source-file');
var uninstall = PluginHandler.getUninstaller('source-file');
it('should remove stuff by calling common.removeFile', function () {
var source = copyArray(valid_source);
install(source[0], dummyPluginInfo, dummyProject);
uninstall(source[0], dummyPluginInfo, dummyProject);
expect(removeFileSpy).toHaveBeenCalledWith(cordovaProjectWindowsPlatformDir, path.join('plugins', 'org.test.plugins.dummyplugin', 'dummer.js'));
});
});
describe('of <resource-file> elements', function () {
// This could be separated into individual specs, but that results in a lot of copying and deleting the
// project files, which is not needed.
var install = PluginHandler.getInstaller('resource-file');
it('should remove from correct project files when conditions specified', function () {
var resourcefiles = copyArray(valid_resourceFiles);
resourcefiles.forEach(function(resourceFile) {
install(resourceFile, dummyPluginInfo, dummyProject);
});
var path = 'ItemGroup/Content';
var incText = computeResourcePath(resourcefiles[0]);
var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x86'};
validateUninstalledProjects('resource-file', resourcefiles[0], path, incText, targetConditions, ['all']);
incText = computeResourcePath(resourcefiles[1]);
targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
validateUninstalledProjects('resource-file', resourcefiles[1], path, incText, targetConditions, ['windows', 'phone', 'windows10']);
incText = computeResourcePath(resourcefiles[2]);
targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
validateUninstalledProjects('resource-file', resourcefiles[2], path, incText, targetConditions, ['phone']);
incText = computeResourcePath(resourcefiles[3]);
targetConditions = {versions: '8.0', deviceTarget: 'windows', arch: 'x64'};
validateUninstalledProjects('resource-file', resourcefiles[3], path, incText, targetConditions, ['windows8']);
});
});
describe('of <lib-file> elements', function () {
// This could be separated into individual specs, but that results in a lot of copying and deleting the
// project files, which is not needed.
it('should remove from correct project files when conditions specified', function () {
var libfiles = copyArray(valid_libfiles);
libfiles.forEach(function(libfile) {
PluginHandler.getInstaller('lib-file')(libfile, dummyPluginInfo, dummyProject);
});
var path = 'ItemGroup/SDKReference';
var incText = 'TestSDK1, Version=1.0';
var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x86'};
validateUninstalledProjects('lib-file', libfiles[0], path, incText, targetConditions, ['all']);
incText = 'TestSDK2, Version=1.0';
targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
validateUninstalledProjects('lib-file', libfiles[1], path, incText, targetConditions, ['windows', 'phone', 'windows10']);
incText = 'TestSDK3, Version=1.0';
targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
validateUninstalledProjects('lib-file', libfiles[2], path, incText, targetConditions, ['phone']);
incText = 'TestSDK4, Version=1.0';
targetConditions = {versions: '8.0', deviceTarget: 'windows', arch: 'x86'};
validateUninstalledProjects('lib-file', libfiles[3], path, incText, targetConditions, ['windows8']);
});
});
describe('of <framework> elements', function () {
// This could be separated into individual specs, but that results in a lot of copying and deleting the
// project files, which is not needed.
it('should remove from correct project files when conditions specified', function () {
var curDir;
curDir = __dirname;
process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
var frameworks = copyArray(valid_frameworks);
frameworks.forEach(function(framework) {
PluginHandler.getInstaller('framework')(framework, dummyPluginInfo, dummyProject);
});
var path2 = 'ItemGroup/Reference';
var incText = 'dummy1';
var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x64'};
validateUninstalledProjects('framework', frameworks[0], path2, incText, targetConditions, ['all']);
incText = 'dummy2';
targetConditions = {versions: '>=8.0', deviceTarget: undefined, arch: undefined};
validateUninstalledProjects('framework', frameworks[1], path2, incText, targetConditions, ['all']);
incText = 'dummy3';
targetConditions = {versions: undefined, deviceTarget: 'windows', arch: undefined};
validateUninstalledProjects('framework', frameworks[2], path2, incText, targetConditions, ['windows', 'windows8', 'windows10']);
incText = 'dummy4';
targetConditions = {versions: '8.1', deviceTarget: 'phone', arch: 'ARM'};
validateUninstalledProjects('framework', frameworks[3], path2, incText, targetConditions, ['phone']);
incText = 'dummy5';
targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
validateUninstalledProjects('framework', frameworks[4], path2, incText, targetConditions, ['phone']);
incText = 'dummy6';
targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
validateUninstalledProjects('framework', frameworks[5], path2, incText, targetConditions, ['windows', 'windows10', 'phone']);
process.chdir(path.join(curDir, '..', '..', '..'));
});
});
describe('of <framework> elements of type \'projectReference\'', function () {
// This could be separated into individual specs, but that results in a lot of copying and deleting the
// project files, which is not needed.
it('should remove from correct project files when conditions specified', function () {
var curDir;
curDir = __dirname;
process.chdir(path.join(curDir, '..', 'fixtures', 'testProj'));
var frameworks = copyArray(valid_frameworks);
frameworks.forEach(function(framework) {
PluginHandler.getInstaller('framework')(framework, dummyPluginInfo, dummyProject);
});
var xmlPath = 'ItemGroup/ProjectReference';
var incText = winJoin('..', '..', 'plugins', dummyPluginInfo.id, frameworks[6].src);
var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x64'};
validateUninstalledProjects('framework', frameworks[6], xmlPath, incText, targetConditions, ['all']);
incText = winJoin('..', '..', 'plugins', dummyPluginInfo.id, frameworks[7].src);
targetConditions = {versions: '<8.1', deviceTarget: undefined, arch: undefined};
validateUninstalledProjects('framework', frameworks[7], xmlPath, incText, targetConditions, ['windows8']);
incText = winJoin('..', '..', 'plugins', dummyPluginInfo.id, frameworks[8].src);
targetConditions = {versions: undefined, deviceTarget: 'win', arch: undefined};
validateUninstalledProjects('framework', frameworks[8], xmlPath, incText, targetConditions, ['windows', 'windows8', 'windows10']);
incText = winJoin('..', '..', 'plugins', dummyPluginInfo.id, frameworks[9].src);
targetConditions = {versions: '8.1', deviceTarget: 'all', arch: 'x86'};
validateUninstalledProjects('framework', frameworks[9], xmlPath, incText, targetConditions, ['windows', 'phone']);
process.chdir(path.join(curDir, '..', '..', '..'));
});
});
describe('of <js-module> elements', function() {
var jsModule = {src: 'www/dummyPlugin.js'};
var wwwDest, platformWwwDest;
var uninstall = PluginHandler.getUninstaller('js-module');
beforeEach(function () {
wwwDest = path.resolve(dummyProject.www, 'plugins', dummyPluginInfo.id, jsModule.src);
platformWwwDest = path.resolve(dummyProject.platformWww, 'plugins', dummyPluginInfo.id, jsModule.src);
spyOn(shell, 'rm');
var existsSyncOrig = fs.existsSync;
spyOn(fs, 'existsSync').andCallFake(function (file) {
if ([wwwDest, platformWwwDest].indexOf(file) >= 0 ) return true;
return existsSyncOrig.call(fs, file);
});
});
it('should put module to both www and platform_www when options.usePlatformWww flag is specified', function () {
uninstall(jsModule, dummyPluginInfo, dummyProject, {usePlatformWww: true});
expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), wwwDest);
expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), platformWwwDest);
});
it('should put module to www only when options.usePlatformWww flag is not specified', function () {
uninstall(jsModule, dummyPluginInfo, dummyProject);
expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), wwwDest);
expect(shell.rm).not.toHaveBeenCalledWith(jasmine.any(String), platformWwwDest);
});
});
describe('of <asset> elements', function() {
var asset = {src: 'www/dummyPlugin.js', target: 'foo/dummy.js'};
var wwwDest, platformWwwDest;
var uninstall = PluginHandler.getUninstaller('asset');
beforeEach(function () {
wwwDest = path.resolve(dummyProject.www, asset.target);
platformWwwDest = path.resolve(dummyProject.platformWww, asset.target);
spyOn(shell, 'rm');
var existsSyncOrig = fs.existsSync;
spyOn(fs, 'existsSync').andCallFake(function (file) {
if ([wwwDest, platformWwwDest].indexOf(file) >= 0 ) return true;
return existsSyncOrig.call(fs, file);
});
});
it('should put module to both www and platform_www when options.usePlatformWww flag is specified', function () {
uninstall(asset, dummyPluginInfo, dummyProject, {usePlatformWww: true});
expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), wwwDest);
expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), platformWwwDest);
});
it('should put module to www only when options.usePlatformWww flag is not specified', function () {
uninstall(asset, dummyPluginInfo, dummyProject);
expect(shell.rm).toHaveBeenCalledWith(jasmine.any(String), wwwDest);
expect(shell.rm).not.toHaveBeenCalledWith(jasmine.any(String), platformWwwDest);
});
});
});
});