diff --git a/cypress/e2e/linked-data/LD Edit/classification-marc.cy.js b/cypress/e2e/linked-data/LD Edit/classification-marc.cy.js index 9fc6292f16..2cf5982285 100644 --- a/cypress/e2e/linked-data/LD Edit/classification-marc.cy.js +++ b/cypress/e2e/linked-data/LD Edit/classification-marc.cy.js @@ -203,35 +203,35 @@ describe('Citation: check classification number MARC codes', () => { // Review editor sections EditResource.clickEditWork(); EditResource.waitLoading(EDIT_RESOURCE_HEADINGS.EDIT_WORK); - EditResource.checkDropdownTextValue(fieldData.dewey, fieldData.classificationType); + EditResource.checkSectionDropdownTextValue(fieldData.dewey, fieldData.classificationType); EditResource.checkTextValueOnField(resourceData.dewey1Number, fieldData.classificationNumber); EditResource.checkTextValueOnField(resourceData.dewey1Additional, fieldData.classificationAdditional); EditResource.checkTextValueOnField(resourceData.dewey1Edition, fieldData.classificationEdition); EditResource.checkTextValueOnField(resourceData.dewey1Full, fieldData.classificationFull); EditResource.checkTextValueOnDisabledField(resourceData.dnlmAgency, fieldData.classificationAssigner); - EditResource.checkDropdownTextValue(fieldData.dewey, fieldData.classificationType); + EditResource.checkSectionDropdownTextValue(fieldData.dewey, fieldData.classificationType); EditResource.checkTextValueOnField(resourceData.dewey2Number, fieldData.classificationNumber); EditResource.checkTextValueOnField(resourceData.dewey2Additional, fieldData.classificationAdditional); EditResource.checkTextValueOnField(resourceData.dewey2Edition, fieldData.classificationEdition); EditResource.checkTextValueOnField(resourceData.dewey2Full, fieldData.classificationFull); EditResource.checkTextValueOnDisabledField(resourceData.assigningAgency, fieldData.classificationAssigner); - EditResource.checkDropdownTextValue(fieldData.dewey, fieldData.classificationType); + EditResource.checkSectionDropdownTextValue(fieldData.dewey, fieldData.classificationType); EditResource.checkTextValueOnField(resourceData.dewey3Number, fieldData.classificationNumber); EditResource.checkTextValueOnField(resourceData.dewey3Additional, fieldData.classificationAdditional); EditResource.checkTextValueOnField(resourceData.dewey3Edition, fieldData.classificationEdition); EditResource.checkTextValueOnField(resourceData.dewey3Full, fieldData.classificationFull); EditResource.checkTextValueOnDisabledField(resourceData.caoonlAgency, fieldData.classificationAssigner); - EditResource.checkDropdownTextValue(fieldData.lccn, fieldData.classificationType); + EditResource.checkSectionDropdownTextValue(fieldData.lccn, fieldData.classificationType); EditResource.checkTextValueOnField(resourceData.lccn1Number, fieldData.classificationNumber); EditResource.checkTextValueOnField(resourceData.lccn1Additional, fieldData.classificationAdditional); EditResource.checkTextValueOnDisabledField(resourceData.assigningAgency, fieldData.classificationAgency); EditResource.checkLabelOnSimpleField(resourceData.lccn1Used, fieldData.classificationUsed); - EditResource.checkDropdownTextValue(fieldData.lccn, fieldData.classificationType); + EditResource.checkSectionDropdownTextValue(fieldData.lccn, fieldData.classificationType); EditResource.checkTextValueOnField(resourceData.lccn2Number, fieldData.classificationNumber); EditResource.checkTextValueOnField(resourceData.lccn2Additional, fieldData.classificationAdditional); EditResource.checkTextValueOnDisabledField(resourceData.assigningAgency, fieldData.classificationAgency); EditResource.checkLabelOnSimpleField(resourceData.lccn2Used, fieldData.classificationUsed); - EditResource.checkDropdownTextValue(fieldData.lccn, fieldData.classificationType); + EditResource.checkSectionDropdownTextValue(fieldData.lccn, fieldData.classificationType); EditResource.checkTextValueOnField(resourceData.lccn3Number, fieldData.classificationNumber); EditResource.checkTextValueOnField(resourceData.lccn3Additional, fieldData.classificationAdditional); EditResource.checkTextValueOnDisabledField('', fieldData.classificationAgency); @@ -283,7 +283,7 @@ describe('Citation: check classification number MARC codes', () => { SearchAndFilter.checkSearchResultsByTitle(resourceData.marigoldTitle); Marigold.clickEditWorkFromSearch(); EditResource.waitLoading(EDIT_RESOURCE_HEADINGS.EDIT_WORK); - EditResource.checkDropdownTextValue(fieldData.dewey, fieldData.classificationType); + EditResource.checkSectionDropdownTextValue(fieldData.dewey, fieldData.classificationType); EditResource.checkTextValueOnField(resourceData.marigoldDeweyNumber, fieldData.classificationNumber); EditResource.checkTextValueOnField(resourceData.marigoldDeweyAdditional, fieldData.classificationAdditional); EditResource.checkTextValueOnField(resourceData.marigoldDeweyEdition, fieldData.classificationEdition); diff --git a/cypress/e2e/linked-data/LD Edit/language-code-marc.cy.js b/cypress/e2e/linked-data/LD Edit/language-code-marc.cy.js new file mode 100644 index 0000000000..33262a668e --- /dev/null +++ b/cypress/e2e/linked-data/LD Edit/language-code-marc.cy.js @@ -0,0 +1,221 @@ +import { + APPLICATION_NAMES, + DEFAULT_JOB_PROFILE_NAMES, + EDIT_RESOURCE_HEADINGS, +} from '../../../support/constants'; +import CapabilitySets from '../../../support/dictionary/capabilitySets'; +import getRandomPostfix from '../../../support/utils/stringTools'; +import FileManager from '../../../support/utils/fileManager'; + +import DataImport from '../../../support/fragments/data_import/dataImport'; +import InventoryInstance from '../../../support/fragments/inventory/inventoryInstance'; +import InventoryInstances from '../../../support/fragments/inventory/inventoryInstances'; +import InstanceRecordEdit from '../../../support/fragments/inventory/instanceRecordEdit'; +import InventorySearchAndFilter from '../../../support/fragments/inventory/inventorySearchAndFilter'; +import TopMenu from '../../../support/fragments/topMenu'; +import TopMenuNavigation from '../../../support/fragments/topMenuNavigation'; +import Users from '../../../support/fragments/users/users'; + +import EditResource from '../../../support/fragments/linked-data/editResource'; +import InstanceProfileModal from '../../../support/fragments/linked-data/instanceProfileModal'; +import Marigold from '../../../support/fragments/linked-data/marigold'; +import PreviewResource from '../../../support/fragments/linked-data/previewResource'; +import SearchAndFilter from '../../../support/fragments/linked-data/searchAndFilter'; +import ViewMarc from '../../../support/fragments/linked-data/viewMarc'; +import Work from '../../../support/fragments/linked-data/work'; +import WorkProfileModal from '../../../support/fragments/linked-data/workProfileModal'; + +import { + MARIGOLD_CAPABILITIES, + MARIGOLD_CAPABILITY_SETS, +} from '../../../support/dictionary/marigoldCapabilities'; + +let user; + +describe('Citation: check language MARC codes', () => { + const testData = { + workId: null, + instanceId: null, + marcFilePath: 'marcFileForC499692.mrc', + modifiedMarcFile: `C499692 editedMarcFile${getRandomPostfix()}.mrc`, + marcFileName: `C499692 marcFile${getRandomPostfix()}.mrc`, + uniqueInventoryTitle: `Language code inventory ${getRandomPostfix()}`, + uniqueMarigoldWorkTitle: `Lanuage code Marigold ${getRandomPostfix()}`, + uniqueMarigoldInstanceTitle: `Lanuage code Marigold ${getRandomPostfix()}`, + }; + + const resourceData = { + inventoryTitle: testData.uniqueInventoryTitle, + marigoldWorkTitle: testData.uniqueMarigoldWorkTitle, + marigoldInstanceTitle: testData.uniqueMarigoldInstanceTitle, + language: 'English', + languageCode: 'eng', + languageRel: 'Primary source language', + languageLink: 'http://id.loc.gov/vocabulary/languages/eng', + languageSelect: 'English (eng)', + marcLanguageCode: '$a eng', + marc008LangPosition: 36, + languagesSubset: [ + 'Akkadian (akk)', + 'Bemba (bem)', + 'Croatian (hrv)', + 'Kanuri (kau)', + 'Nepali (nep)', + 'Uighur (uig)', + 'Zaza (zza)', + ], + languageRelationships: [ + 'Primary source language', + 'Summary or abstract', + 'Sung or spoken text', + 'Librettos', + 'Table of contents', + 'Accompanying material other than librettos and transcripts', + 'Original language', + 'Intertitles', + 'Subtitles', + 'Intermediate translation', + 'Original accompanying materials other than librettos', + 'Original libretto', + 'Captions', + 'Accessible audio', + 'Accessible visual language (non-textual)', + 'Accompanying transcripts for audiovisual material', + ], + }; + + const fieldData = { + languageSection: 'Language code', + languageField: 'Language', + languageRelField: 'Language relationship', + workTitle: 'Preferred Title for Work', + instanceTitle: 'Main Title', + ldSource: 'LINKED_DATA', + }; + + before('Create test data', () => { + DataImport.editMarcFile( + testData.marcFilePath, + testData.modifiedMarcFile, + ['Placeholder Title Language Code'], + [testData.uniqueInventoryTitle], + ); + cy.getAdminToken(); + + cy.createTempUser([]).then((userProperties) => { + user = userProperties; + cy.assignCapabilitiesToExistingUser( + user.userId, + MARIGOLD_CAPABILITIES, + [ + ...MARIGOLD_CAPABILITY_SETS, + CapabilitySets.uiInventoryInstanceView, + CapabilitySets.uiInventoryInstanceEdit, + ], + ); + }); + + DataImport.uploadFileViaApi( + testData.modifiedMarcFile, + testData.marcFileName, + DEFAULT_JOB_PROFILE_NAMES.CREATE_INSTANCE_AND_SRS, + ); + }); + + after('Delete test data', () => { + FileManager.deleteFile(`cypress/fixtures/${testData.modifiedMarcFile}`); + cy.getAdminToken(); + InventoryInstances.deleteFullInstancesByTitleViaApi(resourceData.inventoryTitle); + InventoryInstances.deleteFullInstancesByTitleViaApi(resourceData.marigoldInstanceTitle); + Work.getInstancesByTitle(resourceData.inventoryTitle).then((instances) => { + const filteredInstances = instances.filter( + (element) => element.titles[0].value === resourceData.inventoryTitle, + ); + Work.deleteById(filteredInstances[0].id); + }); + Work.getIdByTitle(resourceData.inventoryTitle).then((id) => Work.deleteById(id)); + if (testData.instanceId) Work.deleteInstanceViaApi(testData.instanceId); + if (testData.workId) Work.deleteById(testData.workId); + Users.deleteViaApi(user.userId); + }); + + beforeEach(() => { + cy.login(user.username, user.password, { + path: TopMenu.inventoryPath, + waiter: InventoryInstances.waitContentLoading, + authRefresh: true, + }); + }); + + it( + 'C499692 Marigold - Language Code Work / Inventory / View MARC', + { tags: ['criticalPath', 'citation', 'C499692', 'marigold'] }, + () => { + // Edit instance from Inventory + InventoryInstances.searchByTitle(resourceData.inventoryTitle); + InventoryInstance.editInstanceInMG(); + PreviewResource.waitLoading(); + PreviewResource.clickContinue(); + EditResource.waitLoading(EDIT_RESOURCE_HEADINGS.EDIT_INSTANCE); + EditResource.clickEditWork(); + EditResource.waitLoading(EDIT_RESOURCE_HEADINGS.EDIT_WORK); + + // Check work language fields + EditResource.checkLabelOnSimpleField(resourceData.languageSelect, fieldData.languageField); + EditResource.checkDropdownTextValue(resourceData.languageRel, fieldData.languageRelField); + EditResource.checkSimpleFieldDropdownContainsOptions(fieldData.languageField, resourceData.languagesSubset); + EditResource.checkDropdownContainsOptions(fieldData.languageRelField, resourceData.languageRelationships); + + // Review MARC + EditResource.editInstanceFormViaActions(); + EditResource.waitLoading(EDIT_RESOURCE_HEADINGS.EDIT_INSTANCE); + EditResource.viewMarc(); + ViewMarc.waitLoading(); + ViewMarc.checkMarcFieldContainsDataAtPosition('008', resourceData.marc008LangPosition, resourceData.languageCode); + ViewMarc.checkMarcFieldIndicators('041', ' '); + ViewMarc.checkMarcFieldContainsData('041', resourceData.marcLanguageCode); + + // Create new work and instance + ViewMarc.closeMarcView(); + EditResource.waitLoading(EDIT_RESOURCE_HEADINGS.EDIT_INSTANCE); + EditResource.clickCloseResourceButton(); + Marigold.waitLoading(); + Marigold.openNewResourceForm(); + WorkProfileModal.waitLoading(); + WorkProfileModal.selectDefaultOption(); + EditResource.waitLoading(EDIT_RESOURCE_HEADINGS.NEW_WORK); + EditResource.setValueForTheField(testData.uniqueMarigoldWorkTitle, fieldData.workTitle); + EditResource.setValueForSectionSimpleField(resourceData.languageSelect, fieldData.languageField); + // Primary source language is already the default language relationship selection + EditResource.saveAndKeepEditingWithId(({ resourceId }) => { + testData.workId = resourceId; + }); + EditResource.waitLoading(EDIT_RESOURCE_HEADINGS.EDIT_WORK); + EditResource.openNewInstanceFormViaNewInstanceButton(); + InstanceProfileModal.waitLoading(); + InstanceProfileModal.selectDefaultOption(); + EditResource.waitLoading(EDIT_RESOURCE_HEADINGS.NEW_INSTANCE); + EditResource.setValueForTheField(testData.uniqueMarigoldInstanceTitle, fieldData.instanceTitle); + EditResource.saveAndKeepEditingWithId(({ resourceId }) => { + testData.instanceId = resourceId; + }); + EditResource.clickCloseResourceButton(); + + Marigold.waitLoading(); + SearchAndFilter.searchResourceByTitle(resourceData.marigoldWorkTitle); + SearchAndFilter.verifySearchResultField(resourceData.languageCode); + SearchAndFilter.openSearchResultPreviewByTitle(resourceData.marigoldWorkTitle); + SearchAndFilter.waitPreviewLoading(); + EditResource.checkPreviewSectionContainsLink(fieldData.languageSection, fieldData.languageField, resourceData.language, resourceData.languageLink); + + // Review in inventory + TopMenuNavigation.navigateToApp(APPLICATION_NAMES.INVENTORY); + InventoryInstances.waitContentLoading(); + InventorySearchAndFilter.bySource(fieldData.ldSource); + InventoryInstances.searchByTitle(resourceData.marigoldInstanceTitle); + InventoryInstance.editInstance(); + InstanceRecordEdit.waitLoading(); + InstanceRecordEdit.verifyLanguage(resourceData.language); + }, + ); +}); diff --git a/cypress/e2e/linked-data/LD Edit/statement-of-responsibility-marc.cy.js b/cypress/e2e/linked-data/LD Edit/statement-of-responsibility-marc.cy.js index 74ad63b1c0..10e4ef1ef3 100644 --- a/cypress/e2e/linked-data/LD Edit/statement-of-responsibility-marc.cy.js +++ b/cypress/e2e/linked-data/LD Edit/statement-of-responsibility-marc.cy.js @@ -9,7 +9,7 @@ import TopMenu from '../../../support/fragments/topMenu'; import Users from '../../../support/fragments/users/users'; import EditResource from '../../../support/fragments/linked-data/editResource'; -import ExternalResourcePreview from '../../../support/fragments/linked-data/externalResourcePreview'; +import PreviewResource from '../../../support/fragments/linked-data/previewResource'; import InstanceProfileModal from '../../../support/fragments/linked-data/instanceProfileModal'; import Marigold from '../../../support/fragments/linked-data/marigold'; import NewInstance from '../../../support/fragments/linked-data/newInstance'; @@ -98,8 +98,8 @@ describe('Citation: Statement of Responsibility - Inventory / View MARC', () => // Import MARC bib into Marigold InventoryInstances.searchByTitle(testData.uniqueMarcTitle); InventoryInstance.editInstanceInMG(); - ExternalResourcePreview.waitLoading(); - ExternalResourcePreview.clickContinueButton(); + PreviewResource.waitLoading(); + PreviewResource.clickContinue(); EditResource.waitLoading(EDIT_RESOURCE_HEADINGS.EDIT_INSTANCE); EditResource.clickCloseResourceButton(); diff --git a/cypress/fixtures/marcFileForC499692.mrc b/cypress/fixtures/marcFileForC499692.mrc new file mode 100644 index 0000000000..95580a1347 --- /dev/null +++ b/cypress/fixtures/marcFileForC499692.mrc @@ -0,0 +1 @@ +00182naa a2200073uu 4500001001400000005001700014008004100031245003600072in0000000070520260508181845.2260508| ||| | eng  aPlaceholder Title Language Code \ No newline at end of file diff --git a/cypress/support/fragments/inventory/instanceRecordEdit.js b/cypress/support/fragments/inventory/instanceRecordEdit.js index 18d6fbd30b..bcdadc29ce 100644 --- a/cypress/support/fragments/inventory/instanceRecordEdit.js +++ b/cypress/support/fragments/inventory/instanceRecordEdit.js @@ -37,6 +37,8 @@ const staffSuppressCheckbox = Checkbox({ name: 'staffSuppress' }); const previoslyHeldCheckbox = Checkbox({ name: 'previouslyHeld' }); const setForDeletionChecbox = Checkbox({ name: 'deleted' }); const instanceStatusTerm = Select('Instance status term'); +const descriptiveDataAccordion = Accordion('Descriptive data'); +const languageSelect = Select('Language*'); const addStatisticalCodeButton = Button('Add statistical code'); const addNatureOfContentButton = Button('Add nature of content'); const addFormatsButton = Button('Add format'); @@ -645,6 +647,11 @@ export default { cy.expect(Select('Nature of content term').has({ checkedOptionText: including(nature) })); }, + verifyLanguage(language) { + cy.do(descriptiveDataAccordion.clickHeader()); + cy.expect(languageSelect.has({ checkedOptionText: including(language) })); + }, + verifyParentInstance(title, hrid) { cy.expect([ parentInstanceFieldSet diff --git a/cypress/support/fragments/linked-data/editResource.js b/cypress/support/fragments/linked-data/editResource.js index b26150d324..a63ca16ead 100644 --- a/cypress/support/fragments/linked-data/editResource.js +++ b/cypress/support/fragments/linked-data/editResource.js @@ -334,6 +334,15 @@ export default { ).should('be.visible'); }, + checkDropdownContainsOptions(field, optionLabels) { + cy.xpath( + `//div[text()="${field}"]/../following-sibling::div//select/option` + ).then(($options) => { + const labels = [...$options].map(opt => opt.text); + expect(labels).to.include.members(optionLabels); + }); + }, + checkSectionDropdownContainsOptions(section, field, optionLabels, repeatPosition = 1) { cy.xpath( `(//div[text()='${section}']/../../div/following-sibling::div/div[@class="label" and text()="${field}"])[${repeatPosition}]/following-sibling::div/select/option` @@ -353,7 +362,7 @@ export default { const labels = [...$options].map(opt => opt.textContent); expect(labels).to.include.members(optionLabels); }); - cy.do(Keyboard.escape()); + cy.get('body').type('{esc}'); cy.wait(500); }, @@ -486,6 +495,15 @@ export default { }, checkDropdownTextValue(textValue, field) { + cy.xpath(`//div[text()="${field}"]/../following-sibling::div//select[@data-testid="dropdown-field"]`) + .filter((_selectIdx, selectBlock) => { + const opt = selectBlock.options[selectBlock.selectedIndex]; + return opt && opt.text === textValue; + }) + .should('have.length.at.least', 1); + }, + + checkSectionDropdownTextValue(textValue, field) { cy.xpath(`//div[text()="${field}"]/following-sibling::div//select[@data-testid="dropdown-field"]`) .filter((_selectIdx, selectBlock) => { const opt = selectBlock.options[selectBlock.selectedIndex]; diff --git a/cypress/support/fragments/linked-data/searchAndFilter.js b/cypress/support/fragments/linked-data/searchAndFilter.js index ad98194f2a..75e6e58888 100644 --- a/cypress/support/fragments/linked-data/searchAndFilter.js +++ b/cypress/support/fragments/linked-data/searchAndFilter.js @@ -96,6 +96,15 @@ export default { }); }, + verifySearchResultField(fieldValue) { + cy.get('[class*="search-result-entry-container"]') + .first() + .find('[class*="work-details-card"]') + .find('[class*="details"]') + .contains(fieldValue) + .should('exist'); + }, + verifyNoResultsFound() { cy.get('[class*="search-result-entry-container"]').should('not.exist'); cy.get('[class*="item-search-content"]')