From 6a2b1ca0fcf52f7aa039e2600b62c6f19078f329 Mon Sep 17 00:00:00 2001 From: IhorBohdan <99126301+IhorBohdan@users.noreply.github.com> Date: Tue, 24 Sep 2024 15:36:41 +0300 Subject: [PATCH 1/3] Implement FAT-16460 (#4235) * Fix extended tests Thunderjet * Rewrite big UI methods into one API * Update tests after UIF-540 * Implement 16460 * Implement FAT-16460 * Fix linter --------- Co-authored-by: bohdanihor Co-authored-by: sviatlana-stsiapanava --- .../edit-routing-list-configuration.cy.js | 51 +++++++++++++++++ .../settings/orders/listConfiguration.js | 48 ++++++++++++++++ .../settings/orders/routingAddress.js | 7 +++ .../orders/settingOrdersNavigationMenu.js | 55 +++++++++++++++++++ cypress/support/fragments/settingsMenu.js | 2 + 5 files changed, 163 insertions(+) create mode 100644 cypress/e2e/settings/orders/edit-routing-list-configuration.cy.js create mode 100644 cypress/support/fragments/settings/orders/listConfiguration.js create mode 100644 cypress/support/fragments/settings/orders/routingAddress.js create mode 100644 cypress/support/fragments/settings/orders/settingOrdersNavigationMenu.js diff --git a/cypress/e2e/settings/orders/edit-routing-list-configuration.cy.js b/cypress/e2e/settings/orders/edit-routing-list-configuration.cy.js new file mode 100644 index 0000000000..46a6085248 --- /dev/null +++ b/cypress/e2e/settings/orders/edit-routing-list-configuration.cy.js @@ -0,0 +1,51 @@ +import permissions from '../../../support/dictionary/permissions'; +import ListConfiguration from '../../../support/fragments/settings/orders/listConfiguration'; +import SettingsMenu from '../../../support/fragments/settingsMenu'; +import Users from '../../../support/fragments/users/users'; +import getRandomPostfix from '../../../support/utils/stringTools'; +import RoutingAddress from '../../../support/fragments/settings/orders/routingAddress'; +import SettingOrdersNavigationMenu from '../../../support/fragments/settings/orders/settingOrdersNavigationMenu'; + +Cypress.on('uncaught:exception', () => false); + +describe('orders: Settings', () => { + const listConfigurationDesription = `LCD${getRandomPostfix()}`; + const routingAddressLink = 'routing-address'; + let user; + + before(() => { + cy.getAdminToken(); + + cy.createTempUser([permissions.uiSettingsOrdersCanViewAndEditAllSettings.gui]).then( + (userProperties) => { + user = userProperties; + cy.login(user.username, user.password, { + path: SettingsMenu.ordersListConfigurationPath, + waiter: ListConfiguration.waitLoading, + }); + }, + ); + }); + + after(() => { + cy.getAdminToken(); + Users.deleteViaApi(user.userId); + }); + + it( + 'C466275 Edit routing list configuration (thunderjet)', + { tags: ['criticalPath', 'thunderjet'] }, + () => { + ListConfiguration.edit(); + ListConfiguration.fillInfoSectionFields(listConfigurationDesription, routingAddressLink); + ListConfiguration.addLinkInBody(); + ListConfiguration.save(); + ListConfiguration.clickOnLinkInBody(routingAddressLink); + RoutingAddress.waitLoading(); + SettingOrdersNavigationMenu.selectListConfiguration(); + ListConfiguration.preview(); + ListConfiguration.clickOnLinkInPreview(routingAddressLink); + RoutingAddress.waitLoading(); + }, + ); +}); diff --git a/cypress/support/fragments/settings/orders/listConfiguration.js b/cypress/support/fragments/settings/orders/listConfiguration.js new file mode 100644 index 0000000000..4388b9908b --- /dev/null +++ b/cypress/support/fragments/settings/orders/listConfiguration.js @@ -0,0 +1,48 @@ +import { Button, Link, Modal, Section, TextArea } from '../../../../../interactors'; +import RichTextEditor from '../../../../../interactors/rich-text-editor'; + +const routingListConfigurationSection = Section({ id: 'routing-list-configuration-template-pane' }); +const previewModal = Modal({ id: 'preview-modal' }); + +export default { + waitLoading() { + cy.expect(routingListConfigurationSection.exists()); + }, + + edit() { + cy.wait(2000); + cy.do(routingListConfigurationSection.find(Button('Edit')).click()); + }, + + preview() { + cy.wait(2000); + cy.do(routingListConfigurationSection.find(Button('Preview')).click()); + cy.expect(previewModal.exists()); + }, + + save() { + cy.do(Button({ id: 'routing-list-configuration-save-button' }).click()); + }, + + fillInfoSectionFields(descripription, body) { + cy.wait(2000); + cy.do(TextArea({ name: 'description' }).fillIn(descripription)); + cy.do(RichTextEditor().fillIn(body)); + }, + + addLinkInBody: () => { + cy.get('.ql-container > .ql-editor').type('{selectAll}'); + cy.do(Button({ ariaLabel: 'link' }).click()); + cy.get('.ql-action').click(); + }, + + clickOnLinkInBody(linkName) { + cy.wait(2000); + cy.do(routingListConfigurationSection.find(Link(linkName)).click()); + }, + + clickOnLinkInPreview(linkName) { + cy.wait(2000); + cy.do(previewModal.find(Link(linkName)).click()); + }, +}; diff --git a/cypress/support/fragments/settings/orders/routingAddress.js b/cypress/support/fragments/settings/orders/routingAddress.js new file mode 100644 index 0000000000..423b2c2e62 --- /dev/null +++ b/cypress/support/fragments/settings/orders/routingAddress.js @@ -0,0 +1,7 @@ +import { Section } from '../../../../../interactors'; + +export default { + waitLoading() { + cy.expect(Section({ id: 'central-ordering' }).exists()); + }, +}; diff --git a/cypress/support/fragments/settings/orders/settingOrdersNavigationMenu.js b/cypress/support/fragments/settings/orders/settingOrdersNavigationMenu.js new file mode 100644 index 0000000000..d8735b7711 --- /dev/null +++ b/cypress/support/fragments/settings/orders/settingOrdersNavigationMenu.js @@ -0,0 +1,55 @@ +import { NavListItem } from '../../../../../interactors'; + +export default { + selectApprovals: () => { + cy.do(NavListItem('Approvals').click()); + }, + selectClosingPurchaseOrderReasons: () => { + cy.do(NavListItem('Closing purchase order reasons').click()); + }, + selectOrderTemplates: () => { + cy.do(NavListItem('Order templates').click()); + }, + selectOpeningPurchaseOrders: () => { + cy.do(NavListItem('Opening purchase orders').click()); + }, + selectAcquisitionMethods: () => { + cy.do(NavListItem('Acquisition methods').click()); + }, + selectCustomFieldsPurchaseOrders: () => { + cy.do(NavListItem('Custom Fields - Purchase Orders').click()); + }, + selectCustomFieldsPurchaseOrderLines: () => { + cy.do(NavListItem('Custom Fields - Purchase Order Lines').click()); + }, + selectPONumberEdit: () => { + cy.do(NavListItem('Edit').click()); + }, + selectPrefixes: () => { + cy.do(NavListItem('Prefixes').click()); + }, + selectCategories: () => { + cy.do(NavListItem('Suffixes').click()); + }, + selectInstanceMatching: () => { + cy.do(NavListItem('Instance matching').click()); + }, + selectInventoryInteractionsDefaults: () => { + cy.do(NavListItem('Inventory interactions defaults').click()); + }, + selectInstanceStatus: () => { + cy.do(NavListItem('Instance status').click()); + }, + selectInstanceType: () => { + cy.do(NavListItem('Instance type').click()); + }, + selectLoanType: () => { + cy.do(NavListItem('Loan type').click()); + }, + selectRoutingAddress: () => { + cy.do(NavListItem('Routing address').click()); + }, + selectListConfiguration: () => { + cy.do(NavListItem('List configuration').click()); + }, +}; diff --git a/cypress/support/fragments/settingsMenu.js b/cypress/support/fragments/settingsMenu.js index 2cb30192e1..0a508f88d6 100644 --- a/cypress/support/fragments/settingsMenu.js +++ b/cypress/support/fragments/settingsMenu.js @@ -89,6 +89,8 @@ export default { ordersInstanceStatusPath: 'settings/orders/instance-status', ordersInstanceTypePath: 'settings/orders/instance-type', ordersLoanTypePath: 'settings/orders/loan-type', + ordersRoutingAddressPath: 'settings/orders/routing-address', + ordersListConfigurationPath: 'settings/orders/list-configuration', // Users patronGroups: 'settings/users/groups', addressTypes: 'settings/users/addresstypes', From 5257056dc7deec1e1cafbbe233e0292b197e2eea Mon Sep 17 00:00:00 2001 From: Sviatlana Stsiapanava <152482600+sviatlana-stsiapanava@users.noreply.github.com> Date: Tue, 24 Sep 2024 23:35:09 +0500 Subject: [PATCH 2/3] FAT-16466 Support the test cases in daily run (#4237) * Fix the tests behaviour * Add the steps to the test case C468192 --- ...t-in-app-instances-remove-all-add-note.cy.js | 16 +++++++++++++++- .../remote-storage/remote-storage.cy.js | 2 ++ .../bulk-edit/bulk-edit-search-pane.js | 17 +++++++++++++++++ .../settings/remote-storage/configurations.js | 6 ++++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/cypress/e2e/bulk-edit/in-app/bulk-edit-in-app-instances-remove-all-add-note.cy.js b/cypress/e2e/bulk-edit/in-app/bulk-edit-in-app-instances-remove-all-add-note.cy.js index 261ef4d9f9..4c3ef635ce 100644 --- a/cypress/e2e/bulk-edit/in-app/bulk-edit-in-app-instances-remove-all-add-note.cy.js +++ b/cypress/e2e/bulk-edit/in-app/bulk-edit-in-app-instances-remove-all-add-note.cy.js @@ -1,6 +1,7 @@ import permissions from '../../../support/dictionary/permissions'; import BulkEditActions from '../../../support/fragments/bulk-edit/bulk-edit-actions'; import BulkEditSearchPane from '../../../support/fragments/bulk-edit/bulk-edit-search-pane'; +import BulkEditFiles from '../../../support/fragments/bulk-edit/bulk-edit-files'; import InventoryInstances from '../../../support/fragments/inventory/inventoryInstances'; import TopMenu from '../../../support/fragments/topMenu'; import Users from '../../../support/fragments/users/users'; @@ -18,6 +19,7 @@ const instanceUUIDsFileName = `instanceUUIDs-${getRandomPostfix()}.csv`; const matchedRecordsFileName = `*-Matched-Records-${instanceUUIDsFileName}`; const previewFileName = `*-Updates-Preview-${instanceUUIDsFileName}`; const changedRecordsFileName = `*-Changed-Records-${instanceUUIDsFileName}`; +const errorsFromCommittingFileName = `*-Committing-changes-Errors-${instanceUUIDsFileName}`; const folioItem = { instanceName: `testBulkEdit_${getRandomPostfix()}`, itemBarcode: `folioItem${getRandomPostfix()}`, @@ -26,7 +28,6 @@ const marcInstance = { instanceName: `testBulkEdit_${getRandomPostfix()}`, itemBarcode: `folioItem${getRandomPostfix()}`, }; - const notes = { dissertationNote: 'test instance note', dissertationNoteStaffOnly: 'test instance note staff only', @@ -34,6 +35,7 @@ const notes = { exhibitionsNote: 'exhibitions note', administrativeNote: 'administrative note', }; +const reasonForError = 'Bulk edit of instance notes is not supported for MARC Instances.'; describe('bulk-edit', () => { describe('in-app approach', () => { @@ -97,6 +99,7 @@ describe('bulk-edit', () => { matchedRecordsFileName, previewFileName, changedRecordsFileName, + errorsFromCommittingFileName, ); }); @@ -184,6 +187,10 @@ describe('bulk-edit', () => { `${notes.exhibitionsNote} (staff only)`, ); + BulkEditSearchPane.verifyErrorLabelInErrorAccordion(instanceUUIDsFileName, 2, 2, 3); + BulkEditSearchPane.verifyNonMatchedResults(marcInstance.instanceId); + BulkEditSearchPane.verifyReasonForError(reasonForError); + BulkEditActions.openActions(); BulkEditActions.downloadChangedCSV(); ExportFile.verifyFileIncludes(previewFileName, [ @@ -196,6 +203,13 @@ describe('bulk-edit', () => { ]); ExportFile.verifyFileIncludes(previewFileName, ['Dissertation note'], false); + BulkEditActions.downloadErrors(); + BulkEditFiles.verifyCSVFileRows(errorsFromCommittingFileName, [ + `${marcInstance.instanceId},${reasonForError}`, + `${marcInstance.instanceId},${reasonForError}`, + `${marcInstance.instanceId},${reasonForError}`, + ]); + cy.visit(TopMenu.inventoryPath); InventorySearchAndFilter.searchInstanceByTitle(folioItem.instanceName); InventoryInstances.selectInstance(); diff --git a/cypress/e2e/settings/remote-storage/remote-storage.cy.js b/cypress/e2e/settings/remote-storage/remote-storage.cy.js index caf20f2d97..a466cca60e 100644 --- a/cypress/e2e/settings/remote-storage/remote-storage.cy.js +++ b/cypress/e2e/settings/remote-storage/remote-storage.cy.js @@ -47,6 +47,7 @@ describe('remote-storage-configuration', () => { false, ); Configurations.closeEditConfiguration(); + Configurations.clickCloseWithoutSavingButtonInAreYouSureForm(); Configurations.deleteRemoteStorage(newName); }); }); @@ -72,6 +73,7 @@ describe('remote-storage-configuration', () => { Configurations.editConfiguration(name, { timingInput: timingToEdit }); Configurations.closeWithoutSaving(); Configurations.editConfiguration(name, { urlInput: urlToEdit, timingInput: '1' }); + Configurations.closeWithSaving(); // delete created configuration Configurations.deleteRemoteStorage(name); diff --git a/cypress/support/fragments/bulk-edit/bulk-edit-search-pane.js b/cypress/support/fragments/bulk-edit/bulk-edit-search-pane.js index 24d060624e..8a71312017 100644 --- a/cypress/support/fragments/bulk-edit/bulk-edit-search-pane.js +++ b/cypress/support/fragments/bulk-edit/bulk-edit-search-pane.js @@ -559,6 +559,23 @@ export default { ); }, + verifyErrorLabelInErrorAccordion( + fileName, + numberOfEntries, + numberOfRecordsChanged, + numberOfErrors, + ) { + cy.expect( + Accordion('Errors') + .find( + HTML( + `${fileName}: ${numberOfEntries} entries * ${numberOfRecordsChanged} records changed * ${numberOfErrors} errors`, + ), + ) + .exists(), + ); + }, + verifyReasonForError(errorText) { cy.expect( Accordion('Errors') diff --git a/cypress/support/fragments/settings/remote-storage/configurations.js b/cypress/support/fragments/settings/remote-storage/configurations.js index a52edf6ab1..fd6fda6483 100644 --- a/cypress/support/fragments/settings/remote-storage/configurations.js +++ b/cypress/support/fragments/settings/remote-storage/configurations.js @@ -263,6 +263,11 @@ export default { ]); }, + clickCloseWithoutSavingButtonInAreYouSureForm() { + cy.do(Modal('Are you sure?').find(Button('Close without saving')).click()); + cy.wait(1000); + }, + closeWithSaving() { return cy.do(Modal().find(Button('Save')).click()); }, @@ -323,6 +328,7 @@ export default { }, closeEditConfiguration() { cy.do([editConfigurationPane.find(xButton).click()]); + cy.wait(1000); }, clickDeleteRemoteStorage(name) { From d989ea385e0f5d366788dd630f4c16383af99a9e Mon Sep 17 00:00:00 2001 From: IhorBohdan <99126301+IhorBohdan@users.noreply.github.com> Date: Tue, 24 Sep 2024 23:03:40 +0300 Subject: [PATCH 3/3] Implement FAT-16459 (#4236) * Fix extended tests Thunderjet * Rewrite big UI methods into one API * Update tests after UIF-540 * Implement 16460 * Implement FAT-16460 * Implement FAT-16459 * Fix linter * Move to const --------- Co-authored-by: bohdanihor Co-authored-by: sviatlana-stsiapanava --- ...tokens-to-routing-list-configuration.cy.js | 57 +++++++++++++++++++ .../settings/orders/listConfiguration.js | 54 +++++++++++++++++- 2 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 cypress/e2e/settings/orders/add-tokens-to-routing-list-configuration.cy.js diff --git a/cypress/e2e/settings/orders/add-tokens-to-routing-list-configuration.cy.js b/cypress/e2e/settings/orders/add-tokens-to-routing-list-configuration.cy.js new file mode 100644 index 0000000000..76a69ef8af --- /dev/null +++ b/cypress/e2e/settings/orders/add-tokens-to-routing-list-configuration.cy.js @@ -0,0 +1,57 @@ +import permissions from '../../../support/dictionary/permissions'; +import ListConfiguration from '../../../support/fragments/settings/orders/listConfiguration'; +import SettingsMenu from '../../../support/fragments/settingsMenu'; +import Users from '../../../support/fragments/users/users'; + +Cypress.on('uncaught:exception', () => false); + +describe('orders: Settings', () => { + let user; + + before(() => { + cy.getAdminToken(); + + cy.createTempUser([permissions.uiSettingsOrdersCanViewAndEditAllSettings.gui]).then( + (userProperties) => { + user = userProperties; + cy.login(user.username, user.password, { + path: SettingsMenu.ordersListConfigurationPath, + waiter: ListConfiguration.waitLoading, + }); + }, + ); + }); + + after(() => { + cy.getAdminToken(); + Users.deleteViaApi(user.userId); + }); + + it( + 'C466279 Add tokens to routing list configuration (thunderjet)', + { tags: ['criticalPath', 'thunderjet'] }, + () => { + ListConfiguration.edit(); + ListConfiguration.clickOnAddTokensInBody(); + ListConfiguration.selectToken('routingList.name'); + ListConfiguration.selectToken('routingList.notes'); + ListConfiguration.addToken(); + ListConfiguration.save(); + ListConfiguration.preview(); + ListConfiguration.checkTokenInPreview('Routing Name'); + ListConfiguration.checkTokenInPreview('Routing notes'); + ListConfiguration.closePreviewModal(); + ListConfiguration.edit(); + ListConfiguration.clickOnAddTokensInBody(); + ListConfiguration.selectToken('routingList.name'); + ListConfiguration.addToken(); + ListConfiguration.selectToken('routingList.notes'); + ListConfiguration.cancelAddToken(); + ListConfiguration.cancelAndKeepEditing(); + ListConfiguration.clickOnAddTokensInBody(); + ListConfiguration.selectToken('routingList.name'); + ListConfiguration.cancelAddToken(); + ListConfiguration.cancel(); + }, + ); +}); diff --git a/cypress/support/fragments/settings/orders/listConfiguration.js b/cypress/support/fragments/settings/orders/listConfiguration.js index 4388b9908b..84d81330e2 100644 --- a/cypress/support/fragments/settings/orders/listConfiguration.js +++ b/cypress/support/fragments/settings/orders/listConfiguration.js @@ -1,8 +1,12 @@ -import { Button, Link, Modal, Section, TextArea } from '../../../../../interactors'; +import { Button, Checkbox, Link, Modal, Section, TextArea } from '../../../../../interactors'; import RichTextEditor from '../../../../../interactors/rich-text-editor'; +import InteractorsTools from '../../../utils/interactorsTools'; const routingListConfigurationSection = Section({ id: 'routing-list-configuration-template-pane' }); const previewModal = Modal({ id: 'preview-modal' }); +const addTokenModal = Modal('Add token'); +const cancelEditingConfirmationModal = Modal({ id: 'cancel-editing-confirmation' }); +const cancelButton = Button('Cancel'); export default { waitLoading() { @@ -22,6 +26,23 @@ export default { save() { cy.do(Button({ id: 'routing-list-configuration-save-button' }).click()); + InteractorsTools.checkCalloutMessage( + 'The Routing list configuration notice template was successfully updated.', + ); + }, + + cancel() { + cy.wait(2000); + cy.do(cancelButton.click()); + cy.expect(cancelEditingConfirmationModal.exists()); + cy.do(Button({ id: 'clickable-cancel-editing-confirmation-cancel' }).click()); + }, + + cancelAndKeepEditing() { + cy.wait(2000); + cy.do(cancelButton.click()); + cy.expect(cancelEditingConfirmationModal.exists()); + cy.do(Button({ id: 'clickable-cancel-editing-confirmation-confirm' }).click()); }, fillInfoSectionFields(descripription, body) { @@ -41,8 +62,39 @@ export default { cy.do(routingListConfigurationSection.find(Link(linkName)).click()); }, + clickOnAddTokensInBody() { + cy.wait(2000); + cy.do(Button({ ariaLabel: 'token' }).click()); + cy.expect(addTokenModal.exists()); + }, + + selectToken(tokenName) { + cy.wait(2000); + cy.do(Checkbox(tokenName).click()); + }, + + addToken() { + cy.wait(2000); + cy.do(addTokenModal.find(Button('Add token')).click()); + }, + + cancelAddToken() { + cy.wait(2000); + cy.do(addTokenModal.find(cancelButton).click()); + }, + clickOnLinkInPreview(linkName) { cy.wait(2000); cy.do(previewModal.find(Link(linkName)).click()); }, + + closePreviewModal() { + cy.wait(2000); + cy.do(previewModal.find(Button('Close')).click()); + }, + + checkTokenInPreview(tokenName) { + cy.wait(2000); + cy.get('#preview-modal-content').contains(`${tokenName}`); + }, };