diff --git a/test/e2e/fixtures/texts.json b/test/e2e/fixtures/texts.json index 6d7ba23ba9..07ba4015ec 100644 --- a/test/e2e/fixtures/texts.json +++ b/test/e2e/fixtures/texts.json @@ -40,5 +40,6 @@ "nestedOption3": "Opsjon 111", "change": "Endre", "view": "Se innhold", - "edit": "Rediger" + "edit": "Rediger", + "emptySummary": "Du har ikke lagt inn informasjon her" } diff --git a/test/e2e/integration/app-frontend/components.ts b/test/e2e/integration/app-frontend/components.ts index 1ef951db69..6eea9032f6 100644 --- a/test/e2e/integration/app-frontend/components.ts +++ b/test/e2e/integration/app-frontend/components.ts @@ -63,40 +63,28 @@ describe('UI Components', () => { it('is possible to navigate between pages using navigation bar', () => { cy.goto('changename'); - cy.get(appFrontend.navMenu) + cy.get(appFrontend.navMenuButtons).should('have.length', 2); + cy.navPage('form') + .should('have.attr', 'aria-current', 'page') + .and('have.css', 'background-color', 'rgb(2, 47, 81)'); + cy.navPage('summary').should('have.css', 'background-color', 'rgba(0, 0, 0, 0)'); + cy.navPage('summary').click(); + cy.navPage('form').should('not.have.attr', 'aria-current', 'page'); + cy.navPage('summary') + .should('have.attr', 'aria-current', 'page') + .and('have.css', 'background-color', 'rgb(2, 47, 81)'); + cy.get(appFrontend.changeOfName.summaryNameChanges).should('be.visible'); - .find('li > button') - - .and('have.length', 2) - .then((navButtons) => { - cy.wrap(navButtons) - .first() - .should('have.attr', 'aria-current', 'page') - .and('have.css', 'background-color', 'rgb(2, 47, 81)'); - cy.wrap(navButtons).last().should('have.css', 'background-color', 'rgba(0, 0, 0, 0)').click(); - }); - cy.get(`${appFrontend.navMenu} li:first-child > button`).should('not.have.attr', 'aria-current', 'page'); - cy.get(appFrontend.navMenu) - .find('li > button') - .then((navButtons) => { - cy.wrap(navButtons).should('be.visible'); - cy.wrap(navButtons) - .last() - .should('have.attr', 'aria-current', 'page') - .and('have.css', 'background-color', 'rgb(2, 47, 81)'); - cy.get(appFrontend.changeOfName.summaryNameChanges).should('be.visible'); - }); cy.viewport('samsung-s10'); cy.get(appFrontend.navMenu).should('not.exist'); cy.get('[data-testid="NavigationBar"]').find('button:contains("form")').should('not.exist'); cy.get('[data-testid="NavigationBar"]').find('button:contains("summary")').should('be.visible'); cy.viewport('macbook-16'); - cy.interceptLayout('changename', (component) => { + cy.changeLayout((component) => { if (component.type === 'NavigationBar') { component.compact = true; } }); - cy.reload(); cy.get(appFrontend.navMenu).should('not.exist'); cy.get('[data-testid="NavigationBar"]').find('button:contains("form")').should('not.exist'); cy.get('[data-testid="NavigationBar"]').find('button:contains("summary")').should('be.visible'); diff --git a/test/e2e/integration/app-frontend/dynamics.ts b/test/e2e/integration/app-frontend/dynamics.ts index 9319f87bf4..90761a86e4 100644 --- a/test/e2e/integration/app-frontend/dynamics.ts +++ b/test/e2e/integration/app-frontend/dynamics.ts @@ -68,25 +68,25 @@ describe('Dynamics', () => { cy.goto('changename'); // Make sure the summary page can be hidden - cy.get(appFrontend.navMenu).find('li > button').should('have.length', 2); + cy.get(appFrontend.navMenuButtons).should('have.length', 2); cy.get(appFrontend.changeOfName.newFirstName).type('hideSummary'); - cy.get(appFrontend.navMenu).find('li > button').should('have.length', 1); + cy.get(appFrontend.navMenuButtons).should('have.length', 1); cy.get(appFrontend.changeOfName.newFirstName).clear(); cy.get(appFrontend.changeOfName.newLastName).should('be.visible'); - cy.get(appFrontend.navMenu).find('li > button').should('have.length', 2); + cy.get(appFrontend.navMenuButtons).should('have.length', 2); // Typing 1234 into the field should hide the last name component - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('summary').click(); cy.get('#testInputOnSummary').clear(); cy.get('#testInputOnSummary').type('1234'); - cy.get(appFrontend.navMenu).find('li > button').first().click(); + cy.navPage('form').click(); cy.get(appFrontend.changeOfName.newLastName).should('not.exist'); // But hiding the summary page should hide the input there, making the last name component show up again (since // the value found in the component lookup is null now) cy.get(appFrontend.changeOfName.newFirstName).type('hideSummary'); cy.get(appFrontend.changeOfName.newLastName).should('be.visible'); - cy.get(appFrontend.navMenu).find('li > button').should('have.length', 1); + cy.get(appFrontend.navMenuButtons).should('have.length', 1); }); }); diff --git a/test/e2e/integration/app-frontend/mobile.ts b/test/e2e/integration/app-frontend/mobile.ts index 16faa65233..99566b613f 100644 --- a/test/e2e/integration/app-frontend/mobile.ts +++ b/test/e2e/integration/app-frontend/mobile.ts @@ -25,10 +25,7 @@ describe('Mobile', () => { cy.get(appFrontend.nextButton).click(); cy.get(appFrontend.group.sendersName).type('automation'); cy.get(appFrontend.navMenu).should('not.exist'); - cy.get(appFrontend.group.navigationBarButton) - - .and('have.attr', 'aria-expanded', 'false') - .click(); + cy.get(appFrontend.group.navigationBarButton).should('have.attr', 'aria-expanded', 'false').click(); cy.get(appFrontend.group.navigationBarButton).should('have.attr', 'aria-expanded', 'true'); cy.get(appFrontend.navMenu).should('be.visible'); cy.get(appFrontend.navMenu).find('li > button').last().click(); diff --git a/test/e2e/integration/app-frontend/summary.ts b/test/e2e/integration/app-frontend/summary.ts index 392b875e10..a3a847ddad 100644 --- a/test/e2e/integration/app-frontend/summary.ts +++ b/test/e2e/integration/app-frontend/summary.ts @@ -16,35 +16,36 @@ describe('Summary', () => { } }); cy.goto('changename'); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('summary').click(); // Verify empty summary components cy.get('[data-testid=summary-summary-2] > div > [data-testid=summary-item-simple]').should( 'contain.text', - 'Du har ikke lagt inn informasjon her', + texts.emptySummary, ); cy.get('[data-testid=summary-summary-4] > div > [data-testid=summary-item-simple]').should( 'contain.text', - 'Du har ikke lagt inn informasjon her', + texts.emptySummary, ); cy.get('[data-testid=summary-summary-5] > div > [data-testid=attachment-summary-component]').should( 'contain.text', - 'Du har ikke lagt inn informasjon her', + texts.emptySummary, ); cy.get('[data-testid=summary-summary-6] > div > [data-testid=attachment-with-tag-summary]').should( 'contain.text', - 'Du har ikke lagt inn informasjon her', + texts.emptySummary, ); cy.get('[data-testid=summary-summary-reference] [data-testid=summary-item-compact]') .and('have.length', 3) .then((items) => { cy.wrap(items).eq(0).should('contain.text', 'hvor fikk du vite om skjemaet? : Altinn'); - cy.wrap(items).eq(1).should('contain.text', 'Referanse : Du har ikke lagt inn informasjon her'); - cy.wrap(items).eq(2).should('contain.text', 'Referanse 2 : Du har ikke lagt inn informasjon her'); + cy.wrap(items).eq(1).should('contain.text', `Referanse : ${texts.emptySummary}`); + cy.wrap(items).eq(2).should('contain.text', `Referanse 2 : ${texts.emptySummary}`); }); - cy.get(appFrontend.navMenu).find('li > button').first().click(); + cy.navPage('form').click(); cy.gotoAndComplete('changename'); + cy.navPage('summary').click(); cy.get(appFrontend.backButton).should('be.visible'); // Summary displays change button for editable fields and does not for readonly fields @@ -114,17 +115,17 @@ describe('Summary', () => { // Hide the component the Summary refers to, which should hide the summary component as well cy.get('[data-testid=summary-summary-1]').contains('span', 'Du har valgt å endre:').should('be.visible'); - cy.get(appFrontend.navMenu).find('li > button').first().click(); + cy.navPage('form').click(); cy.get(appFrontend.changeOfName.newFirstName).clear(); cy.get(appFrontend.changeOfName.newFirstName).type('hidePrevName'); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('summary').click(); cy.get('[data-testid=summary-summary-1]').should('not.exist'); // Test summary of non-repeating group - cy.get(appFrontend.navMenu).find('li > button').first().click(); + cy.navPage('form').click(); cy.get('#reference').select('Ola Nordmann'); cy.get('#reference2').select('Ole'); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('summary').click(); cy.get('[data-testid=summary-summary-reference] [data-testid=summary-item-compact]') .and('have.length', 3) .then((items) => { @@ -133,11 +134,11 @@ describe('Summary', () => { cy.wrap(items).eq(2).should('contain.text', 'Referanse 2 : Ole'); }); - cy.get(appFrontend.navMenu).find('li > button').first().click(); + cy.navPage('form').click(); cy.get('#sources').select('Digitaliseringsdirektoratet'); cy.get('#reference').select('Sophie Salt'); cy.get('#reference2').select('Dole'); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('summary').click(); cy.get('[data-testid=summary-summary-reference] [data-testid=summary-item-compact]') .and('have.length', 3) .then((items) => { @@ -146,11 +147,11 @@ describe('Summary', () => { cy.wrap(items).eq(2).should('contain.text', 'Referanse 2 : Dole'); }); - cy.get(appFrontend.navMenu).find('li > button').first().click(); + cy.navPage('form').click(); cy.get('#sources').select('Annet'); cy.get('#reference').select('Test'); cy.get('#reference2').select('Doffen'); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('summary').click(); cy.get('[data-testid=summary-summary-reference] [data-testid=summary-item-compact]') .and('have.length', 3) .then((items) => { @@ -164,13 +165,11 @@ describe('Summary', () => { cy.goto('group'); // Verify empty group summary - cy.get(appFrontend.navMenu).find('li > button').eq(1).click(); + cy.navPage('repeating').click(); cy.get(appFrontend.group.showGroupToContinue).find('input').dsCheck(); - cy.get(appFrontend.navMenu).find('li > button').last().click(); - cy.get('[data-testid=summary-group-component] > div') - .last() - .should('contain.text', 'Du har ikke lagt inn informasjon her'); - cy.get(appFrontend.navMenu).find('li > button').first().click(); + cy.navPage('summary').click(); + cy.get('[data-testid=summary-group-component] > div').last().should('contain.text', texts.emptySummary); + cy.navPage('prefill').click(); cy.gotoAndComplete('group'); @@ -226,11 +225,11 @@ describe('Summary', () => { cy.wrap(item).eq(5).should('contain.text', `${texts.nestedOption2}, ${texts.nestedOption3}`); }); - cy.get(appFrontend.navMenu).find('li > button').first().click(); + cy.navPage('prefill').click(); cy.get(appFrontend.group.prefill.liten).dsCheck(); cy.get(appFrontend.group.prefill.middels).dsCheck(); cy.get(appFrontend.group.prefill.svaer).dsCheck(); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('summary').click(); function assertSummaryItem(groupRow: number, items: { [key: string]: boolean }) { cy.get(appFrontend.group.mainGroupSummary) @@ -274,51 +273,51 @@ describe('Summary', () => { assertSummaryItem(3, prefillRowAbove100); // Verify empty values in group summary - cy.get(appFrontend.navMenu).find('li > button').eq(1).click(); + cy.navPage('repeating').click(); cy.get(appFrontend.group.addNewItem).click(); cy.get(appFrontend.group.editContainer).find(appFrontend.group.next).click(); cy.get(appFrontend.group.saveSubGroup).click(); cy.get(appFrontend.group.saveMainGroup).click(); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('summary').click(); cy.get('#summary-mainGroup-4 > [data-testid=summary-currentValue-4] > div') .children() .last() - .should('contain.text', 'Du har ikke lagt inn informasjon her'); + .should('contain.text', texts.emptySummary); cy.get('#summary-mainGroup-4 > [data-testid=summary-newValue-4] > div') .children() .last() - .should('contain.text', 'Du har ikke lagt inn informasjon her'); + .should('contain.text', texts.emptySummary); cy.get('#summary-mainGroup-4 > [data-testid=summary-mainUploaderSingle-4] > div') .children() .last() - .should('contain.text', 'Du har ikke lagt inn informasjon her'); + .should('contain.text', texts.emptySummary); cy.get('#summary-mainGroup-4 > [data-testid=summary-mainUploaderMulti-4] > div') .children() .last() - .should('contain.text', 'Du har ikke lagt inn informasjon her'); + .should('contain.text', texts.emptySummary); cy.get('#summary-mainGroup-4 > [data-testid=summary-subGroup-4] > div > [data-testid=summary-group-component]') .children() .last() .first() - .should('contain.text', 'Kommentarer : Du har ikke lagt inn informasjon her') - .and('contain.text', 'Nested uploader with tags : Du har ikke lagt inn informasjon her') - .and('contain.text', 'Vis tillegg : Du har ikke lagt inn informasjon her') - .and('contain.text', 'Referanse : Du har ikke lagt inn informasjon her') - .and('contain.text', 'Skjul kommentar felt : Du har ikke lagt inn informasjon her'); + .should('contain.text', `Kommentarer : ${texts.emptySummary}`) + .and('contain.text', `Nested uploader with tags : ${texts.emptySummary}`) + .and('contain.text', `Vis tillegg : ${texts.emptySummary}`) + .and('contain.text', `Referanse : ${texts.emptySummary}`) + .and('contain.text', `Skjul kommentar felt : ${texts.emptySummary}`); cy.get('#summary-mainGroup-4 > [data-testid=summary-source-4] > div') .children() .last() - .should('contain.text', 'Du har ikke lagt inn informasjon her'); + .should('contain.text', texts.emptySummary); cy.get('#summary-mainGroup-4 > [data-testid=summary-reference-4] > div') .children() .last() - .should('contain.text', 'Du har ikke lagt inn informasjon her'); + .should('contain.text', texts.emptySummary); // Hiding the group should hide the group summary as well cy.get('[data-testid=summary-summary-1]').should('be.visible'); - cy.get(appFrontend.navMenu).find('li > button').eq(1).click(); + cy.navPage('repeating').click(); cy.get(appFrontend.group.showGroupToContinue).find('input[type=checkbox]').dsUncheck(); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('summary').click(); cy.get('[data-testid=summary-summary-1]').should('not.exist'); }); @@ -331,7 +330,7 @@ describe('Summary', () => { cy.goto('group'); cy.get(appFrontend.group.prefill['liten']).dsCheck(); - cy.get(appFrontend.navMenu).find('li > button').eq(1).click(); + cy.navPage('repeating').click(); cy.get(appFrontend.group.showGroupToContinue).find('input').dsCheck(); // Add data cy.get(appFrontend.group.row(0).editBtn).click(); @@ -348,7 +347,7 @@ describe('Summary', () => { cy.get(appFrontend.group.comments).type('third comment'); cy.get(appFrontend.group.saveSubGroup).clickAndGone(); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('summary').click(); //Skjul kommentar felt cy.get('#summary-mainGroup-0 > [data-testid=summary-subGroup-0] > div > [data-testid=summary-group-component]') .children() @@ -356,9 +355,9 @@ describe('Summary', () => { .children() .eq(0) .should('contain.text', 'Kommentarer : first comment') - .and('contain.text', 'Nested uploader with tags : Du har ikke lagt inn informasjon her') - .and('contain.text', 'Vis tillegg : Du har ikke lagt inn informasjon her') - .and('contain.text', 'Referanse : Du har ikke lagt inn informasjon her') + .and('contain.text', `Nested uploader with tags : ${texts.emptySummary}`) + .and('contain.text', `Vis tillegg : ${texts.emptySummary}`) + .and('contain.text', `Referanse : ${texts.emptySummary}`) .and('not.contain.text', 'Skjul kommentar felt'); cy.get('#summary-mainGroup-0 > [data-testid=summary-subGroup-0] > div > [data-testid=summary-group-component]') .children() @@ -366,9 +365,9 @@ describe('Summary', () => { .children() .eq(1) .should('not.contain.text', 'Kommentarer') - .and('contain.text', 'Nested uploader with tags : Du har ikke lagt inn informasjon her') - .and('contain.text', 'Vis tillegg : Du har ikke lagt inn informasjon her') - .and('contain.text', 'Referanse : Du har ikke lagt inn informasjon her') + .and('contain.text', `Nested uploader with tags : ${texts.emptySummary}`) + .and('contain.text', `Vis tillegg : ${texts.emptySummary}`) + .and('contain.text', `Referanse : ${texts.emptySummary}`) .and('not.contain.text', 'Skjul kommentar felt'); cy.get('#summary-mainGroup-0 > [data-testid=summary-subGroup-0] > div > [data-testid=summary-group-component]') .children() @@ -376,9 +375,9 @@ describe('Summary', () => { .children() .eq(2) .should('contain.text', 'Kommentarer : third comment') - .and('contain.text', 'Nested uploader with tags : Du har ikke lagt inn informasjon her') - .and('contain.text', 'Vis tillegg : Du har ikke lagt inn informasjon her') - .and('contain.text', 'Referanse : Du har ikke lagt inn informasjon her') + .and('contain.text', `Nested uploader with tags : ${texts.emptySummary}`) + .and('contain.text', `Vis tillegg : ${texts.emptySummary}`) + .and('contain.text', `Referanse : ${texts.emptySummary}`) .and('not.contain.text', 'Skjul kommentar felt'); }); @@ -392,7 +391,7 @@ describe('Summary', () => { const newFirstNameSummary = '[data-testid=summary-summary-2] > div > [data-testid=summary-item-simple]'; const exampleSummary = '[data-testid=summary-summary-reference]'; - cy.get(appFrontend.navMenu).find('li > button').first().click(); + cy.navPage('form').click(); cy.get(appFrontend.changeOfName.newFirstName).clear(); cy.get(appFrontend.changeOfName.newFirstName).type(`Hello world`); cy.get(appFrontend.changeOfName.newLastName).clear(); @@ -400,9 +399,9 @@ describe('Summary', () => { cy.get(appFrontend.nextButton).click(); if (trigger === undefined) { - cy.get(appFrontend.navMenu).find('li > button').eq(1).should('have.attr', 'aria-current', 'page'); + cy.navPage('summary').should('have.attr', 'aria-current', 'page'); } else { - cy.get(appFrontend.navMenu).find('li > button').eq(0).should('have.attr', 'aria-current', 'page'); + cy.navPage('form').should('have.attr', 'aria-current', 'page'); cy.get(appFrontend.errorReport).should('contain.text', texts.requiredFieldLastName); cy.get(appFrontend.changeOfName.newLastName).type('a'); cy.get(appFrontend.nextButton).click(); @@ -410,9 +409,9 @@ describe('Summary', () => { if (trigger === Triggers.ValidateAllPages) { cy.get(appFrontend.errorReport).should('contain.text', 'Du må fylle ut page3required'); - cy.get(appFrontend.navMenu).find('li > button').eq(1).click(); + cy.navPage('summary').click(); } else if (trigger !== undefined) { - cy.get(appFrontend.navMenu).find('li > button').eq(1).should('have.attr', 'aria-current', 'page'); + cy.navPage('summary').should('have.attr', 'aria-current', 'page'); } cy.get(newFirstNameSummary).should('contain.text', `Hello world`); @@ -429,23 +428,23 @@ describe('Summary', () => { // that the back to summary button goes away when navigating via the navMenu instead. cy.get(exampleSummary).find('button').click(); cy.get(appFrontend.backToSummaryButton).should('exist'); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('lastPage').click(); assertErrorReport(); cy.get(appFrontend.backToSummaryButton).should('not.exist'); - cy.get(appFrontend.navMenu).find('li > button').eq(1).click(); + cy.navPage('summary').click(); assertErrorReport(); cy.get(exampleSummary).find('button').click(); assertErrorReport(); cy.get(appFrontend.backToSummaryButton).click(); cy.get(appFrontend.backToSummaryButton).should('not.exist'); assertErrorReport(); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('lastPage').click(); cy.get(appFrontend.backToSummaryButton).should('not.exist'); - cy.get(appFrontend.navMenu).find('li > button').eq(1).click(); + cy.navPage('summary').click(); assertErrorReport(); cy.get(appFrontend.backButton).click(); assertErrorReport(); - cy.get(appFrontend.navMenu).find('li > button').eq(1).click(); + cy.navPage('summary').click(); assertErrorReport(); // Sending in always validates all pages @@ -457,22 +456,22 @@ describe('Summary', () => { it('Navigation to fields on other pages outside the summary should not show the back-to-summary button', () => { cy.gotoAndComplete('changename'); injectExtraPageAndSetTriggers(); - cy.get(appFrontend.navMenu).find('li > button').first().click(); + cy.navPage('form').click(); cy.get(appFrontend.changeOfName.newLastName).clear(); - cy.get(appFrontend.navMenu).find('li > button').last().click(); + cy.navPage('lastPage').click(); cy.get('#page3-submit').click(); cy.get(appFrontend.errorReport).should('contain.text', 'Du må fylle ut page3required'); cy.get(appFrontend.errorReport).should('contain.text', texts.requiredFieldLastName); // Clicking the error should lead us to the first page cy.get(appFrontend.errorReport).find(`li:contains("${texts.requiredFieldLastName}")`).find('button').click(); - cy.get(appFrontend.navMenu).find('li > button').first().should('have.attr', 'aria-current', 'page'); + cy.navPage('form').should('have.attr', 'aria-current', 'page'); // The 'back to summary' button should not be here, and when we click 'next' we should land on the next // page (not the page we came from) cy.get(appFrontend.backToSummaryButton).should('not.exist'); cy.get(appFrontend.nextButton).click(); - cy.get(appFrontend.navMenu).find('li > button').eq(1).should('have.attr', 'aria-current', 'page'); + cy.navPage('summary').should('have.attr', 'aria-current', 'page'); }); }); diff --git a/test/e2e/integration/app-frontend/wcag.ts b/test/e2e/integration/app-frontend/wcag.ts index 9e678083ba..2a6f747845 100644 --- a/test/e2e/integration/app-frontend/wcag.ts +++ b/test/e2e/integration/app-frontend/wcag.ts @@ -12,19 +12,15 @@ describe('WCAG', () => { it('WCAG test in group', () => { cy.gotoAndComplete('group'); + cy.navPage('prefill').click(); cy.testWcag(); - cy.get(appFrontend.navMenu).find('li > button').first().click(); - cy.testWcag(); - - cy.get(appFrontend.navMenu).find('li > button').eq(1).click(); + cy.navPage('repeating').click(); cy.testWcag(); cy.get(appFrontend.group.edit).click(); cy.testWcag(); - cy.get(appFrontend.group.mainGroup) - .find(appFrontend.group.editContainer) - .find(appFrontend.group.next) - - .click(); + cy.get(appFrontend.group.mainGroup).find(appFrontend.group.editContainer).find(appFrontend.group.next).click(); + cy.testWcag(); + cy.navPage('hide').click(); cy.testWcag(); }); }); diff --git a/test/e2e/support/app-frontend.ts b/test/e2e/support/app-frontend.ts index 8eeed9186c..5df4038140 100644 --- a/test/e2e/support/app-frontend.ts +++ b/test/e2e/support/app-frontend.ts @@ -1,5 +1,8 @@ import { AppFrontend } from 'test/e2e/pageobjects/app-frontend'; +import type { ILayouts } from 'src/layout/layout'; +import type { IAltinnWindow } from 'src/types'; + const appFrontend = new AppFrontend(); Cypress.Commands.add('reloadAndWait', () => { @@ -65,8 +68,10 @@ Cypress.Commands.add('interceptLayout', (taskName, mutator, wholeLayoutMutator) cy.intercept({ method: 'GET', url: `**/api/layouts/${taskName}`, times: 1 }, (req) => { req.reply((res) => { const set = JSON.parse(res.body); - for (const layout of Object.values(set)) { - (layout as any).data.layout.map(mutator); + if (mutator) { + for (const layout of Object.values(set)) { + (layout as any).data.layout.map(mutator); + } } if (wholeLayoutMutator) { wholeLayoutMutator(set); @@ -75,3 +80,25 @@ Cypress.Commands.add('interceptLayout', (taskName, mutator, wholeLayoutMutator) }); }).as(`interceptLayout(${taskName})`); }); + +Cypress.Commands.add('changeLayout', (mutator, wholeLayoutMutator) => { + cy.window().then((win) => { + const aWin = win as unknown as IAltinnWindow; + const state = aWin.reduxStore.getState(); + const layouts: ILayouts = structuredClone(state.formLayout.layouts || {}); + if (mutator && layouts) { + for (const layout of Object.values(layouts)) { + for (const component of layout || []) { + mutator(component); + } + } + } + if (wholeLayoutMutator) { + wholeLayoutMutator(layouts); + } + aWin.reduxStore.dispatch({ + type: 'formLayout/updateLayouts', + payload: layouts, + }); + }); +}); diff --git a/test/e2e/support/custom.ts b/test/e2e/support/custom.ts index 7b9422ce34..7d05a5b5ff 100644 --- a/test/e2e/support/custom.ts +++ b/test/e2e/support/custom.ts @@ -1,5 +1,8 @@ +import { AppFrontend } from 'test/e2e/pageobjects/app-frontend'; import JQueryWithSelector = Cypress.JQueryWithSelector; +const appFrontend = new AppFrontend(); + Cypress.Commands.add('isVisible', { prevSubject: true }, (subject) => { const isVisible = (elem) => !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); expect(isVisible(subject[0])).to.be.true; @@ -21,3 +24,16 @@ Cypress.Commands.add('clickAndGone', { prevSubject: true }, (subject: JQueryWith // eslint-disable-next-line cypress/unsafe-to-chain-command cy.wrap(subject).click().should('not.exist'); }); + +Cypress.Commands.add('navPage', (page: string) => { + cy.window().then((win) => { + const regex = new RegExp(`^[0-9]+. ${page}$`); + + if (win.innerWidth > 768) { + cy.get(appFrontend.navMenu).findByText(regex); + } else { + cy.get('nav[data-testid=NavigationBar] button').should('have.attr', 'aria-expanded', 'false').click(); + cy.get(appFrontend.navMenu).findByText(regex); + } + }); +}); diff --git a/test/e2e/support/global.d.ts b/test/e2e/support/global.d.ts index 5ff489dacb..54683c1bce 100644 --- a/test/e2e/support/global.d.ts +++ b/test/e2e/support/global.d.ts @@ -3,7 +3,7 @@ import type { PayloadAction } from '@reduxjs/toolkit'; import type { user } from 'test/e2e/support/auth'; import type { ExprUnresolved } from 'src/features/expressions/types'; -import type { ILayoutComponentOrGroup } from 'src/layout/layout'; +import type { ILayoutComponentOrGroup, ILayouts } from 'src/layout/layout'; import type { IRuntimeState } from 'src/types'; export type FrontendTestTask = 'message' | 'changename' | 'group' | 'likert' | 'datalist' | 'confirm'; @@ -31,6 +31,11 @@ declare global { */ gotoAndComplete(target: FrontendTestTask, mode: GotoMode = 'fast'): Chainable; + /** + * Finds a navigation menu element with the specified text/page name + */ + navPage(page: string): Chainable; + /** * Send in the form just completed by gotoAndComplete(), and wait for the next task to render */ @@ -115,10 +120,20 @@ declare global { */ interceptLayout( taskName: FrontendTestTask | string, - mutator: (component: ExprUnresolved) => void, + mutator?: (component: ExprUnresolved) => void, wholeLayoutMutator?: (layoutSet: any) => void, ): Chainable; + /** + * The same as the above, but instead of intercepting the layout, it will fetch the current layout from redux + * and apply the mutator to it. This is useful if you want to make changes to the layout after it has been + * fetched. This performs the same actions as changing properties in the layout via the developer tools. + */ + changeLayout( + mutator?: (component: ExprUnresolved) => void, + allLayoutsMutator?: (layouts: ILayouts) => void, + ): Chainable; + switchUser(user: user): any; assertUser(user: user): any;