Index: chrome/test/data/webui/settings/certificate_manager_page_test.js |
diff --git a/chrome/test/data/webui/settings/certificate_manager_page_test.js b/chrome/test/data/webui/settings/certificate_manager_page_test.js |
index b4644ecfa215f1c2f63fc2e34b2c88c7fd1f8b0b..bdb71b38d220bf889a491ff9d1cb35623f5ca50b 100644 |
--- a/chrome/test/data/webui/settings/certificate_manager_page_test.js |
+++ b/chrome/test/data/webui/settings/certificate_manager_page_test.js |
@@ -16,14 +16,20 @@ cr.define('certificate_manager_page', function() { |
settings.TestBrowserProxy.call(this, [ |
'deleteCertificate', |
'editCaCertificateTrust', |
+ 'exportCertificate', |
+ 'exportPersonalCertificate', |
'exportPersonalCertificatePasswordSelected', |
'getCaCertificateTrust', |
'importPersonalCertificatePasswordSelected', |
'refreshCertificates', |
+ 'viewCertificate', |
]); |
/** @private {!CaTrustInfo} */ |
this.caTrustInfo_ = {ssl: true, email: true, objSign: true}; |
+ |
+ /** @private {?CertificatesError} */ |
+ this.certificatesError_ = null; |
}; |
TestCertificatesBrowserProxy.prototype = { |
@@ -47,33 +53,68 @@ cr.define('certificate_manager_page', function() { |
this.methodCalled('editCaCertificateTrust', { |
id: id, ssl: ssl, email: email, objSign: objSign, |
}); |
- return Promise.resolve(); |
+ return this.fulfillRequest_(); |
+ }, |
+ |
+ /** |
+ * Forces some of the browser proxy methods to start returning errors. |
+ */ |
+ forceCertificatesError: function() { |
+ this.certificatesError_ = /** @type {!CertificatesError} */ ({ |
+ title: 'DummyError', description: 'DummyDescription' |
+ }); |
+ }, |
+ |
+ /** |
+ * @return {!Promise} A promise that is resolved or rejected based on the |
+ * value of |certificatesError_|. |
+ * @private |
+ */ |
+ fulfillRequest_: function() { |
+ return this.certificatesError_ === null ? |
+ Promise.resolve() : Promise.reject(this.certificatesError_); |
}, |
/** @override */ |
deleteCertificate: function(id) { |
this.methodCalled('deleteCertificate', id); |
- return Promise.resolve(); |
+ return this.fulfillRequest_(); |
}, |
/** @override */ |
exportPersonalCertificatePasswordSelected: function(password) { |
this.resolverMap_.get( |
'exportPersonalCertificatePasswordSelected').resolve(password); |
- return Promise.resolve(); |
+ return this.fulfillRequest_(); |
}, |
/** @override */ |
importPersonalCertificatePasswordSelected: function(password) { |
this.resolverMap_.get( |
'importPersonalCertificatePasswordSelected').resolve(password); |
- return Promise.resolve(); |
+ return this.fulfillRequest_(); |
}, |
/** @override */ |
refreshCertificates: function() { |
this.methodCalled('refreshCertificates'); |
}, |
+ |
+ /** @override */ |
+ viewCertificate: function(id) { |
+ this.methodCalled('viewCertificate', id); |
+ }, |
+ |
+ /** @override */ |
+ exportCertificate: function(id) { |
+ this.methodCalled('exportCertificate', id); |
+ }, |
+ |
+ /** @override */ |
+ exportPersonalCertificate: function(id) { |
+ this.methodCalled('exportPersonalCertificate', id); |
+ return Promise.resolve(); |
+ }, |
}; |
/** @return {!Certificate} */ |
@@ -111,6 +152,18 @@ cr.define('certificate_manager_page', function() { |
MockInteractions.keyEventOn(element, 'input', kSpaceBar); |
} |
+ /** |
+ * Converts an event occurrence to a promise. |
+ * @param {string} eventType |
+ * @param {!HTMLElement} target |
+ * @return {!Promise} A promise firing once the event occurs. |
+ */ |
+ function eventToPromise(eventType, target) { |
+ return new Promise(function(resolve, reject) { |
+ target.addEventListener(eventType, resolve); |
+ }); |
+ } |
+ |
function registerCaTrustEditDialogTests() { |
/** @type {?SettingsCaTrustEditDialogElement} */ |
var dialog = null; |
@@ -138,7 +191,7 @@ cr.define('certificate_manager_page', function() { |
teardown(function() { dialog.remove(); }); |
- test('Dialog', function() { |
+ test('EditSuccess', function() { |
return browserProxy.whenCalled('getCaCertificateTrust').then( |
function(id) { |
assertEquals(model.id, id); |
@@ -154,17 +207,31 @@ cr.define('certificate_manager_page', function() { |
// Simulate clicking 'OK'. |
MockInteractions.tap(dialog.$.ok); |
- return browserProxy.whenCalled('editCaCertificateTrust').then( |
- function(args) { |
- assertEquals(model.id, args.id); |
- // Checking that the values sent to C++ are reflecting the |
- // changes made by the user (toggling all checkboxes). |
- assertEquals(caTrustInfo.ssl, !args.ssl); |
- assertEquals(caTrustInfo.email, !args.email); |
- assertEquals(caTrustInfo.objSign, !args.objSign); |
- // Check that the dialog is closed. |
- assertFalse(dialog.$.dialog.opened); |
- }); |
+ return browserProxy.whenCalled('editCaCertificateTrust'); |
+ }).then( |
+ function(args) { |
+ assertEquals(model.id, args.id); |
+ // Checking that the values sent to C++ are reflecting the |
+ // changes made by the user (toggling all checkboxes). |
+ assertEquals(caTrustInfo.ssl, !args.ssl); |
+ assertEquals(caTrustInfo.email, !args.email); |
+ assertEquals(caTrustInfo.objSign, !args.objSign); |
+ // Check that the dialog is closed. |
+ assertFalse(dialog.$.dialog.opened); |
+ }); |
+ }); |
+ |
+ test('EditError', function() { |
+ browserProxy.forceCertificatesError(); |
+ var whenErrorEventFired = eventToPromise('certificates-error', dialog); |
+ |
+ return browserProxy.whenCalled('getCaCertificateTrust').then( |
+ function() { |
+ MockInteractions.tap(dialog.$.ok); |
+ return browserProxy.whenCalled('editCaCertificateTrust'); |
+ }).then( |
+ function() { |
+ return whenErrorEventFired; |
}); |
}); |
}); |
@@ -210,6 +277,20 @@ cr.define('certificate_manager_page', function() { |
assertFalse(dialog.$.dialog.opened); |
}); |
}); |
+ |
+ test('DeleteError', function() { |
+ browserProxy.forceCertificatesError(); |
+ var whenErrorEventFired = eventToPromise('certificates-error', dialog); |
+ |
+ // Simulate clicking 'OK'. |
+ MockInteractions.tap(dialog.$.ok); |
+ return browserProxy.whenCalled('deleteCertificate').then( |
+ function(id) { |
+ assertEquals(model.id, id); |
+ // Ensure that the 'error' event was fired. |
+ return whenErrorEventFired; |
+ }); |
+ }); |
}); |
} |
@@ -223,6 +304,8 @@ cr.define('certificate_manager_page', function() { |
/** @type {!CertificateSubnode} */ |
var model = createSampleCertificateSubnode(); |
+ var methodName = 'exportPersonalCertificatePasswordSelected'; |
+ |
suite('CertificatePasswordEncryptionDialogTests', function() { |
setup(function() { |
browserProxy = new TestCertificatesBrowserProxy(); |
@@ -262,13 +345,31 @@ cr.define('certificate_manager_page', function() { |
// Simulate clicking 'OK'. |
MockInteractions.tap(dialog.$.ok); |
- var methodName = 'exportPersonalCertificatePasswordSelected'; |
return browserProxy.whenCalled(methodName).then(function(password) { |
assertEquals(passwordInputElement.value, password); |
// Check that the dialog is closed. |
assertFalse(dialog.$.dialog.opened); |
}); |
}); |
+ |
+ test('EncryptError', function() { |
+ browserProxy.forceCertificatesError(); |
+ |
+ var passwordInputElements = |
+ Polymer.dom(dialog.$.dialog).querySelectorAll('paper-input'); |
+ var passwordInputElement = passwordInputElements[0]; |
+ passwordInputElement.value = 'foopassword'; |
+ var confirmPasswordInputElement = passwordInputElements[1]; |
+ confirmPasswordInputElement.value = passwordInputElement.value; |
+ triggerInputEvent(passwordInputElement); |
+ |
+ var whenErrorEventFired = eventToPromise('certificates-error', dialog); |
+ MockInteractions.tap(dialog.$.ok); |
+ |
+ return browserProxy.whenCalled(methodName).then(function() { |
+ return whenErrorEventFired; |
+ }); |
+ }); |
}); |
} |
@@ -279,6 +380,8 @@ cr.define('certificate_manager_page', function() { |
/** @type {?TestCertificatesBrowserProxy} */ |
var browserProxy = null; |
+ var methodName = 'importPersonalCertificatePasswordSelected'; |
+ |
suite('CertificatePasswordDecryptionDialogTests', function() { |
setup(function() { |
browserProxy = new TestCertificatesBrowserProxy(); |
@@ -308,13 +411,145 @@ cr.define('certificate_manager_page', function() { |
// Simulate clicking 'OK'. |
MockInteractions.tap(dialog.$.ok); |
- var methodName = 'importPersonalCertificatePasswordSelected'; |
return browserProxy.whenCalled(methodName).then(function(password) { |
assertEquals(passwordInputElement.value, password); |
// Check that the dialog is closed. |
assertFalse(dialog.$.dialog.opened); |
}); |
}); |
+ |
+ test('DecryptError', function() { |
+ browserProxy.forceCertificatesError(); |
+ // Simulate entering some password. |
+ var passwordInputElement = |
+ Polymer.dom(dialog.$.dialog).querySelector('paper-input'); |
+ passwordInputElement.value = 'foopassword'; |
+ triggerInputEvent(passwordInputElement); |
+ |
+ var whenErrorEventFired = eventToPromise('certificates-error', dialog); |
+ MockInteractions.tap(dialog.$.ok); |
+ return browserProxy.whenCalled(methodName).then(function() { |
+ return whenErrorEventFired; |
+ }); |
+ }); |
+ }); |
+ } |
+ |
+ function registerCertificateSubentryTests() { |
+ var subentry = null; |
+ |
+ /** @type {?TestCertificatesBrowserProxy} */ |
+ var browserProxy = null; |
+ |
+ /** |
+ * @return {!Promise} A promise firing once a |
+ * |settings.CertificateActionEvent| fires. |
+ */ |
+ var actionEventToPromise = function() { |
+ return eventToPromise(settings.CertificateActionEvent, subentry); |
+ }; |
+ |
+ suite('CertificateManagerPageTests', function() { |
+ setup(function() { |
+ browserProxy = new TestCertificatesBrowserProxy(); |
+ settings.CertificatesBrowserProxyImpl.instance_ = browserProxy; |
+ PolymerTest.clearBody(); |
+ subentry = document.createElement('settings-certificate-subentry'); |
+ subentry.model = createSampleCertificateSubnode(); |
+ subentry.certificateType = settings.CertificateType.PERSONAL; |
+ document.body.appendChild(subentry); |
+ |
+ // Bring up the popup menu for the following tests to use. |
+ MockInteractions.tap(subentry.$.dots); |
+ Polymer.dom.flush(); |
+ }); |
+ |
+ teardown(function() { subentry.remove(); }); |
+ |
+ // Test case where 'View' option is tapped. |
+ test('MenuOptions_View', function() { |
+ var viewButton = subentry.shadowRoot.querySelector('#view'); |
+ MockInteractions.tap(viewButton); |
+ return browserProxy.whenCalled('viewCertificate').then(function(id) { |
+ assertEquals(subentry.model.id, id); |
+ }); |
+ }); |
+ |
+ // Test that the 'Edit' option is only shown when appropriate and that |
+ // once tapped the correct event is fired. |
+ test('MenuOptions_Edit', function() { |
+ var editButton = subentry.shadowRoot.querySelector('#edit'); |
+ // Should be disabled for any certificate type other than |
+ // CertificateType.CA |
+ assertTrue(editButton.hidden); |
+ subentry.certificateType = settings.CertificateType.CA; |
+ assertFalse(editButton.hidden); |
+ |
+ var waitForActionEvent = actionEventToPromise(); |
+ MockInteractions.tap(editButton); |
+ return waitForActionEvent.then(function(event) { |
+ var detail = /** @type {!CertificateActionEventDetail} */ ( |
+ event.detail); |
+ assertEquals(settings.CertificateAction.EDIT, detail.action); |
+ assertEquals(subentry.model.id, detail.subnode.id); |
+ assertEquals(subentry.certificateType, detail.certificateType); |
+ }); |
+ }); |
+ |
+ // Test that the 'Delete' option is only shown when appropriate and that |
+ // once tapped the correct event is fired. |
+ test('MenuOptions_Delete', function() { |
+ subentry.set('model.readonly', true); |
+ |
+ var deleteButton = subentry.shadowRoot.querySelector('#delete'); |
+ // Should be disabled when 'model.readonly' is true. |
+ assertTrue(deleteButton.hidden); |
+ subentry.set('model.readonly', false); |
+ assertFalse(deleteButton.hidden); |
+ |
+ var waitForActionEvent = actionEventToPromise(); |
+ MockInteractions.tap(deleteButton); |
+ return waitForActionEvent.then(function(event) { |
+ var detail = /** @type {!CertificateActionEventDetail} */ ( |
+ event.detail); |
+ assertEquals(settings.CertificateAction.DELETE, detail.action); |
+ assertEquals(subentry.model.id, detail.subnode.id); |
+ }); |
+ }); |
+ |
+ // Test case of exporting a certificate that is not PERSONAL. |
+ test('MenuOptions_Export', function() { |
+ subentry.certificateType = settings.CertificateType.SERVER; |
+ var exportButton = subentry.shadowRoot.querySelector('#export'); |
+ MockInteractions.tap(exportButton); |
+ return browserProxy.whenCalled('exportCertificate').then(function(id) { |
+ assertEquals(subentry.model.id, id); |
+ }); |
+ }); |
+ |
+ // Test case of exporting a PERSONAL certificate. |
+ test('MenuOptions_ExportPersonal', function() { |
+ var waitForActionEvent = actionEventToPromise(); |
+ |
+ var exportButton = subentry.shadowRoot.querySelector('#export'); |
+ MockInteractions.tap(exportButton); |
+ return browserProxy.whenCalled('exportPersonalCertificate').then( |
+ function(id) { |
+ assertEquals(subentry.model.id, id); |
+ |
+ // A promise firing once |settings.CertificateActionEvent| is |
+ // fired. |
+ return waitForActionEvent; |
+ }).then( |
+ function(event) { |
+ var detail = /** @type {!CertificateActionEventDetail} */ ( |
+ event.detail); |
+ assertEquals( |
+ settings.CertificateAction.EXPORT_PERSONAL, |
+ detail.action); |
+ assertEquals(subentry.model.id, detail.subnode.id); |
+ }); |
+ }); |
}); |
} |
@@ -393,6 +628,58 @@ cr.define('certificate_manager_page', function() { |
assertCertificateListLength(CertificateCategoryIndex.OTHER, 0); |
}); |
}); |
+ |
+ /** |
+ * Dispatches a settings.CertificateActionEvent. |
+ * @param {!settings.CertificateAction} action The type of action to |
+ * simulate. |
+ */ |
+ function dispatchCertificateActionEvent(action) { |
+ var eventDetail = /** @type {!CertificateActionEventDetail} */ ({ |
+ action: action, |
+ subnode: createSampleCertificateSubnode(), |
+ certificateType: settings.CertificateType.PERSONAL |
+ }); |
+ page.dispatchEvent(new CustomEvent( |
+ settings.CertificateActionEvent, {detail: eventDetail})); |
+ } |
+ |
+ /** |
+ * Tests that a dialog opens as a response to a |
+ * settings.CertificateActionEvent. |
+ * @param {string} dialogTagName The type of dialog to test. |
+ * @param {!settings.CertificateAction} action The action that is supposed |
+ * to trigger the dialog. |
+ */ |
+ function testDialogOpensOnAction(dialogTagName, action) { |
+ assertFalse(!!page.shadowRoot.querySelector(dialogTagName)); |
+ dispatchCertificateActionEvent(action); |
+ Polymer.dom.flush(); |
+ assertTrue(!!page.shadowRoot.querySelector(dialogTagName)); |
+ } |
+ |
+ test('OpensDialog_DeleteConfirmation', function() { |
+ testDialogOpensOnAction( |
+ 'settings-certificate-delete-confirmation-dialog', |
+ settings.CertificateAction.DELETE); |
+ }); |
+ |
+ test('OpensDialog_PasswordEncryption', function() { |
+ testDialogOpensOnAction( |
+ 'settings-certificate-password-encryption-dialog', |
+ settings.CertificateAction.EXPORT_PERSONAL); |
+ }); |
+ |
+ test('OpensDialog_PasswordDecryption', function() { |
+ testDialogOpensOnAction( |
+ 'settings-certificate-password-decryption-dialog', |
+ settings.CertificateAction.IMPORT_PERSONAL); |
+ }); |
+ |
+ test('OpensDialog_CaTrustEdit', function() { |
+ testDialogOpensOnAction( |
+ 'settings-ca-trust-edit-dialog', settings.CertificateAction.EDIT); |
+ }); |
}); |
} |
@@ -403,6 +690,7 @@ cr.define('certificate_manager_page', function() { |
registerPasswordEncryptDialogTests(); |
registerPasswordDecryptDialogTests(); |
registerPageTests(); |
+ registerCertificateSubentryTests(); |
}, |
}; |
}); |