diff --git a/html/internal_dashboard/js/admin_panel/AdminPanel.js b/html/internal_dashboard/js/admin_panel/AdminPanel.js index f99f5fdbb5..ee746951c6 100644 --- a/html/internal_dashboard/js/admin_panel/AdminPanel.js +++ b/html/internal_dashboard/js/admin_panel/AdminPanel.js @@ -179,6 +179,7 @@ XDMoD.AdminPanel = Ext.extend(Ext.Window, { return; if (resp == 'no') { + sectionExistingUsers.revertUserSettings(); sectionExistingUsers.resetDirtyState(); self.hide(); } diff --git a/html/internal_dashboard/js/admin_panel/SectionExistingUsers.js b/html/internal_dashboard/js/admin_panel/SectionExistingUsers.js index ad90c48581..0692721c47 100644 --- a/html/internal_dashboard/js/admin_panel/SectionExistingUsers.js +++ b/html/internal_dashboard/js/admin_panel/SectionExistingUsers.js @@ -292,7 +292,7 @@ XDMoD.ExistingUsers = Ext.extend(Ext.Panel, { } if (resp === 'no') { - self.resetDirtyState(); + self.revertUserSettings(); updateSaveIndicator(); self.reloadUserList(menuItem.type_id); @@ -787,7 +787,7 @@ XDMoD.ExistingUsers = Ext.extend(Ext.Panel, { /** * Reverts the User Settings ( E-Mail Address, User Type, Map To, Institution ) to their original values. */ - var revertUserSettings = function () { + self.revertUserSettings = function () { // eslint-disable-next-line no-use-before-define var fieldValues = userSettings.getForm().getFieldValues(); for (var id in fieldValues) { @@ -819,9 +819,6 @@ XDMoD.ExistingUsers = Ext.extend(Ext.Panel, { if (field.originalValue !== field.getValue()) { field.originalValue = field.getValue(); } - if (field.startValue !== field.getValue()) { - field.startValue = field.getValue(); - } } } }; @@ -982,7 +979,6 @@ XDMoD.ExistingUsers = Ext.extend(Ext.Panel, { } self.resetDirtyState(); - revertUserSettings(); updateSaveIndicator(); @@ -1324,6 +1320,7 @@ XDMoD.ExistingUsers = Ext.extend(Ext.Panel, { clicksToEdit: 1, border: true, margins: '2 0 2 2', + cls: 'admin_panel_existing_user_list', viewConfig: { emptyText: 'No users in this category currently exist' @@ -1383,7 +1380,7 @@ XDMoD.ExistingUsers = Ext.extend(Ext.Panel, { } if (resp === 'no') { - self.resetDirtyState(); + self.revertUserSettings(); // eslint-disable-next-line no-use-before-define updateSaveIndicator(); diff --git a/tests/ui/test/specs/xdmod/internalDashboard.js b/tests/ui/test/specs/xdmod/internalDashboard.js index 46874d5e51..046977303a 100644 --- a/tests/ui/test/specs/xdmod/internalDashboard.js +++ b/tests/ui/test/specs/xdmod/internalDashboard.js @@ -1,4 +1,30 @@ const page = require('./internalDashboard.page.js'); +const settings = [ + { + label: 'E-Mail Address', + type: 'text', + updated: 'btest@test.example.com', + original: 'btest@example.com' + }, + { + label: 'User Type', + type: 'dropdown', + updated: 'Testing', + original: 'External' + }, + { + label: 'Map To', + type: 'dropdown', + updated: 'Auk, Great', + original: 'Unknown, Unknown' + }, + { + label: 'Institution', + type: 'dropdown', + updated: 'Unknown Organization', + original: 'Screwdriver' + } +]; describe('Internal Dashboard', function () { page.login('mgr'); @@ -127,28 +153,8 @@ describe('Internal Dashboard', function () { }); }); describe('Make sure that updates to the newly created users Settings can be discarded', function () { - const settings = [ - { - label: 'User Type', - type: 'text', - updated: 'Testing', - expected: 'External' - }, - { - label: 'Map To', - type: 'text', - updated: 'Auk, Great', - expected: 'Unknown, Unknown' - }, - { - label: 'Institution', - type: 'text', - updated: 'Unknown Organization', - expected: 'Screwdriver' - } - ]; - settings.forEach(function (value) { - describe(`Checking: ${value.label}`, function () { + settings.forEach(function (setting) { + describe(`Checking: ${setting.label}`, function () { it('Select the "Existing Users" tab', function () { browser.waitForVisible(page.selectors.user_management.tabs.existing_users()); browser.waitAndClick(page.selectors.user_management.tabs.existing_users()); @@ -164,23 +170,31 @@ describe('Internal Dashboard', function () { browser.waitForVisible(page.selectors.create_manage_users.window); browser.waitForVisible(page.selectors.create_manage_users.current_users.container); }); - it(`Change the "${value.label}" to "${value.updated}"`, function () { - const inputTrigger = page.selectors.create_manage_users.current_users.settings.inputTriggerByLabelText(value.label); - browser.waitForVisible(inputTrigger); - browser.click(inputTrigger); + it(`Change the "${setting.label}" to "${setting.updated}"`, function () { + if ('dropdown' === setting.type) { + const inputTrigger = page.selectors.create_manage_users.current_users.settings.dropDownTriggerByLabel(setting.label); + browser.waitForVisible(inputTrigger); + browser.click(inputTrigger); - const inputDropDown = page.selectors.combo.container; - browser.waitForVisible(inputDropDown); + const inputDropDown = page.selectors.combo.container; + browser.waitForVisible(inputDropDown); - const dropDownValue = page.selectors.combo.itemByText(value.updated); - browser.waitForVisible(dropDownValue); - browser.waitAndClick(dropDownValue); + const dropDownValue = page.selectors.combo.itemByText(setting.updated); + browser.waitForVisible(dropDownValue); + browser.waitAndClick(dropDownValue); - browser.waitForInvisible(inputDropDown); + browser.waitForInvisible(inputDropDown); - const input = page.selectors.create_manage_users.current_users.settings.inputByLabelText(value.label, value.type); - const updatedValue = browser.getValue(input); - expect(updatedValue).to.equal(value.updated); + const input = page.selectors.create_manage_users.current_users.settings.inputByLabel(setting.label, 'text'); + const updatedValue = browser.getValue(input); + expect(updatedValue).to.equal(setting.updated); + } else if ('text' === setting.type) { + const input = page.selectors.create_manage_users.current_users.settings.inputByLabel(setting.label, setting.type); + browser.waitForVisible(input); + browser.setValue(input, setting.updated); + const updatedValue = browser.getValue(input); + expect(updatedValue).to.equal(setting.updated); + } }); it('Ensure that the user dirty message is shown', function () { const dirtyMessage = page.selectors.create_manage_users.bottom_bar.messageByText('unsaved changes'); @@ -209,12 +223,13 @@ describe('Internal Dashboard', function () { browser.waitForVisible(page.selectors.create_manage_users.window); browser.waitForVisible(page.selectors.create_manage_users.current_users.container); }); - it(`Check that the ${value.label} is back to ${value.expected}`, function () { - const userTypeInput = page.selectors.create_manage_users.current_users.settings.inputByLabelText(value.label, value.type); + it(`Check that the ${setting.label} is back to ${setting.original}`, function () { + const inputType = 'dropdown' === setting.type ? 'text' : setting.type; + const inputElem = page.selectors.create_manage_users.current_users.settings.inputByLabel(setting.label, inputType); - browser.waitForVisible(userTypeInput); - const userType = browser.getValue(userTypeInput); - expect(userType).to.equal(value.expected); + browser.waitForVisible(inputElem); + const inputValue = browser.getValue(inputElem); + expect(inputValue).to.equal(setting.original); }); it('Close the Edit Existing User Modal', function () { const closeButton = page.selectors.create_manage_users.current_users.button('Close'); @@ -224,6 +239,95 @@ describe('Internal Dashboard', function () { }); }); }); + describe('Make sure that the newly created user can have its settings updated successfully', function () { + settings.forEach(function (setting) { + describe(`Checking: ${setting.label}`, function () { + it('Select the "Existing Users" tab', function () { + browser.waitForVisible(page.selectors.user_management.tabs.existing_users()); + browser.waitAndClick(page.selectors.user_management.tabs.existing_users()); + }); + it('Ensure that the "Existing Users" table is displayed', function () { + browser.waitForVisible(page.selectors.existing_users.table.container); + }); + it('Double click the users row in the `Existing Users` table', function () { + const usernameCol = page.selectors.existing_users.table.col_for_user('btest', 'Username'); + browser.waitForValue(usernameCol); + browser.doubleClick(usernameCol); + + browser.waitForVisible(page.selectors.create_manage_users.window); + browser.waitForVisible(page.selectors.create_manage_users.current_users.container); + }); + it(`Change the "${setting.label}" to "${setting.updated}"`, function () { + if ('dropdown' === setting.type) { + const inputTrigger = page.selectors.create_manage_users.current_users.settings.dropDownTriggerByLabel(setting.label); + browser.waitForVisible(inputTrigger); + browser.click(inputTrigger); + + const inputDropDown = page.selectors.combo.container; + browser.waitForVisible(inputDropDown); + + const dropDownValue = page.selectors.combo.itemByText(setting.updated); + browser.waitForVisible(dropDownValue); + browser.waitAndClick(dropDownValue); + + browser.waitForInvisible(inputDropDown); + } else if ('text' === setting.type) { + const input = page.selectors.create_manage_users.current_users.settings.inputByLabel(setting.label, setting.type); + browser.waitForVisible(input); + browser.setValue(input, setting.updated); + } + }); + it('Ensure that the user dirty message is shown', function () { + const dirtyMessage = page.selectors.create_manage_users.bottom_bar.messageByText('unsaved changes'); + browser.waitForVisible(dirtyMessage); + }); + it('Click the save button', function () { + const saveButton = page.selectors.create_manage_users.current_users.button('Save Changes'); + browser.waitAndClick(saveButton); + + const updateModal = page.selectors.updateSuccessNotification('btest'); + browser.waitForVisible(updateModal); + browser.waitForInvisible(updateModal); + }); + if ('User Type' === setting.label) { + it('Check that the user is not still selected.', function () { + const noUserSelectedModal = page.selectors.create_manage_users.current_users.settings.noUserSelectedModal(); + browser.waitForVisible(noUserSelectedModal); + }); + it('Check that the user is not listed in the Existing Users table', function () { + const updatedUser = page.selectors.create_manage_users.current_users.user_list.col_for_user('btest', 'Username'); + browser.waitForInvisible(updatedUser); + }); + it(`Change the Displayed User Type to: "${setting.updated}"`, function () { + const displayedUserType = page.selectors.create_manage_users.current_users.user_list.toolbar.buttonByLabel('Displaying', setting.original); + browser.waitForVisible(displayedUserType); + browser.waitAndClick(displayedUserType); + + const newUserTypeItem = page.selectors.create_manage_users.current_users.user_list.dropDownItemByText(setting.updated); + browser.waitForVisible(newUserTypeItem); + browser.waitAndClick(newUserTypeItem); + }); + it('Check that the user is listed in the Existing Users table.', function () { + const updatedUser = page.selectors.create_manage_users.current_users.user_list.col_for_user('btest', 'Username'); + browser.waitForVisible(updatedUser); + }); + } else { + it(`Check that "${setting.label}" has been updated successfully to "${setting.updated}"`, function () { + const inputType = 'dropdown' === setting.type ? 'text' : setting.type; + const input = page.selectors.create_manage_users.current_users.settings.inputByLabel(setting.label, inputType); + browser.waitForVisible(input); + const updatedValue = browser.getValue(input); + expect(updatedValue).to.equal(setting.updated); + }); + } + + it('Close the edit user modal', function () { + const closeButton = page.selectors.create_manage_users.current_users.button('Close'); + browser.waitAndClick(closeButton); + }); + }); + }); + }); describe('Remove the newly created User', function () { it('Ensure that were on the "Existing Users" tab', function () { browser.waitForVisible(page.selectors.user_management.tabs.existing_users()); @@ -239,14 +343,14 @@ describe('Internal Dashboard', function () { browser.waitForVisible(page.selectors.create_manage_users.window); }); it('Ensure that the "Actions" button is visible and click it', function () { - browser.waitForVisible(page.selectors.create_manage_users.current_users.toolbar.actions.button()); - browser.waitForLoadedThenClick(page.selectors.create_manage_users.current_users.toolbar.actions.button()); + browser.waitForVisible(page.selectors.create_manage_users.current_users.settings.toolbar.actions.button()); + browser.waitForLoadedThenClick(page.selectors.create_manage_users.current_users.settings.toolbar.actions.button()); }); it('Ensure that the Actions menu has been displayed', function () { - browser.waitForVisible(page.selectors.create_manage_users.current_users.toolbar.actions.container); + browser.waitForVisible(page.selectors.create_manage_users.current_users.settings.toolbar.actions.container); }); it('Click the "Delete This User" menu item', function () { - const deleteUserItem = page.selectors.create_manage_users.current_users.toolbar.actions.itemWithText('Delete This Account'); + const deleteUserItem = page.selectors.create_manage_users.current_users.settings.toolbar.actions.itemWithText('Delete This Account'); browser.waitForVisible(deleteUserItem); browser.click(deleteUserItem); }); diff --git a/tests/ui/test/specs/xdmod/internalDashboard.page.js b/tests/ui/test/specs/xdmod/internalDashboard.page.js index f6a4416c35..958c0093aa 100644 --- a/tests/ui/test/specs/xdmod/internalDashboard.page.js +++ b/tests/ui/test/specs/xdmod/internalDashboard.page.js @@ -109,21 +109,7 @@ class InternalDashboard { } }, current_users: { - container: '//div[@id="admin_panel_user_editor"]', - toolbar: { - container: function () { - return `${self.selectors.create_manage_users.current_users.container}//div[contains(@class, "x-toolbar")]`; - }, - actions: { - button: function () { - return `${self.selectors.create_manage_users.current_users.toolbar.container()}//button[.="Actions"]`; - }, - container: '//div[contains(@class, "existing_users_action_menu")]', - itemWithText: function (text) { - return `${self.selectors.create_manage_users.current_users.toolbar.actions.container}//span[.="${text}"]`; - } - } - }, + container: '//div[@id="admin_tab_existing_user"]', dialogs: { deleteUser: { container: '//div[contains(@class, "delete_user") and contains(@class, "x-window")]', @@ -134,11 +120,55 @@ class InternalDashboard { }, settings: { container: '//div[@id="admin_panel_user_editor"]', - inputByLabelText: function (labelText, inputType) { + toolbar: { + container: function () { + return `${self.selectors.create_manage_users.current_users.settings.container}//div[contains(@class, "x-toolbar")]`; + }, + actions: { + button: function () { + return `${self.selectors.create_manage_users.current_users.settings.toolbar.container()}//button[.="Actions"]`; + }, + container: '//div[contains(@class, "existing_users_action_menu")]', + itemWithText: function (text) { + return `${self.selectors.create_manage_users.current_users.settings.toolbar.actions.container}//span[.="${text}"]`; + } + } + }, + inputByLabel: function (labelText, inputType) { return `${self.selectors.create_manage_users.current_users.settings.container}//label[contains(text(), "${labelText}")]/parent::*//input[@type="${inputType}"]`; }, - inputTriggerByLabelText: function (labelText) { + dropDownTriggerByLabel: function (labelText) { return `${self.selectors.create_manage_users.current_users.settings.container}//label[contains(text(), "${labelText}")]/parent::*//img[contains(@class, "x-form-trigger")]`; + }, + noUserSelectedModal: function () { + return `${self.selectors.create_manage_users.current_users.settings.container}//div[contains(@class, 'ext-el-mask-msg')]//div[contains(text(), 'Select A User From The List To The Left')]`; + } + }, + user_list: { + container: function () { + return `${self.selectors.create_manage_users.current_users.container}//div[contains(@class, 'admin_panel_existing_user_list')]`; + }, + toolbar: { + container: function () { + return `${self.selectors.create_manage_users.current_users.user_list.container()}//div[contains(@class, 'x-panel-tbar')]`; + }, + buttonByLabel: function (labelText, buttonText) { + return `${self.selectors.create_manage_users.current_users.user_list.toolbar.container()}//div[contains(text(), "${labelText}")]/following::*//button[contains(text(), "${buttonText}")]`; + } + }, + dropDownItemByText: function (text) { + return `//div[contains(@class, 'x-menu')]//ul[contains(@class, 'x-menu-list')]//span[contains(text(), '${text}')]/parent::*[contains(@class, 'x-menu-item')]`; + }, + /** + * Retrieve a column via `column_name`, for a user via + * `username` which corresponds to a value located in the + * `Username` column. + * + * @param username {string} + * @returns {string} + */ + col_for_user: function (username) { + return `${self.selectors.create_manage_users.current_users.user_list.container()}//div[contains(@class, "x-grid3-body")]//table//td[.="${username}"]`; } }, button: function (text) { @@ -211,6 +241,11 @@ class InternalDashboard { '//b[text()[1][contains(., "User")] and text()[2][contains(., "deleted from the portal")]]/b[text() = "' + username + '"]/ancestor::node()[1]'; }, + updateSuccessNotification: function (username) { + return self.selectors.modal.containerByTitle('User Management') + + '//b[text()[1][contains(., "User")] and text()[2][contains(., "updated successfully")]]/b[text() = "' + + username + '"]/ancestor::node()[1]'; + }, modal: { containerByTitle: function (title) { return `//div[contains(@class, "x-window")]//div[contains(@class, "x-window-header")]//span[contains(@class, "x-window-header-text") and text()="${title}"]/ancestor::node()[5]`;