From 2f1f7b9f705fff5e9f81637ba0c124a81e7ef9e3 Mon Sep 17 00:00:00 2001
From: Ema Suarasan <beatrice.suarasan@endava.com>
Date: Fri, 9 Apr 2021 14:07:08 +0300
Subject: [PATCH] test: add page load assertions

---
 .../ncrc/form_builder_page_spec.js            |  4 +-
 .../integration/ncrc/manuscripts_page_spec.js | 44 +++++++-------
 cypress/page-object/forms-page.js             | 60 ++++++++++---------
 cypress/page-object/manuscripts-page.js       |  4 ++
 cypress/page-object/new-submission-page.js    | 46 ++++++++------
 cypress/page-object/page-component/menu.js    |  6 ++
 cypress/page-object/submission-form-page.js   | 10 ++++
 cypress/support/routes.js                     |  2 +
 8 files changed, 106 insertions(+), 70 deletions(-)

diff --git a/cypress/integration/ncrc/form_builder_page_spec.js b/cypress/integration/ncrc/form_builder_page_spec.js
index 9bba6426e1..9d5f7a00ff 100644
--- a/cypress/integration/ncrc/form_builder_page_spec.js
+++ b/cypress/integration/ncrc/form_builder_page_spec.js
@@ -14,6 +14,7 @@ describe('form builder tests', () => {
       cy.fixture('role_names').then(name => {
         cy.login(name.role.admin, formBuilder)
       })
+      FormsPage.verifyPageLoaded()
     })
     it('check form entries are correct', () => {
       // eslint-disable-next-line jest/valid-expect-in-promise
@@ -84,8 +85,9 @@ describe('form builder tests', () => {
       cy.fixture('role_names').then(name => {
         cy.login(name.role.admin, manuscripts)
       })
+      ManuscriptsPage.getTableHeader().should('be.visible')
       ManuscriptsPage.clickSubmit()
-      NewSubmissionPage.clickSubmitURL()
+      NewSubmissionPage.clickSubmitUrlAndVerifyLink()
     })
 
     it('check submission form contains the same fields', () => {
diff --git a/cypress/integration/ncrc/manuscripts_page_spec.js b/cypress/integration/ncrc/manuscripts_page_spec.js
index a581d239c5..a5eb54f9d8 100644
--- a/cypress/integration/ncrc/manuscripts_page_spec.js
+++ b/cypress/integration/ncrc/manuscripts_page_spec.js
@@ -14,6 +14,7 @@ describe('manuscripts page tests', () => {
     cy.fixture('role_names').then(name => {
       cy.login(name.role.admin, manuscripts)
     })
+    ManuscriptsPage.getTableHeader().should('be.visible')
   })
   context('elements visibility', () => {
     it('submit button should be visible & dashboard page should not exist', () => {
@@ -23,20 +24,20 @@ describe('manuscripts page tests', () => {
 
     it('evaluation button should be visible for unsubmitted articles', () => {
       ManuscriptsPage.clickSubmit()
-      NewSubmissionPage.clickSubmitURL()
+      NewSubmissionPage.clickSubmitUrlAndVerifyLink()
       // fill the submit form and submit it
       // eslint-disable-next-line jest/valid-expect-in-promise
       cy.fixture('submission_form_data').then(data => {
         SubmissionFormPage.fillInArticleDescription(data.articleId)
       })
-      Menu.clickManuscripts()
+      Menu.clickManuscriptsAndAssertPageLoad()
       ManuscriptsPage.getEvaluationButton()
         .scrollIntoView()
         .should('be.visible')
     })
     it('label & topics should be visible on manuscripts page', () => {
       ManuscriptsPage.clickSubmit()
-      NewSubmissionPage.clickSubmitURL()
+      NewSubmissionPage.clickSubmitUrlAndVerifyLink()
       // fill the submit form and submit it
       // eslint-disable-next-line jest/valid-expect-in-promise
       cy.fixture('submission_form_data').then(data => {
@@ -44,7 +45,7 @@ describe('manuscripts page tests', () => {
         SubmissionFormPage.selectDropdownOption(1)
         SubmissionFormPage.clickTopicsCheckboxWithText(data.topic)
         SubmissionFormPage.clickTopicsCheckboxWithText('epidemiology')
-        Menu.clickManuscripts()
+        Menu.clickManuscriptsAndAssertPageLoad()
         ManuscriptsPage.getArticleLabel()
           .should('be.visible')
           .and('contain', 'evaluated')
@@ -56,7 +57,7 @@ describe('manuscripts page tests', () => {
   context('unsubmitted article tests', () => {
     beforeEach(() => {
       ManuscriptsPage.clickSubmit()
-      NewSubmissionPage.clickSubmitURL()
+      NewSubmissionPage.clickSubmitUrlAndVerifyLink()
     })
 
     it('unsubmitted article is evaluated', () => {
@@ -64,7 +65,7 @@ describe('manuscripts page tests', () => {
       cy.fixture('submission_form_data').then(data => {
         SubmissionFormPage.fillInArticleDescription(data.title)
       })
-      Menu.clickManuscripts()
+      Menu.clickManuscriptsAndAssertPageLoad()
       ManuscriptsPage.clickEvaluation()
       cy.url().should('contain', 'evaluation')
       SubmissionFormPage.getArticleUrl().should('have.value', '')
@@ -92,7 +93,7 @@ describe('manuscripts page tests', () => {
         SubmissionFormPage.clickDropdown(-1)
         SubmissionFormPage.selectDropdownOption(0)
         SubmissionFormPage.clickTopicsCheckboxWithText(data.topic)
-        SubmissionFormPage.clickSubmitManuscript()
+        SubmissionFormPage.clickSubmitManuscriptAndWaitPageLoad()
         ManuscriptsPage.getStatus(0).should('eq', 'evaluated')
         ManuscriptsPage.getArticleTopic(0)
           .should('be.visible')
@@ -104,7 +105,7 @@ describe('manuscripts page tests', () => {
   context('submitted and evaluated article tests', () => {
     beforeEach(() => {
       ManuscriptsPage.clickSubmit()
-      NewSubmissionPage.clickSubmitURL()
+      NewSubmissionPage.clickSubmitUrlAndVerifyLink()
       // fill the submit form and submit it
       // eslint-disable-next-line jest/valid-expect-in-promise
       cy.fixture('submission_form_data').then(data => {
@@ -122,8 +123,8 @@ describe('manuscripts page tests', () => {
         SubmissionFormPage.selectDropdownOption(0)
         SubmissionFormPage.clickTopicsCheckboxWithText(data.topic)
         // eslint-disable-next-line
-        cy.wait(2000)
-        SubmissionFormPage.clickSubmitManuscript()
+        SubmissionFormPage.waitThreeSec()
+        SubmissionFormPage.clickSubmitManuscriptAndWaitPageLoad()
       })
     })
     it('manuscripts page should contain the correct details after submission', () => {
@@ -149,7 +150,7 @@ describe('manuscripts page tests', () => {
       ManuscriptsPage.getStatus(0).should('eq', 'Submitted')
       ManuscriptsPage.clickEvaluation(0)
 
-      SubmissionFormPage.clickSubmitManuscript()
+      SubmissionFormPage.clickSubmitManuscriptAndWaitPageLoad()
 
       ManuscriptsPage.getStatus(0).should('eq', 'evaluated')
     })
@@ -161,8 +162,8 @@ describe('manuscripts page tests', () => {
         SubmissionFormPage.fillInValueAdded('Evaluated')
         SubmissionFormPage.clickTopicsCheckboxWithText('vaccines')
         // eslint-disable-next-line
-        cy.wait(2500)
-        SubmissionFormPage.clickSubmitManuscript()
+        SubmissionFormPage.waitThreeSec()
+        SubmissionFormPage.clickSubmitManuscriptAndWaitPageLoad()
         ManuscriptsPage.clickEvaluation()
         // eslint-disable-next-line
         SubmissionFormPage.getValueAddedField().should(
@@ -176,7 +177,7 @@ describe('manuscripts page tests', () => {
   context('filter and sort articles', () => {
     beforeEach(() => {
       ManuscriptsPage.clickSubmit()
-      NewSubmissionPage.clickSubmitURL()
+      NewSubmissionPage.clickSubmitUrlAndVerifyLink()
       // eslint-disable-next-line jest/valid-expect-in-promise
       cy.fixture('form_option').then(data => {
         SubmissionFormPage.fillInArticleDescription('123')
@@ -185,9 +186,9 @@ describe('manuscripts page tests', () => {
         SubmissionFormPage.clickTopicsCheckboxWithText(
           data.ncrc.topicTypes.vaccines,
         )
-        Menu.clickManuscripts()
+        Menu.clickManuscriptsAndAssertPageLoad()
         ManuscriptsPage.clickSubmit()
-        NewSubmissionPage.clickSubmitURL()
+        NewSubmissionPage.clickSubmitUrlAndVerifyLink()
         SubmissionFormPage.fillInArticleDescription('abc')
         SubmissionFormPage.clickElementFromFormOptionList(9)
         SubmissionFormPage.selectDropdownOption(1)
@@ -197,9 +198,9 @@ describe('manuscripts page tests', () => {
         SubmissionFormPage.clickTopicsCheckboxWithText(
           data.ncrc.topicTypes.diagnostics,
         )
-        Menu.clickManuscripts()
+        Menu.clickManuscriptsAndAssertPageLoad()
         ManuscriptsPage.clickSubmit()
-        NewSubmissionPage.clickSubmitURL()
+        NewSubmissionPage.clickSubmitUrlAndVerifyLink()
         SubmissionFormPage.fillInArticleDescription('def')
         SubmissionFormPage.clickElementFromFormOptionList(9)
         SubmissionFormPage.selectDropdownOption(0)
@@ -209,9 +210,8 @@ describe('manuscripts page tests', () => {
         SubmissionFormPage.clickTopicsCheckboxWithText(
           data.ncrc.topicTypes.diagnostics,
         )
-        Menu.clickManuscripts()
+        Menu.clickManuscriptsAndAssertPageLoad()
         // eslint-disable-next-line
-        cy.wait(2000)
       })
     })
     it('filter article after topic and url contain that topic', () => {
@@ -219,7 +219,7 @@ describe('manuscripts page tests', () => {
       ManuscriptsPage.getTableRows().should('eq', 1)
       cy.url().should('contain', 'vaccines')
       ManuscriptsPage.getArticleTopic(0).should('contain', 'vaccines')
-      Menu.clickManuscripts()
+      Menu.clickManuscriptsAndAssertPageLoad()
       ManuscriptsPage.clickArticleTopic(1)
       ManuscriptsPage.getTableRows().should('eq', 2)
       cy.url().should('contain', 'diagnostics')
@@ -230,7 +230,7 @@ describe('manuscripts page tests', () => {
         'ecology and spillover',
       )
       ManuscriptsPage.getArticleTopic(3).should('contain', 'diagnostics')
-      Menu.clickManuscripts()
+      Menu.clickManuscriptsAndAssertPageLoad()
       ManuscriptsPage.clickArticleTopic(0)
       ManuscriptsPage.getTableRows().should('eq', 1)
       cy.url().should('contain', 'modeling')
diff --git a/cypress/page-object/forms-page.js b/cypress/page-object/forms-page.js
index 9bc8175e9a..9cdd4ea3e0 100644
--- a/cypress/page-object/forms-page.js
+++ b/cypress/page-object/forms-page.js
@@ -3,37 +3,41 @@
  * Page object representing the second option from the left side menu,
  * which contains a number of options & fields to fill in / dropdowns.
  */
-const FORM_TITLE_TAB = '[data-test-id="tab-container"] > div';
-const FORM_OPTION_LIST = '[class*=FormBuilder__Element] > button:nth-child(1)';
-const NAME_FIELD = 'name';
+const FORM_TITLE_TAB = '[data-test-id="tab-container"] > div'
+const FORM_OPTION_LIST = '[class*=FormBuilder__Element] > button:nth-child(1)'
+const NAME_FIELD = 'name'
 const COMPONENT_TYPE = '[role=listbox]'
 const FIELD_VALIDATE = '[class*=react-select__value-container]'
 
 export const FormsPage = {
-    getFormTitleTab(nth) {
-        return cy.get(FORM_TITLE_TAB).eq(nth);
-    },
-    getFormTitleText(nth) {
-        this.getFormTitleTab(nth).invoke('text');
-    },
-    getFormOptionList() {
-        return cy.get(FORM_OPTION_LIST);
-    },
-    clickFormOption(nth) {
-        this.getFormOptionList().eq(nth).click();
-    },
+  verifyPageLoaded() {
+    return cy.get(FORM_TITLE_TAB, { timeout: 10000 }).eq(0).should('be.visible')
+  },
+  getFormTitleTab(nth) {
+    return cy.get(FORM_TITLE_TAB).eq(nth)
+  },
+  getFormTitleText(nth) {
+    this.getFormTitleTab(nth).invoke('text')
+  },
+  getFormOptionList() {
+    return cy.get(FORM_OPTION_LIST)
+  },
+  clickFormOption(nth) {
+    this.getFormOptionList().eq(nth).click()
+  },
 
-
-    getFormBuilderElementName(nth) {
-        return cy.get(FORM_OPTION_LIST).eq(nth)
-    },
-    getNameField() {
-        return cy.getByName(NAME_FIELD);
-    },
-    getComponentType() {
-        return cy.get(COMPONENT_TYPE);
-    },
-    getFieldValidate() {
-        return cy.get(FIELD_VALIDATE)
-    }
+  getFormBuilderElementName(nth) {
+    return cy.get(FORM_OPTION_LIST).eq(nth)
+  },
+  getNameField() {
+    return cy.getByName(NAME_FIELD)
+  },
+  getComponentType() {
+    return cy.get(COMPONENT_TYPE)
+  },
+  getFieldValidate() {
+    return cy.get(FIELD_VALIDATE)
+  },
 }
+
+export default FormsPage
diff --git a/cypress/page-object/manuscripts-page.js b/cypress/page-object/manuscripts-page.js
index 5532db8432..01696914b4 100644
--- a/cypress/page-object/manuscripts-page.js
+++ b/cypress/page-object/manuscripts-page.js
@@ -12,6 +12,7 @@ const CONTROL_BUTTON = '[href*=control]'
 const CREATED_CARET = 'Carets__Caret'
 const AUTHOR_FIELD = 'UserCombo__Primary'
 const STATUS_FIELD = 'Badge__Status'
+const TABLE_HEADER = '[class*=Table__Header]'
 const MANUSCRIPTS_TABLE_HEAD = '[class*=Table__Header] > tr >th'
 const ARTICLE_TITLE = '[class*=Table__Row]>td:nth-child(1)'
 const ARTICLE_LABEL = 'style__StyledTableLabel'
@@ -86,5 +87,8 @@ export const ManuscriptsPage = {
   getLabelRow(nth) {
     return cy.get(LABEL).eq(nth)
   },
+  getTableHeader() {
+    return cy.get(TABLE_HEADER, { timeout: 10000 })
+  },
 }
 export default ManuscriptsPage
diff --git a/cypress/page-object/new-submission-page.js b/cypress/page-object/new-submission-page.js
index 754e8c96ce..14382a20df 100644
--- a/cypress/page-object/new-submission-page.js
+++ b/cypress/page-object/new-submission-page.js
@@ -1,26 +1,34 @@
 /// <reference types="Cypress" />
+import { submit } from '../support/routes'
+
 /**
  * Page object representing the available submission options:
  * submission through uploading a manuscript or through using an URL.
  */
-const UPLOAD_MANUSCRIPT_BUTTON = 'UploadManuscript__Info';
-const SUBMIT_URL_BUTTON = 'button';
-const SUBMISSION_MESSAGE = 'body';
+const UPLOAD_MANUSCRIPT_BUTTON = 'UploadManuscript__Info'
+const SUBMIT_URL_BUTTON = 'button'
+const SUBMISSION_MESSAGE = 'body'
 
 export const NewSubmissionPage = {
-    getUploadManuscriptButton() {
-        return cy.getByContainsClass(UPLOAD_MANUSCRIPT_BUTTON);
-    },
-    clickUploadManuscript() {
-        this.getUploadManuscriptButton().click();
-    },
-    getSubmitURLButton() {
-        return cy.get(SUBMIT_URL_BUTTON);
-    },
-    clickSubmitURL() {
-        this.getSubmitURLButton().click();
-    },
-    getSubmissionMessage() {
-        return cy.get(SUBMISSION_MESSAGE).invoke('text');
-    }
-}
\ No newline at end of file
+  getUploadManuscriptButton() {
+    return cy.getByContainsClass(UPLOAD_MANUSCRIPT_BUTTON)
+  },
+  clickUploadManuscript() {
+    this.getUploadManuscriptButton().click()
+  },
+  getSubmitURLButton() {
+    return cy.get(SUBMIT_URL_BUTTON)
+  },
+  clickSubmitURL() {
+    this.getSubmitURLButton().click()
+  },
+  clickSubmitUrlAndVerifyLink() {
+    this.clickSubmitURL()
+    cy.url({ timeout: 15000 }).should('contain', submit)
+  },
+  getSubmissionMessage() {
+    return cy.get(SUBMISSION_MESSAGE).invoke('text')
+  },
+}
+
+export default NewSubmissionPage
diff --git a/cypress/page-object/page-component/menu.js b/cypress/page-object/page-component/menu.js
index da43dc0137..b4ae870e4b 100644
--- a/cypress/page-object/page-component/menu.js
+++ b/cypress/page-object/page-component/menu.js
@@ -1,4 +1,6 @@
 /// <reference types="Cypress" />
+import { ManuscriptsPage } from '../manuscripts-page'
+
 /**
  * Page component which represents the left side menu bar,
  * which contains the Logged User, Dashboard & My profile options (for non-admin users),
@@ -34,6 +36,10 @@ export const Menu = {
   clickManuscripts() {
     this.getManuscriptsButton().click()
   },
+  clickManuscriptsAndAssertPageLoad() {
+    this.clickManuscripts()
+    ManuscriptsPage.getTableHeader().should('be.visible')
+  },
   getMyProfileButton() {
     return cy.getByContainsClass(MENU_BUTTON).contains('My profile')
   },
diff --git a/cypress/page-object/submission-form-page.js b/cypress/page-object/submission-form-page.js
index 29e97db337..005dd4d453 100644
--- a/cypress/page-object/submission-form-page.js
+++ b/cypress/page-object/submission-form-page.js
@@ -1,4 +1,6 @@
 /// <reference types="Cypress" />
+import { ManuscriptsPage } from './manuscripts-page'
+
 /**
  * Page object representing the form which has
  * to be completed to correctly submit a research paper.
@@ -217,6 +219,10 @@ export const SubmissionFormPage = {
   clickSubmitManuscript() {
     this.getSubmitManuscriptButton().click()
   },
+  clickSubmitManuscriptAndWaitPageLoad() {
+    this.clickSubmitManuscript()
+    ManuscriptsPage.getTableHeader().should('be.visible')
+  },
   getValidationErrorMessage(error) {
     return cy.getByContainsClass(VALIDATION_ERROR_MESSAGE).contains(error)
   },
@@ -336,5 +342,9 @@ export const SubmissionFormPage = {
   clickTopicsCheckboxWithText(value) {
     this.getTopicsCheckboxWithText(value).click()
   },
+  waitThreeSec() {
+    // eslint-disable-next-line cypress/no-unnecessary-waiting
+    cy.wait(3000)
+  },
 }
 export default SubmissionFormPage
diff --git a/cypress/support/routes.js b/cypress/support/routes.js
index 6cdab8f2e7..3080992947 100644
--- a/cypress/support/routes.js
+++ b/cypress/support/routes.js
@@ -4,3 +4,5 @@ export const manuscripts = '/kotahi/admin/manuscripts'
 export const formBuilder = '/kotahi/admin/form-builder'
 export const users = '/kotahi/admin/users'
 export const profile = '/kotahi/profile'
+export const submit = '/submit'
+export const evaluate = '/evaluate'
-- 
GitLab