1
0
mirror of https://github.com/adobe/brackets.git synced 2024-11-20 18:02:54 +01:00
brackets/test/spec/InstallExtensionDialog-test.js

835 lines
37 KiB
JavaScript

/*
* Copyright (c) 2013 - present Adobe Systems Incorporated. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*global describe, it, expect, beforeEach, afterEach, waits, waitsFor, runs, spyOn, beforeFirst, afterLast */
/*unittests: Install Extension Dialog*/
define(function (require, exports, module) {
"use strict";
var SpecRunnerUtils = require("spec/SpecRunnerUtils"),
KeyEvent = require("utils/KeyEvent"),
FileSystem,
Strings = require("strings");
describe("Install Extension Dialog", function () {
var testWindow, dialog, fields, closed,
url = "http://brackets.io/extensions/myextension.zip";
this.category = "integration";
beforeFirst(function () {
SpecRunnerUtils.createTestWindowAndRun(this, function (w) {
testWindow = w;
FileSystem = testWindow.brackets.test.FileSystem;
});
});
afterLast(function () {
testWindow = null;
SpecRunnerUtils.closeTestWindow();
});
afterEach(function () {
testWindow.brackets.config.extension_listing_url = brackets.config.extension_listing_url;
runs(function () {
if (dialog) {
dialog._close();
} else {
closed = true;
}
});
waitsFor(function () { return closed; }, "dialog closing");
runs(function () {
fields = null;
closed = false;
dialog = null;
});
});
var successfulResult = {
installationStatus: "INSTALLED"
};
function makeInstaller(succeed, deferred) {
var installer = {
install: function () {
if (!deferred) {
deferred = new $.Deferred();
if (succeed) {
deferred.resolve(successfulResult);
} else {
deferred.reject();
}
}
return deferred.promise();
},
cancel: function () {
}
};
spyOn(installer, "install").andCallThrough();
spyOn(installer, "cancel");
dialog._installer = installer;
return installer;
}
describe("with Browse Extensions enabled", function () {
it("should open the extension list wiki page when the user clicks on the Browse Extensions button", function () {
// Set the extension_listing_url in the configuration so that the button will
// show up.
var extensionListingURL = "https://github.com/adobe/brackets/wiki/Brackets-Extensions";
testWindow.brackets.config.extension_listing_url = extensionListingURL;
dialog = new testWindow.brackets.test.InstallExtensionDialog._Dialog();
dialog.show()
.always(function () {
closed = true;
});
fields = {
$browseExtensionsButton: dialog.$browseExtensionsButton
};
var NativeApp = testWindow.brackets.getModule("utils/NativeApp");
spyOn(NativeApp, "openURLInDefaultBrowser");
fields.$browseExtensionsButton.click();
expect(NativeApp.openURLInDefaultBrowser).toHaveBeenCalledWith(extensionListingURL);
});
});
describe("when user-initiated", function () {
beforeEach(function () {
closed = false;
dialog = new testWindow.brackets.test.InstallExtensionDialog._Dialog();
dialog.show()
.always(function () {
closed = true;
});
fields = {
$dlg: dialog.$dlg,
$okButton: dialog.$okButton,
$cancelButton: dialog.$cancelButton,
$url: dialog.$url,
$browseExtensionsButton: dialog.$browseExtensionsButton
};
});
function setUrl() {
fields.$url
.val(url)
.trigger("input");
}
it("should open the dialog", function () {
expect(fields.$dlg[0]).toBeTruthy();
});
it("should have the install button disabled when dialog is first open due to empty url field", function () {
expect(fields.$okButton.prop("disabled")).toBe(true);
});
it("should not start install if enter hit while url field is empty", function () {
var installer = makeInstaller(true);
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_RETURN, "keydown", fields.$dlg[0]);
expect(installer.install).not.toHaveBeenCalled();
});
it("should close the dialog when Cancel button clicked before entering url", function () {
fields.$cancelButton.click();
expect(fields.$dlg.is(":visible")).toBe(false);
});
// bootstrap-modal handles Esc on keyup
it("should close the dialog when Esc pressed before entering url", function () {
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_ESCAPE, "keyup", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should enable the install button when the url field is nonempty", function () {
setUrl();
expect(fields.$okButton.prop("disabled")).toBe(false);
});
it("should re-disable the install button if the url field becomes nonempty and then empty", function () {
setUrl();
fields.$url
.val("")
.trigger("input");
expect(fields.$okButton.prop("disabled")).toBe(true);
});
it("should close the dialog when Cancel button clicked after entering url", function () {
setUrl();
fields.$cancelButton.click();
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog when Esc pressed after entering url", function () {
setUrl();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_ESCAPE, "keyup", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should start the installer with the given URL when Install button clicked", function () {
var installer = makeInstaller(true);
setUrl();
fields.$okButton.click();
expect(installer.install).toHaveBeenCalledWith(url);
});
it("should start the installer with the given URL when Enter is pressed", function () {
var installer = makeInstaller(true);
setUrl();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_RETURN, "keydown", fields.$dlg[0]);
expect(installer.install).toHaveBeenCalledWith(url);
});
it("should disable the ok button while installing", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
expect(fields.$okButton.prop("disabled")).toBe(true);
deferred.resolve(successfulResult);
});
it("should hide the url field and 'browse extensions' button while installing", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
expect(fields.$url.is(":visible")).toBe(false);
expect(fields.$browseExtensionsButton.is(":visible")).toBe(false);
deferred.resolve(successfulResult);
});
it("should do nothing if Enter pressed while installing", function () {
var deferred = new $.Deferred(),
installer = makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
installer.install.reset();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_RETURN, "keydown", fields.$dlg[0]);
expect(installer.install).not.toHaveBeenCalled();
expect(installer.cancel).not.toHaveBeenCalled();
deferred.resolve(successfulResult);
});
it("should cancel installation if cancel clicked while installing", function () {
var deferred = new $.Deferred(),
installer = makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
fields.$cancelButton.click();
expect(installer.cancel).toHaveBeenCalled();
deferred.resolve(successfulResult);
});
it("should cancel installation if Esc pressed while installing", function () {
var deferred = new $.Deferred(),
installer = makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_ESCAPE, "keyup", fields.$dlg[0]);
expect(installer.cancel).toHaveBeenCalled();
deferred.resolve(successfulResult);
});
it("should disable the cancel button while cancellation is processed", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
fields.$cancelButton.click();
expect(fields.$cancelButton.prop("disabled")).toBe(true);
deferred.reject("CANCELED");
});
it("should ignore the Esc key while cancellation is processed", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
fields.$cancelButton.click();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_ESCAPE, "keyup", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(true);
deferred.reject("CANCELED");
});
it("should ignore the Enter key while cancellation is processed", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
fields.$cancelButton.click();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_RETURN, "keyup", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(true);
deferred.reject("CANCELED");
});
it("should re-enable the ok button and hide cancel button after install succeeds", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
deferred.resolve(successfulResult);
expect(fields.$okButton.prop("disabled")).toBe(false);
expect(fields.$cancelButton.is(":visible")).toBe(false);
});
it("should re-enable the ok button and hide cancel button after install succeeds synchronously", function () {
makeInstaller(true);
setUrl();
fields.$okButton.click();
expect(fields.$okButton.prop("disabled")).toBe(false);
expect(fields.$cancelButton.is(":visible")).toBe(false);
});
it("should re-enable the ok button and hide cancel button after install fails", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
deferred.reject();
expect(fields.$okButton.prop("disabled")).toBe(false);
expect(fields.$cancelButton.is(":visible")).toBe(false);
});
it("should re-enable the ok button and hide cancel button after install fails synchronously", function () {
makeInstaller(true);
setUrl();
fields.$okButton.click();
expect(fields.$okButton.prop("disabled")).toBe(false);
expect(fields.$cancelButton.is(":visible")).toBe(false);
});
it("should re-enable the ok button and hide cancel button after install finishes canceling", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
fields.$cancelButton.click();
deferred.reject("CANCELED");
expect(fields.$okButton.prop("disabled")).toBe(false);
expect(fields.$cancelButton.is(":visible")).toBe(false);
});
it("should close the dialog if ok button clicked after install succeeds", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
deferred.resolve(successfulResult);
fields.$okButton.click();
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if ok button clicked after install succeeds synchronously", function () {
makeInstaller(true);
setUrl();
fields.$okButton.click();
fields.$okButton.click();
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if Enter pressed after install succeeds", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
deferred.resolve(successfulResult);
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_RETURN, "keydown", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if Enter pressed after install succeeds synchronously", function () {
makeInstaller(true);
setUrl();
fields.$okButton.click();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_RETURN, "keydown", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if Esc pressed after install succeeds", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
deferred.resolve(successfulResult);
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_ESCAPE, "keyup", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if Esc pressed after install succeeds synchronously", function () {
makeInstaller(true);
setUrl();
fields.$okButton.click();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_ESCAPE, "keyup", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if ok button clicked after install fails", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
deferred.reject();
fields.$okButton.click();
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if ok button clicked after install fails synchronously", function () {
makeInstaller(true);
setUrl();
fields.$okButton.click();
fields.$okButton.click();
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if Enter pressed after install fails", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
deferred.reject();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_RETURN, "keydown", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if Enter pressed after install fails synchronously", function () {
makeInstaller(true);
setUrl();
fields.$okButton.click();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_RETURN, "keydown", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if Esc pressed after install fails", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
deferred.reject();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_ESCAPE, "keyup", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if Esc pressed after install fails synchronously", function () {
makeInstaller(true);
setUrl();
fields.$okButton.click();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_ESCAPE, "keyup", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if ok button clicked after install finishes canceling", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
fields.$cancelButton.click();
deferred.reject("CANCELED");
fields.$okButton.click();
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if Enter pressed after install finishes canceling", function () {
var deferred = new $.Deferred();
makeInstaller(true);
setUrl();
fields.$okButton.click();
fields.$cancelButton.click();
deferred.reject("CANCELED");
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_RETURN, "keydown", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should close the dialog if Esc pressed after install finishes canceling", function () {
var deferred = new $.Deferred();
makeInstaller(true);
setUrl();
fields.$okButton.click();
fields.$cancelButton.click();
deferred.reject("CANCELED");
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_ESCAPE, "keyup", fields.$dlg[0]);
expect(fields.$dlg.is(":visible")).toBe(false);
});
// Cancellation timing
it("should time out and re-enable close button if cancel doesn't complete quickly", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
});
waits(100);
runs(function () {
expect(fields.$okButton.prop("disabled")).toBe(false);
deferred.reject("CANCELED");
});
});
it("should close when clicking Close button after timing out if cancel doesn't complete quickly", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
});
waits(100);
runs(function () {
fields.$okButton.click();
expect(fields.$dlg.is(":visible")).toBe(false);
deferred.reject("CANCELED");
});
});
it("should close when hitting Enter after timing out if cancel doesn't complete quickly", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
});
waits(100);
runs(function () {
fields.$okButton.click();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_RETURN, "keydown", fields.$dlg[0]);
deferred.reject("CANCELED");
});
});
it("should close when hitting Esc after timing out if cancel doesn't complete quickly", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
});
waits(100);
runs(function () {
fields.$okButton.click();
SpecRunnerUtils.simulateKeyEvent(KeyEvent.DOM_VK_ESCAPE, "keyup", fields.$dlg[0]);
deferred.reject("CANCELED");
});
});
// Cancelation vs. successful install race conditions
it("should keep close button enabled and not throw an exception if install succeeds quickly after cancelation", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
deferred.resolve(successfulResult);
expect(fields.$okButton.prop("disabled")).toBe(false);
});
});
it("should keep close button enabled and not throw an exception if install succeeds slowly after cancelation", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
});
waits(100);
runs(function () {
deferred.resolve(successfulResult);
expect(fields.$okButton.prop("disabled")).toBe(false);
});
});
it("should stay closed and not throw an exception if install succeeds after cancelation & force close", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
});
waits(100);
runs(function () {
fields.$okButton.click(); // force close
deferred.resolve(successfulResult);
expect(fields.$dlg.is(":visible")).toBe(false);
});
});
// Cancelation vs. failed install race conditions
it("should keep close button enabled and not throw an exception if install fails quickly after cancelation", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
deferred.reject();
expect(fields.$okButton.prop("disabled")).toBe(false);
});
});
it("should keep close button enabled and not throw an exception if install fails slowly after cancelation", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
});
waits(100);
runs(function () {
deferred.reject();
expect(fields.$okButton.prop("disabled")).toBe(false);
});
});
it("should stay closed and not throw an exception if install fails after cancelation & force close", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
});
waits(100);
runs(function () {
fields.$okButton.click(); // force close
deferred.reject();
expect(fields.$dlg.is(":visible")).toBe(false);
});
});
// Cancelation actually suceeding
it("should keep close button enabled and not throw an exception if install cancelation completes quickly after cancelation", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
deferred.reject("CANCELED");
expect(fields.$okButton.prop("disabled")).toBe(false);
});
});
it("should keep close button enabled and not throw an exception if install cancelation completes slowly after cancelation", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
});
waits(100);
runs(function () {
deferred.reject("CANCELED");
expect(fields.$okButton.prop("disabled")).toBe(false);
});
});
it("should stay closed and not throw an exception if install cancelation completes after cancelation & force close", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
runs(function () {
setUrl();
dialog._cancelTimeout = 50;
fields.$okButton.click();
fields.$cancelButton.click();
});
waits(100);
runs(function () {
fields.$okButton.click(); // force close
deferred.reject("CANCELED");
expect(fields.$dlg.is(":visible")).toBe(false);
});
});
it("should not display the Browse Extensions button in the default configuration", function () {
expect(fields.$browseExtensionsButton.length).toBe(0);
});
it("should display a warning message if the extension is already installed", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
deferred.resolve({
installationStatus: "ALREADY_INSTALLED"
});
expect(fields.$okButton.text()).toEqual(Strings.OVERWRITE);
expect(fields.$okButton.prop("disabled")).toBe(false);
expect(fields.$cancelButton.text()).toEqual(Strings.CANCEL);
expect(fields.$cancelButton.prop("disabled")).toBe(false);
expect(fields.$browseExtensionsButton.is(":visible")).toBe(false);
expect(fields.$dlg.find(".message").text()).toBe(Strings.EXTENSION_ALREADY_INSTALLED);
});
it("should display a warning message if the same version is already installed", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
deferred.resolve({
installationStatus: "SAME_VERSION"
});
expect(fields.$okButton.text()).toEqual(Strings.OVERWRITE);
expect(fields.$okButton.prop("disabled")).toBe(false);
expect(fields.$cancelButton.text()).toEqual(Strings.CANCEL);
expect(fields.$cancelButton.prop("disabled")).toBe(false);
expect(fields.$browseExtensionsButton.is(":visible")).toBe(false);
expect(fields.$dlg.find(".message").text()).toBe(Strings.EXTENSION_SAME_VERSION);
});
it("should display a warning message if an older version is already installed", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
deferred.resolve({
installationStatus: "OLDER_VERSION",
installedVersion: "1.0.0",
metadata: {
version: "0.9.0"
}
});
expect(fields.$okButton.text()).toEqual(Strings.OVERWRITE);
expect(fields.$okButton.prop("disabled")).toBe(false);
expect(fields.$cancelButton.text()).toEqual(Strings.CANCEL);
expect(fields.$cancelButton.prop("disabled")).toBe(false);
expect(fields.$browseExtensionsButton.is(":visible")).toBe(false);
expect(fields.$dlg.find(".message").text().indexOf("0.9.0")).not.toEqual(-1);
});
it("should delete the downloaded file if the warning message is cancelled", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
var packageFilename = "/path/to/downloaded/package.zip",
file = FileSystem.getFileForPath(packageFilename);
deferred.resolve({
installationStatus: "ALREADY_INSTALLED",
localPath: packageFilename
});
spyOn(file, "unlink");
fields.$cancelButton.click();
expect(file.unlink).toHaveBeenCalled();
expect(fields.$dlg.is(":visible")).toBe(false);
});
it("should pass the installation result if the warning message is confirmed", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
var packageFilename = "/path/to/downloaded/package.zip",
file = FileSystem.getFileForPath(packageFilename);
deferred.resolve({
installationStatus: "ALREADY_INSTALLED",
localPath: packageFilename
});
spyOn(file, "unlink");
var dialogDone = false;
dialog._dialogDeferred.done(function (result) {
dialogDone = true;
expect(result.installationStatus).toBe("ALREADY_INSTALLED");
});
fields.$okButton.click();
expect(file.unlink).not.toHaveBeenCalled();
expect(fields.$dlg.is(":visible")).toBe(false);
expect(dialogDone).toBe(true);
});
it("should pass installation result when update is needed", function () {
var deferred = new $.Deferred();
makeInstaller(null, deferred);
setUrl();
fields.$okButton.click();
var packageFilename = "/path/to/downloaded/package.zip";
deferred.resolve({
installationStatus: "NEEDS_UPDATE",
localPath: packageFilename
});
expect(fields.$dlg.is(":visible")).toBe(true);
expect(fields.$dlg.find(".message").text()).toBe(Strings.EXTENSION_UPDATE_INSTALLED);
expect(fields.$okButton.text()).toBe(Strings.CLOSE);
expect(fields.$cancelButton.is(":visible")).toBe(false);
fields.$okButton.click();
var dialogDone = false;
dialog._dialogDeferred.done(function (result) {
dialogDone = true;
expect(result.installationStatus).toBe("NEEDS_UPDATE");
});
expect(dialogDone).toBe(true);
});
});
describe("when initiated from Extension Manager", function () {
var url = "https://my.repository.io/my-extension.zip", installer;
beforeEach(function () {
closed = false;
});
it("should immediately start installing from the given url, and in the correct UI state", function () {
var deferred = new $.Deferred();
dialog = new testWindow.brackets.test.InstallExtensionDialog._Dialog();
installer = makeInstaller(null, deferred);
dialog.show(url)
.always(function () {
closed = true;
});
fields = {
$dlg: dialog.$dlg,
$okButton: dialog.$okButton,
$cancelButton: dialog.$cancelButton,
$url: dialog.$url
};
expect(installer.install).toHaveBeenCalledWith(url);
expect(fields.$okButton.prop("disabled")).toBe(true);
expect(fields.$url.is(":visible")).toBe(false);
deferred.resolve(successfulResult);
});
});
});
});