From 6939217722fffd90b837fa95c57b254dec0c70dd Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 30 Dec 2021 14:13:50 +0100 Subject: [PATCH 1/2] fix: cypress login with new session feature Use the new session feature to create and reuse sessions: https://docs.cypress.io/api/commands/session The first time `login` with a given name is called the steps described in the login function are performed and cookies and localstorage are cached. The next time `login` is called with the same name cookies and localStorage are restored and used again. This allows us to keep fast test runs while still separating the tests more cleanly. The old logout command was broken because of the way we used `Cypress.Cookies.defaults({ preserve })` before: Cypress runs all the `cy.*` commands during initialization and builds a list of commands that are then executed during the tests. However `Cypress.Cookies.defaults` is evaluated when preparing the list not while performing the actual steps. Signed-off-by: Azul --- cypress.json | 3 ++- cypress/integration/files.spec.js | 5 +---- cypress/integration/share.spec.js | 5 ++--- cypress/integration/viewer.spec.js | 10 +++------- cypress/support/commands.js | 26 +++++++++----------------- 5 files changed, 17 insertions(+), 32 deletions(-) diff --git a/cypress.json b/cypress.json index f58dd39160b..93841dbc8e8 100644 --- a/cypress.json +++ b/cypress.json @@ -2,5 +2,6 @@ "baseUrl": "https://localhost:8081/index.php/", "projectId": "hx9gqy", "viewportWidth": 1280, - "viewportHeight": 720 + "viewportHeight": 720, + "experimentalSessionSupport": true } diff --git a/cypress/integration/files.spec.js b/cypress/integration/files.spec.js index 6f77be7db0e..3b5b8d47056 100644 --- a/cypress/integration/files.spec.js +++ b/cypress/integration/files.spec.js @@ -21,12 +21,9 @@ */ describe('Files default view', function() { - before(function() { + beforeEach(function() { cy.login('admin', 'admin') }) - after(function() { - cy.logout() - }) it('See the default files list', function() { cy.get('#fileList tr').should('contain', 'welcome.txt') diff --git a/cypress/integration/share.spec.js b/cypress/integration/share.spec.js index 7747f3822af..8960d010f55 100644 --- a/cypress/integration/share.spec.js +++ b/cypress/integration/share.spec.js @@ -51,9 +51,8 @@ describe('Open test.md in viewer', function() { cy.get('#fileList tr[data-file="test.md"]', {timeout: 10000}) .should('contain', 'test.md') }) - after(function () { - cy.visit('/apps/files') - cy.logout() + beforeEach(function () { + cy.login(randUser, 'password') }) it('Shares the file as a public read only link', function () { diff --git a/cypress/integration/viewer.spec.js b/cypress/integration/viewer.spec.js index dfa44710561..47bfad6829a 100644 --- a/cypress/integration/viewer.spec.js +++ b/cypress/integration/viewer.spec.js @@ -32,13 +32,10 @@ describe('Open test.md in viewer', function() { // Upload test files cy.uploadFile('test.md', 'text/markdown') - cy.visit('/apps/files') - - // wait a bit for things to be settled - cy.wait(1000) }) - after(function() { - cy.logout() + + beforeEach(function() { + cy.login(randUser, 'password') }) it('See test.md in the list', function() { @@ -47,7 +44,6 @@ describe('Open test.md in viewer', function() { }) it('Open the viewer on file click', function() { - cy.visit('/apps/files') cy.openFile('test.md') cy.get('#viewer').should('be.visible') cy.get('#viewer .modal-title').should('contain', 'test.md') diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 3283a8ab51f..dbe72c3d046 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -26,27 +26,19 @@ const url = Cypress.config('baseUrl').replace(/\/index.php\/?$/g, '') Cypress.env('baseUrl', url) Cypress.Commands.add('login', (user, password, route = '/apps/files') => { - cy.clearCookies() - Cypress.Cookies.defaults({ - preserve: /^(oc|nc)/ + cy.session(user, function () { + cy.visit(route) + cy.get('input[name=user]').type(user) + cy.get('input[name=password]').type(password) + cy.get('#submit-wrapper input[type=submit]').click() + cy.url().should('include', route) }) + // in case the session already existed but we are on a different route... cy.visit(route) - cy.get('input[name=user]').type(user) - cy.get('input[name=password]').type(password) - cy.get('#submit-wrapper input[type=submit]').click() - cy.url().should('include', route) }) -Cypress.Commands.add('logout', () => { - Cypress.Cookies.defaults({ - preserve: [] - }) - - cy.clearLocalStorage() - cy.clearCookies() - - Cypress.Cookies.defaults({ - preserve: /^(oc|nc)/ +Cypress.Commands.add('logout', (route = '/') => { + cy.session('_guest', function () { }) }) From ef037fbb7299c3248266b33e94d89dc652ecbd54 Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 30 Dec 2021 16:08:52 +0100 Subject: [PATCH 2/2] cypress: inspect the viewer in one test Open the test.md file once and then check all the things. Signed-off-by: Azul --- cypress/integration/viewer.spec.js | 43 +++++++++++++----------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/cypress/integration/viewer.spec.js b/cypress/integration/viewer.spec.js index 47bfad6829a..9dc820b9ebe 100644 --- a/cypress/integration/viewer.spec.js +++ b/cypress/integration/viewer.spec.js @@ -45,39 +45,32 @@ describe('Open test.md in viewer', function() { it('Open the viewer on file click', function() { cy.openFile('test.md') - cy.get('#viewer').should('be.visible') - cy.get('#viewer .modal-title').should('contain', 'test.md') - cy.get('#viewer .modal-header button.action-item__menutoggle').should('be.visible') - cy.get('#viewer .modal-header button.header-close').should('be.visible') - cy.wait(2000) - cy.get('#viewer', { timeout: 4000 }) - .should('be.visible') + cy.log('Inspect viewer') + const viewer = cy.get('#viewer') + viewer.should('be.visible') .and('have.class', 'modal-mask') .and('not.have.class', 'icon-loading') - }) + viewer.get('.modal-title').should('contain', 'test.md') + viewer.get('.modal-header button.action-item__menutoggle') + .should('be.visible') - it('Has opened the file', function() { - cy.get('#viewer #editor .ProseMirror').should('contain', 'Hello world') - cy.get('#viewer #editor .ProseMirror h2').should('contain', 'Hello world') - }) + cy.log('Inspect editor') + const editor = viewer.get('#editor .ProseMirror') + editor.should('contain', 'Hello world') + editor.get('h2').should('contain', 'Hello world') + + cy.log('Inspect menubar') + const menubar = editor.get('.menubar .menubar-icons') + menubar.get('.icon-undo').should('be.visible') + menubar.get('.icon-bold').should('be.visible') - it('Shows the menu bar icons', function() { - // FIXME those checks are failing since the parent container is currently at 0x0 size - // due to the way we make the text app be a full screen viewer - // cy.get('#viewer-content #editor .menubar .menubar-icons .icon-undo').should('be.visible') - // cy.get('#viewer-content #editor .menubar .menubar-icons .icon-redo').should('be.visible') - // cy.get('#viewer-content #editor .menubar .menubar-icons .icon-bold').should('be.visible') + cy.screenshot() }) it('Closes the editor', function() { - cy.get('.modal-header button.header-close').click() + cy.openFile('test.md') + cy.get('#viewer .modal-header button.header-close').click() cy.get('#viewer').should('not.exist') }) - - it('Take screenshot', function() { - // gif is impossible to match with existing screenshot - // just taking a screenshot to manually compare if needed - cy.screenshot() - }) })