Browse Source

[test] cypress: updates to support graphql test

Signed-off-by: Raju Udava <sivadstala@gmail.com>
pull/688/head
Raju Udava 3 years ago
parent
commit
f37a83a16a
  1. 8
      cypress.json
  2. 4
      cypress/integration/common/00_pre_configurations.js
  3. 2
      cypress/integration/common/0a_project_operations.js
  4. 4
      cypress/integration/common/6a_audit.js
  5. 261
      cypress/integration/common/6c_swagger_api.js
  6. 3
      cypress/integration/common/6d_language_validation.js
  7. 5
      cypress/integration/test/masterSuite.js

8
cypress.json

@ -12,5 +12,11 @@
"screenshotOnRunFailure": false,
"numTestsKeptInMemory": 0,
"env": {
"testMode": "extREST" }
"testMode": "extREST" },
"supportedOptionsForTestModes": [
"extGQL",
"extREST",
"xcdbREST",
"xcdbREST",
"can configure multiple too, seperated by a . as in extREST.extGQL"]
}

4
cypress/integration/common/00_pre_configurations.js

@ -6,8 +6,8 @@ import { loginPage, projectsPage } from "../../support/page_objects/navigation"
import { mainPage } from "../../support/page_objects/mainPage"
import { staticProjects, roles, isTestSuiteActive, getPrimarySuite, isSecondarySuite } from "../../support/page_objects/projectConstants"
export const genTest = () => {
export const genTest = (type, xcdb) => {
if(!isTestSuiteActive(type, xcdb)) return;
describe(`Project pre-configurations`, () => {
it('Admin SignUp', () => {

2
cypress/integration/common/0a_project_operations.js

@ -30,7 +30,7 @@ export const genTest = (type, xcdb) => {
cy.get('.database-field input').click().clear().type('dummy_db')
cy.contains('Test Database Connection').click()
cy.contains('Ok & Save Project', {timeout: 3000}).click()
cy.url({timeout: 12000}).should('contain', '#/nc/')
cy.url({timeout: 50000}).should('contain', '#/nc/')
});
it('Stop Project', () => {

4
cypress/integration/common/6a_audit.js

@ -17,8 +17,8 @@ export const genTest = (type, xcdb) => {
}
it('Open Audit tab', ()=> {
cy.createTable('Table-x')
cy.deleteTable('Table-x')
cy.createTable('tablex')
cy.deleteTable('tablex')
cy.wait(2000)
mainPage.navigationDraw(mainPage.AUDIT).click()

261
cypress/integration/common/6c_swagger_api.js

@ -9,7 +9,7 @@ export const genTest = (type, xcdb) => {
describe(`Swagger API - Test preparation`, () => {
before(()=> {
loginPage.loginAndOpenProject('rest', false)
loginPage.loginAndOpenProject(type, false)
})
it("[REST] open project & record swagger URL, AuthToken", () => {
@ -17,156 +17,165 @@ export const genTest = (type, xcdb) => {
cy.url().then( (url) => {
// retrieve project name from URL & use it to construct Swagger URL
// URL on homepage: http://localhost:3000/#/nc/externalrest_weUO?type=roles&dbalias=&name=Team%20%26%20Auth%20
// Swagger URL: http://localhost:8080/nc/externalrest_weUO/db/swagger
//
// [REST] Swagger URL: http://localhost:8080/nc/externalrest_weUO/db/swagger
// [GQL] http://localhost:8080/nc/externalgql_dgwx/v1/graphql
const projectName = url.split("/")[5].split("?")[0];
let swaggerURL = `http://localhost:8080/nc/${projectName}/db/swagger`
let swaggerURL = ``
if ('rest' == type) {
swaggerURL = `http://localhost:8080/nc/${projectName}/db/swagger`
}
else {
swaggerURL = `http://localhost:8080/nc/${projectName}/v1/graphql`
}
// exchange information between two tests using a file
// https://stackoverflow.com/questions/52050657/what-is-the-best-practice-of-pass-states-between-tests-in-cypress
//
cy.writeFile("shared.json", {SWAGGER_URL: swaggerURL, AUTH_TOKEN: authToken})
})
})
})
})
describe(`Swagger page, base verification`, () => {
if ('rest' == type) {
// returns swagger button intended for
//
const getSwaggerButton = (tag, idx, desc) => {
return cy.get(`#operations-tag-${tag}`).next().find('.opblock').eq(idx).find(`button:contains(${desc})`)
}
describe(`Swagger page, base verification`, () => {
// returns swagger button intended for
//
const getSwaggerButton = (tag, idx, desc) => {
return cy.get(`#operations-tag-${tag}`).next().find('.opblock').eq(idx).find(`button:contains(${desc})`)
}
let Token
let Token
// basic authentication tag verification
//
it("Swagger URL access & basic validation", () => {
// retrieve information stored in previous IT block
// basic authentication tag verification
//
cy.readFile("shared.json").then((jsonPayload) => {
let URL = jsonPayload.SWAGGER_URL
Token = jsonPayload.AUTH_TOKEN
cy.visit(URL)
cy.log(Token)
// validate; API order assumed
cy.get('#operations-tag-Authentication').next().find('.opblock').should('has.length', 9)
getSwaggerButton("Authentication", 0, "User login").should('exist')
getSwaggerButton("Authentication", 1, "User signup").should('exist')
getSwaggerButton("Authentication", 2, "Password Forgot").should('exist')
getSwaggerButton("Authentication", 3, "Email validate link").should('exist')
getSwaggerButton("Authentication", 4, "Validate password reset token").should('exist')
getSwaggerButton("Authentication", 5, "Password reset").should('exist')
getSwaggerButton("Authentication", 6, "User details").should('exist')
getSwaggerButton("Authentication", 7, "Update user details").should('exist')
getSwaggerButton("Authentication", 8, "Update user details").should('exist')
it("Swagger URL access & basic validation", () => {
// retrieve information stored in previous IT block
//
cy.readFile("shared.json").then((jsonPayload) => {
let URL = jsonPayload.SWAGGER_URL
Token = jsonPayload.AUTH_TOKEN
cy.visit(URL)
cy.log(Token)
// validate; API order assumed
cy.get('#operations-tag-Authentication').next().find('.opblock').should('has.length', 9)
getSwaggerButton("Authentication", 0, "User login").should('exist')
getSwaggerButton("Authentication", 1, "User signup").should('exist')
getSwaggerButton("Authentication", 2, "Password Forgot").should('exist')
getSwaggerButton("Authentication", 3, "Email validate link").should('exist')
getSwaggerButton("Authentication", 4, "Validate password reset token").should('exist')
getSwaggerButton("Authentication", 5, "Password reset").should('exist')
getSwaggerButton("Authentication", 6, "User details").should('exist')
getSwaggerButton("Authentication", 7, "Update user details").should('exist')
getSwaggerButton("Authentication", 8, "Update user details").should('exist')
})
})
})
it("Authorize success: Valid token", ()=> {
// authorize button, feed token, click authorize
cy.get('[class="btn authorize unlocked"]').click()
cy.get('input').type(Token)
cy.get('.auth-btn-wrapper > .authorize').click()
it("Authorize success: Valid token", ()=> {
// authorize button, feed token, click authorize
cy.get('[class="btn authorize unlocked"]').click()
cy.get('input').type(Token)
cy.get('.auth-btn-wrapper > .authorize').click()
// Response: "Authorized" should exist on DOM
cy.get('.auth-container').contains('Authorized').should('exist')
cy.get('.btn-done').click()
// Response: "Authorized" should exist on DOM
cy.get('.auth-container').contains('Authorized').should('exist')
cy.get('.btn-done').click()
// Authorize button is LOCKED now
cy.get('[class="btn authorize locked"]').should('exist')
})
// Authorize button is LOCKED now
cy.get('[class="btn authorize locked"]').should('exist')
})
it("Execute Authentication (valid token case) > GET: User details API", ()=> {
// Auth> User details API
getSwaggerButton("Authentication", 6, "User details").click()
it("Execute Authentication (valid token case) > GET: User details API", ()=> {
// Auth> User details API
getSwaggerButton("Authentication", 6, "User details").click()
// "Try it out" button, followed by "Execute"
cy.get('.try-out > .btn').click()
cy.get('.execute-wrapper > .btn').click()
// "Try it out" button, followed by "Execute"
cy.get('.try-out > .btn').click()
cy.get('.execute-wrapper > .btn').click()
// check response: validate email credentials
cy.get('.highlight-code > .microlight').contains('email').should('exist')
cy.get('.highlight-code > .microlight').contains(roles.owner.credentials.username).should('exist')
// check response: validate email credentials
cy.get('.highlight-code > .microlight').contains('email').should('exist')
cy.get('.highlight-code > .microlight').contains(roles.owner.credentials.username).should('exist')
// reset operations (clear, cancel, windback User details tab)
cy.get('.btn-clear').click()
cy.get('.try-out > .btn').click()
getSwaggerButton("Authentication", 6, "User details").click()
})
// reset operations (clear, cancel, windback User details tab)
cy.get('.btn-clear').click()
cy.get('.try-out > .btn').click()
getSwaggerButton("Authentication", 6, "User details").click()
})
it("Logout post authorization", ()=> {
// authorize button, logout
cy.get('[class="btn authorize locked"]').click()
cy.get('.auth-btn-wrapper > button:contains("Logout")').click()
cy.get('.btn-done').click()
// Authorize button is UNLOCKED now
cy.get('[class="btn authorize unlocked"]').should('exist')
})
it("Execute Authentication (logout case) > GET: User details API", ()=> {
// Auth> User details API
getSwaggerButton("Authentication", 6, "User details").click()
// "Try it out" button, followed by "Execute"
cy.get('.try-out > .btn').click()
cy.get('.execute-wrapper > .btn').click()
// check response: email credentials shouldnt exist. should display 'guest:true'
cy.get('.highlight-code > .microlight').contains('guest').should('exist')
cy.get('.highlight-code > .microlight').contains('email').should('not.exist')
cy.get('.highlight-code > .microlight').contains(roles.owner.credentials.username).should('not.exist')
// reset operations (clear, cancel, windback User details tab)
cy.get('.btn-clear').click()
cy.get('.try-out > .btn').click()
getSwaggerButton("Authentication", 6, "User details").click()
})
it("Logout post authorization", ()=> {
// authorize button, logout
cy.get('[class="btn authorize locked"]').click()
cy.get('.auth-btn-wrapper > button:contains("Logout")').click()
cy.get('.btn-done').click()
// Authorize button is UNLOCKED now
cy.get('[class="btn authorize unlocked"]').should('exist')
})
it("Execute Authentication (logout case) > GET: User details API", ()=> {
// Auth> User details API
getSwaggerButton("Authentication", 6, "User details").click()
// "Try it out" button, followed by "Execute"
cy.get('.try-out > .btn').click()
cy.get('.execute-wrapper > .btn').click()
// check response: email credentials shouldnt exist. should display 'guest:true'
cy.get('.highlight-code > .microlight').contains('guest').should('exist')
cy.get('.highlight-code > .microlight').contains('email').should('not.exist')
cy.get('.highlight-code > .microlight').contains(roles.owner.credentials.username).should('not.exist')
// reset operations (clear, cancel, windback User details tab)
cy.get('.btn-clear').click()
cy.get('.try-out > .btn').click()
getSwaggerButton("Authentication", 6, "User details").click()
})
it("Authorize failure: invalid token", ()=> {
// authorize button, feed *invalid* token, click authorize
cy.get('[class="btn authorize unlocked"]').click()
cy.get('input').type('xyz')
cy.get('.auth-btn-wrapper > .authorize').click()
// Response: "Authorized" should *not* exist on DOM
// TBD: cy.get('.auth-container').contains('Authorized').should('not.exist')
cy.get('.btn-done').click()
// Authorize button should be UNLOCKED now
// TBD: cy.get('[class="btn authorize unlocked"]').should('exist')
})
it("Execute Authentication (invalid token case) > GET: User details API", ()=> {
// Auth> User details API
getSwaggerButton("Authentication", 6, "User details").click()
// "Try it out" button, followed by "Execute"
cy.get('.try-out > .btn').click()
cy.get('.execute-wrapper > .btn').click()
// check response: email credentials shouldnt exist. should display 'guest:true'
cy.get('.highlight-code > .microlight').contains('guest').should('exist')
cy.get('.highlight-code > .microlight').contains('email').should('not.exist')
cy.get('.highlight-code > .microlight').contains(roles.owner.credentials.username).should('not.exist')
// reset operations (clear, cancel, windback User details tab)
cy.get('.btn-clear').click()
cy.get('.try-out > .btn').click()
getSwaggerButton("Authentication", 6, "User details").click()
})
it("Authorize failure: invalid token", ()=> {
// authorize button, feed *invalid* token, click authorize
cy.get('[class="btn authorize unlocked"]').click()
cy.get('input').type('xyz')
cy.get('.auth-btn-wrapper > .authorize').click()
// Response: "Authorized" should *not* exist on DOM
// TBD: cy.get('.auth-container').contains('Authorized').should('not.exist')
cy.get('.btn-done').click()
// Authorize button should be UNLOCKED now
// TBD: cy.get('[class="btn authorize unlocked"]').should('exist')
})
it("Execute Authentication (invalid token case) > GET: User details API", ()=> {
// Auth> User details API
getSwaggerButton("Authentication", 6, "User details").click()
// "Try it out" button, followed by "Execute"
cy.get('.try-out > .btn').click()
cy.get('.execute-wrapper > .btn').click()
// check response: email credentials shouldnt exist. should display 'guest:true'
cy.get('.highlight-code > .microlight').contains('guest').should('exist')
cy.get('.highlight-code > .microlight').contains('email').should('not.exist')
cy.get('.highlight-code > .microlight').contains(roles.owner.credentials.username).should('not.exist')
// reset operations (clear, cancel, windback User details tab)
cy.get('.btn-clear').click()
cy.get('.try-out > .btn').click()
getSwaggerButton("Authentication", 6, "User details").click()
})
// clean-up created file (shared.json)
after(() => {
cy.exec("del shared.json").then(()=> {
cy.log("file cleaned up!")
// clean-up created file (shared.json)
after(() => {
cy.exec("del shared.json").then(()=> {
cy.log("file cleaned up!")
})
})
})
})
})
}
}
// genTest('rest', false)

3
cypress/integration/common/6d_language_validation.js

@ -1,9 +1,10 @@
const { mainPage } = require("../../support/page_objects/mainPage")
const { loginPage } = require("../../support/page_objects/navigation")
const { roles } = require("../../support/page_objects/projectConstants")
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"
export const genTest = (type, xcdb) => {
if(!isTestSuiteActive(type, xcdb)) return;
describe(`Language support`, () => {
before(() => {

5
cypress/integration/test/masterSuite.js

@ -30,9 +30,9 @@ const executionMode = 1
const nocoTestSuite = (type, xcdb) => {
if (0 == executionMode) {
t0.genTest('rest', false)
t0.genTest(type, xcdb)
} else {
t00.genTest()
t00.genTest(type, xcdb)
}
t0a.genTest(type, xcdb)
@ -65,6 +65,7 @@ const nocoTestSuite = (type, xcdb) => {
}
nocoTestSuite('rest', false)
nocoTestSuite('graphql', false)
/**
* @copyright Copyright (c) 2021, Xgene Cloud Ltd

Loading…
Cancel
Save