多维表格
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
9.6 KiB

import { loginPage } from "../../support/page_objects/navigation"
import { mainPage } from "../../support/page_objects/mainPage"
import { roles } from "../../support/page_objects/projectConstants"
import { isTestSuiteActive } from "../../support/page_objects/projectConstants"
export const genTest = (type, xcdb) => {
if(!isTestSuiteActive(type, xcdb)) return;
describe(`${type.toUpperCase()} : API List - Test preparation`, () => {
before(()=> {
loginPage.loginAndOpenProject(type, false)
})
it("Open project & record swagger URL, AuthToken", () => {
let authToken = mainPage.getAuthToken()
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
// [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 = ``
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})
})
})
})
if ('rest' == type) {
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
// basic authentication tag verification
//
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, {
baseUrl: null
}).then(() => {
// wait to allow time for SWAGGER Library loading to finish
cy.log(Token)
// validate; API order assumed
cy.get('#operations-tag-Authentication', {timeout: 20000}).should('exist').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()
// 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')
})
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()
// 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()
})
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()
})
// clean-up created file (shared.json)
// after(() => {
// cy.exec("del shared.json").then(()=> {
// cy.log("file cleaned up!")
// })
// })
})
}
}
/**
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
*
* @author Raju Udava <sivadstala@gmail.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/