651 lines
18 KiB
TypeScript
651 lines
18 KiB
TypeScript
import { cloneDeep } from 'lodash-es'
|
|
|
|
const username = Cypress.env('username')
|
|
const password = Cypress.env('password')
|
|
const hostUrl = Cypress.env('hosturl')
|
|
const appLocation = Cypress.env('appLocation')
|
|
const longerCommandTimeout = Cypress.env('longerCommandTimeout')
|
|
const serverType = Cypress.env('serverType')
|
|
const libraryToOpenIncludes = Cypress.env(`libraryToOpenIncludes_${serverType}`)
|
|
|
|
context('editor tests: ', function () {
|
|
this.beforeAll(() => {
|
|
cy.visit(`${hostUrl}/SASLogon/logout`)
|
|
cy.loginAndUpdateValidKey(true)
|
|
})
|
|
|
|
this.beforeEach(() => {
|
|
cy.visit(hostUrl + appLocation)
|
|
cy.wait(2000)
|
|
|
|
cy.get('body').then(($body) => {
|
|
const usernameInput = $body.find('input.username')[0]
|
|
|
|
if (usernameInput && !Cypress.dom.isHidden(usernameInput)) {
|
|
cy.get('input.username').type(username)
|
|
cy.get('input.password').type(password)
|
|
|
|
cy.get('.login-group button').click()
|
|
}
|
|
})
|
|
|
|
visitPage('home')
|
|
})
|
|
|
|
it('1 | Add one viewbox', (done) => {
|
|
const viewbox_table = 'mpe_audit'
|
|
const columns = ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM']
|
|
|
|
openTableFromTree(libraryToOpenIncludes, 'mpe_x_test')
|
|
|
|
cy.get('.viewbox-open').click()
|
|
openTableFromViewboxTree(libraryToOpenIncludes, [viewbox_table])
|
|
|
|
cy.get('.open-viewbox').then((viewboxNodes: any) => {
|
|
for (let viewboxNode of viewboxNodes) {
|
|
if (!viewboxNode.innerText.toLowerCase().includes(viewbox_table)) {
|
|
return
|
|
}
|
|
|
|
checkColumns(columns, () => {
|
|
done()
|
|
})
|
|
}
|
|
})
|
|
})
|
|
|
|
it('2 | Add two viewboxes', (done) => {
|
|
const viewboxes = [
|
|
{
|
|
viewbox_table: 'mpe_audit',
|
|
columns: ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM']
|
|
},
|
|
{
|
|
viewbox_table: 'mpe_alerts',
|
|
columns: [
|
|
'TX_FROM',
|
|
'ALERT_EVENT',
|
|
'ALERT_LIB',
|
|
'ALERT_DS',
|
|
'ALERT_USER'
|
|
]
|
|
}
|
|
]
|
|
|
|
openTableFromTree(libraryToOpenIncludes, 'mpe_x_test')
|
|
cy.get('.viewbox-open').click()
|
|
openTableFromViewboxTree(
|
|
libraryToOpenIncludes,
|
|
viewboxes.map((viewbox) => viewbox.viewbox_table))
|
|
cy.get('.open-viewbox').then((viewboxNodes: any) => {
|
|
let found = 0
|
|
|
|
for (let viewboxNode of viewboxNodes) {
|
|
for (let viewbox of viewboxes) {
|
|
if (
|
|
viewboxNode.innerText.toLowerCase().includes(viewbox.viewbox_table)
|
|
)
|
|
found++
|
|
}
|
|
}
|
|
|
|
if (found < viewboxes.length) return
|
|
|
|
cy.get('.viewboxes-container .viewbox', { withinSubject: null }).then((viewboxNodes: any) => {
|
|
for (let viewboxNode of viewboxNodes) {
|
|
cy.get(viewboxNode).within(() => {
|
|
cy.get('.table-title').then((tableTitle) => {
|
|
const title = tableTitle[0].innerText
|
|
const viewbox = viewboxes.find((vb) =>
|
|
title.toLowerCase().includes(vb.viewbox_table)
|
|
)
|
|
|
|
if (viewbox) {
|
|
cy.get('.ht_master.handsontable .htCore thead tr').then(
|
|
(viewboxColNodes: any) => {
|
|
let allColsHtml = viewboxColNodes[0].innerHTML
|
|
|
|
for (let col of viewbox?.columns) {
|
|
if (!allColsHtml.includes(col)) return
|
|
}
|
|
|
|
done()
|
|
}
|
|
)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
})
|
|
})
|
|
})
|
|
|
|
it('3 | Add viewbox, add columns', (done) => {
|
|
const viewbox_table = 'mpe_audit'
|
|
const columns = ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM']
|
|
const additionalColumns = ['IS_PK']
|
|
|
|
openTableFromTree(libraryToOpenIncludes, 'mpe_x_test')
|
|
|
|
cy.get('.viewbox-open').click()
|
|
openTableFromViewboxTree(libraryToOpenIncludes, [viewbox_table])
|
|
|
|
cy.get('.open-viewbox').then((viewboxNodes: any) => {
|
|
for (let viewboxNode of viewboxNodes) {
|
|
if (!viewboxNode.innerText.toLowerCase().includes(viewbox_table)) {
|
|
return
|
|
}
|
|
|
|
openViewboxConfig(viewbox_table)
|
|
|
|
removeAllColumns()
|
|
|
|
addColumns(additionalColumns)
|
|
|
|
checkColumns([...columns, ...additionalColumns], () => {
|
|
done()
|
|
})
|
|
}
|
|
})
|
|
})
|
|
|
|
it('4 | Add viewbox, add columns and reorder', (done) => {
|
|
const viewbox_table = 'mpe_audit'
|
|
const columns = ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM']
|
|
const additionalColumns = ['IS_PK', 'MOVE_TYPE']
|
|
|
|
openTableFromTree(libraryToOpenIncludes, 'mpe_x_test')
|
|
|
|
cy.get('.viewbox-open').click()
|
|
openTableFromViewboxTree(libraryToOpenIncludes, [viewbox_table])
|
|
|
|
cy.get('.open-viewbox').then((viewboxNodes: any) => {
|
|
for (let viewboxNode of viewboxNodes) {
|
|
if (!viewboxNode.innerText.toLowerCase().includes(viewbox_table)) {
|
|
return
|
|
}
|
|
|
|
openViewboxConfig(viewbox_table)
|
|
|
|
removeAllColumns()
|
|
|
|
addColumns(additionalColumns, () => {
|
|
cy.wait(1000)
|
|
//reorder
|
|
cy.get('.col-box.column-MOVE_TYPE')
|
|
.realMouseDown({ button: 'left', position: 'center' })
|
|
.realMouseMove(0, 10, { position: 'center' })
|
|
cy.wait(200) // In our case, we wait 200ms cause we have animations which we are sure that take this amount of time
|
|
cy.get('.col-box.column-IS_PK')
|
|
.realMouseMove(0, 0, { position: 'center' })
|
|
.realMouseUp()
|
|
//reorder end
|
|
|
|
cy.wait(500)
|
|
|
|
checkColumns([...columns, ...additionalColumns.reverse()], () => {
|
|
done()
|
|
})
|
|
})
|
|
}
|
|
})
|
|
})
|
|
|
|
it('5 | Add viewbox, add columns, reorder, remove column, add again', (done) => {
|
|
const viewbox_table = 'mpe_audit'
|
|
const columns = ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM']
|
|
const additionalColumns = ['IS_PK', 'MOVE_TYPE']
|
|
|
|
openTableFromTree(libraryToOpenIncludes, 'mpe_x_test')
|
|
|
|
cy.get('.viewbox-open').click()
|
|
openTableFromViewboxTree(libraryToOpenIncludes, [viewbox_table])
|
|
|
|
cy.get('.open-viewbox').then((viewboxNodes: any) => {
|
|
for (let viewboxNode of viewboxNodes) {
|
|
if (!viewboxNode.innerText.toLowerCase().includes(viewbox_table)) {
|
|
return
|
|
}
|
|
|
|
viewboxNode.click()
|
|
|
|
removeAllColumns()
|
|
|
|
addColumns(additionalColumns, () => {
|
|
cy.wait(1000)
|
|
//reorder
|
|
cy.get('.col-box.column-MOVE_TYPE')
|
|
.realMouseDown({ button: 'left', position: 'center' })
|
|
.realMouseMove(0, 10, { position: 'center' })
|
|
cy.wait(200) // In our case, we wait 200ms cause we have animations which we are sure that take this amount of time
|
|
cy.get('.col-box.column-IS_PK')
|
|
.realMouseMove(0, 0, { position: 'center' })
|
|
.realMouseUp()
|
|
//reorder end
|
|
|
|
cy.wait(500)
|
|
|
|
checkColumns([...columns, ...additionalColumns.reverse()], () => {
|
|
const colToRemove = 'MOVE_TYPE'
|
|
|
|
removeColumn(colToRemove)
|
|
checkColumns(
|
|
[
|
|
...columns,
|
|
...additionalColumns.filter((col) => col !== colToRemove)
|
|
],
|
|
() => {
|
|
addColumns([colToRemove], () => {
|
|
checkColumns(
|
|
[...columns, ...additionalColumns.reverse()],
|
|
() => {
|
|
done()
|
|
}
|
|
)
|
|
})
|
|
}
|
|
)
|
|
})
|
|
})
|
|
}
|
|
})
|
|
})
|
|
|
|
it('6 | Add viewboxes, reload and check url restored configuration', (done) => {
|
|
const viewboxes = [
|
|
{
|
|
viewbox_table: 'mpe_audit',
|
|
columns: ['LOAD_REF', 'LIBREF', 'DSN', 'KEY_HASH', 'TGTVAR_NM'],
|
|
additionalColumns: ['IS_PK', 'MOVE_TYPE']
|
|
},
|
|
{
|
|
viewbox_table: 'mpe_alerts',
|
|
columns: [
|
|
'TX_FROM',
|
|
'ALERT_EVENT',
|
|
'ALERT_LIB',
|
|
'ALERT_DS',
|
|
'ALERT_USER'
|
|
],
|
|
additionalColumns: ['TX_TO']
|
|
}
|
|
]
|
|
|
|
openTableFromTree(libraryToOpenIncludes, 'mpe_x_test')
|
|
|
|
cy.get('.viewbox-open').click()
|
|
openTableFromViewboxTree(libraryToOpenIncludes, [
|
|
viewboxes[0].viewbox_table,
|
|
viewboxes[1].viewbox_table
|
|
])
|
|
|
|
openViewboxConfig(viewboxes[0].viewbox_table)
|
|
|
|
cy.wait(500)
|
|
|
|
removeAllColumns()
|
|
|
|
addColumns(viewboxes[0].additionalColumns, () => {
|
|
cy.wait(1000)
|
|
|
|
if (viewboxes[0].viewbox_table === 'mpe_audit') {
|
|
cy.get('.col-box.column-MOVE_TYPE')
|
|
.realMouseDown({ button: 'left', position: 'center' })
|
|
.realMouseMove(0, 10, { position: 'center' })
|
|
cy.wait(200) // In our case, we wait 200ms cause we have animations which we are sure that take this amount of time
|
|
cy.get('.col-box.column-IS_PK')
|
|
.realMouseMove(0, 0, { position: 'center' })
|
|
.realMouseUp()
|
|
}
|
|
|
|
cy.wait(1000)
|
|
|
|
openViewboxConfig(viewboxes[1].viewbox_table)
|
|
|
|
addColumns(viewboxes[1].additionalColumns, () => {
|
|
cy.wait(1000).reload()
|
|
|
|
let result = 0
|
|
|
|
checkColumns(
|
|
[
|
|
...viewboxes[0].columns,
|
|
...cloneDeep(viewboxes[0].additionalColumns.reverse())
|
|
],
|
|
() => {
|
|
result++
|
|
|
|
if (result === 2) done()
|
|
}
|
|
)
|
|
checkColumns(
|
|
[...viewboxes[1].columns, ...viewboxes[1].additionalColumns],
|
|
() => {
|
|
result++
|
|
|
|
if (result === 2) done()
|
|
}
|
|
)
|
|
})
|
|
})
|
|
})
|
|
|
|
// We will enable this test when we figure out how to mock filtering
|
|
// it('7 | Add viewboxes and filter', () => {
|
|
// const viewboxes = ['mpe_x_test', 'mpe_validations']
|
|
|
|
// openTableFromTree(libraryToOpenIncludes, 'mpe_x_test')
|
|
|
|
// cy.get('.viewbox-open').click()
|
|
// openTableFromViewboxTree(libraryToOpenIncludes, viewboxes)
|
|
|
|
// cy.wait(1000)
|
|
|
|
// closeViewboxModal()
|
|
|
|
// cy.get('.viewboxes-container .viewbox', { withinSubject: null }).then(
|
|
// (viewboxNodes: any) => {
|
|
// for (let viewboxNode of viewboxNodes) {
|
|
// cy.get(viewboxNode).within(() => {
|
|
// cy.get('.table-title').then((title: any) => {
|
|
// cy.get('.hot-spinner')
|
|
// .should('not.exist')
|
|
// .then(() => {
|
|
// cy.get('clr-icon[shape="filter"]').then((filterButton) => {
|
|
// filterButton[0].click()
|
|
// })
|
|
|
|
// if (title[0].innerText.includes('MPE_X_TEST')) {
|
|
// setFilterWithValue(
|
|
// 'SOME_CHAR',
|
|
// 'this is dummy data',
|
|
// 'value',
|
|
// () => {
|
|
// cy.get('app-query', { withinSubject: null })
|
|
// .should('not.exist')
|
|
// .get('.ht_master.handsontable tbody tr')
|
|
// .then((rowNodes) => {
|
|
// const tr = rowNodes[0]
|
|
|
|
// expect(rowNodes).to.have.length(1)
|
|
// expect(tr.innerText).to.equal('0')
|
|
// })
|
|
// }
|
|
// )
|
|
// } else if (title[0].innerText.includes('MPE_VALIDATIONS')) {
|
|
// setFilterWithValue('BASE_COL', 'ALERT_LIB', 'value', () => {
|
|
// cy.get('app-query', { withinSubject: null })
|
|
// .should('not.exist')
|
|
// .get('.ht_master.handsontable tbody tr')
|
|
// .then((rowNodes) => {
|
|
// const tr = rowNodes[0]
|
|
|
|
// expect(rowNodes).to.have.length(1)
|
|
// expect(tr.innerText).to.contain('ALERT_LIB')
|
|
// })
|
|
// })
|
|
// }
|
|
// })
|
|
// })
|
|
// })
|
|
// }
|
|
// }
|
|
// )
|
|
// })
|
|
})
|
|
|
|
const removeAllColumns = () => {
|
|
cy.get('.configuration-wrapper clr-icon[shape="trash"]').then(removeNodes => {
|
|
for (let removeNode of removeNodes) {
|
|
removeNode.click()
|
|
}
|
|
})
|
|
}
|
|
|
|
const checkColumns = (columns: string[], callback: () => void) => {
|
|
cy.get('.viewboxes-container .viewbox', { withinSubject: null }).then(
|
|
(viewboxNodes: any) => {
|
|
for (let viewboxNode of viewboxNodes) {
|
|
cy.get(viewboxNode).within(() => {
|
|
cy.get('.ht_master.handsontable thead tr th').then(
|
|
(viewboxColNodes: any) => {
|
|
console.log('viewboxColNode', viewboxColNodes)
|
|
console.log('columns', columns)
|
|
for (let i = 0; i < viewboxColNodes.length; i++) {
|
|
const col = columns[i]|| ''
|
|
const colNode = viewboxColNodes[i]
|
|
|
|
if (
|
|
!colNode.innerHTML.toLowerCase().includes(col.toLowerCase())
|
|
)
|
|
return
|
|
}
|
|
|
|
callback()
|
|
}
|
|
)
|
|
})
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
const closeViewboxModal = () => {
|
|
cy.get('app-viewboxes .close', { withinSubject: null }).click()
|
|
}
|
|
|
|
const removeColumn = (column: string) => {
|
|
cy.get(`.col-box.column-${column} clr-icon`, { withinSubject: null }).click()
|
|
}
|
|
|
|
const addColumns = (columns: string[], callback?: () => void) => {
|
|
for (let i = 0; i < columns.length; i++) {
|
|
const column = columns[i]
|
|
|
|
cy.get('.cols-search input', { withinSubject: null }).type(column)
|
|
cy.get('.cols-search .autocomplete-wrapper', { withinSubject: null })
|
|
.first()
|
|
.trigger('keydown', { key: 'ArrowDown' })
|
|
cy.get('.cols-search .autocomplete-wrapper', { withinSubject: null })
|
|
.first()
|
|
.trigger('keydown', { key: 'Enter' })
|
|
.then(() => {
|
|
if (i === columns.length - 1 && callback) callback()
|
|
})
|
|
}
|
|
}
|
|
|
|
const openViewboxConfig = (viewbox_tablename: string) => {
|
|
cy.get('.open-viewbox').then((viewboxes: any) => {
|
|
for (let openViewbox of viewboxes) {
|
|
if (openViewbox.innerText.toLowerCase().includes(viewbox_tablename))
|
|
openViewbox.click()
|
|
}
|
|
})
|
|
}
|
|
|
|
const openTableFromTree = (libNameIncludes: string, tablename: string) => {
|
|
cy.get('.app-loading', { timeout: longerCommandTimeout })
|
|
.should('not.exist')
|
|
.then(() => {
|
|
cy.get('.nav-tree clr-tree > clr-tree-node', {
|
|
timeout: longerCommandTimeout
|
|
}).then((treeNodes: any) => {
|
|
let viyaLib
|
|
|
|
for (let node of treeNodes) {
|
|
if (new RegExp(libNameIncludes).test(node.innerText.toLowerCase())) {
|
|
viyaLib = node
|
|
break
|
|
}
|
|
}
|
|
|
|
cy.get(viyaLib).within(() => {
|
|
cy.get('.clr-tree-node-content-container p').click()
|
|
|
|
cy.get('.clr-treenode-link').then((innerNodes: any) => {
|
|
for (let innerNode of innerNodes) {
|
|
if (innerNode.innerText.toLowerCase().includes(tablename)) {
|
|
innerNode.click()
|
|
break
|
|
}
|
|
}
|
|
})
|
|
})
|
|
})
|
|
})
|
|
}
|
|
|
|
const setFilterWithValue = (
|
|
variableValue: string,
|
|
valueString: string,
|
|
valueField: 'value' | 'time' | 'date' | 'datetime' | 'in' | 'between',
|
|
callback?: any
|
|
) => {
|
|
cy.wait(600)
|
|
|
|
cy.focused().type(variableValue)
|
|
cy.wait(100)
|
|
// cy.focused().trigger('input')
|
|
cy.get('.variable-col .autocomplete-wrapper', { withinSubject: null })
|
|
.first()
|
|
.trigger('keydown', { key: 'ArrowDown' })
|
|
cy.get('.variable-col .autocomplete-wrapper', {
|
|
withinSubject: null
|
|
}).trigger('keydown', { key: 'Enter' })
|
|
cy.focused().tab()
|
|
cy.wait(100)
|
|
|
|
if (valueField === 'in') {
|
|
cy.focused().select(valueField.toUpperCase()).trigger('change')
|
|
} else if (valueField === 'between') {
|
|
cy.focused().select(valueField.toUpperCase()).trigger('change')
|
|
} else {
|
|
cy.focused().tab()
|
|
cy.wait(100)
|
|
}
|
|
|
|
switch (valueField) {
|
|
case 'value': {
|
|
cy.focused().type(valueString)
|
|
|
|
break
|
|
}
|
|
case 'time': {
|
|
cy.focused().type(valueString)
|
|
|
|
break
|
|
}
|
|
case 'date': {
|
|
cy.focused().type(valueString)
|
|
cy.focused().tab()
|
|
|
|
break
|
|
}
|
|
case 'datetime': {
|
|
const date = valueString.split(' ')[0]
|
|
const time = valueString.split(' ')[1]
|
|
|
|
cy.focused().type(date)
|
|
cy.focused().tab()
|
|
cy.focused().tab()
|
|
cy.focused().type(time)
|
|
|
|
break
|
|
}
|
|
case 'in': {
|
|
cy.get('.checkbox-vals').then(() => {
|
|
cy.focused().tab()
|
|
cy.focused().click()
|
|
cy.get('.no-values')
|
|
.should('not.exist')
|
|
.then(() => {
|
|
cy.get('clr-checkbox-wrapper input').then((inputs: any) => {
|
|
inputs[0].click()
|
|
cy.get('.in-values-modal .modal-footer button').click()
|
|
|
|
cy.get('.modal-footer .btn-success-outline').click()
|
|
|
|
if (callback) callback()
|
|
})
|
|
})
|
|
})
|
|
|
|
break
|
|
}
|
|
case 'between': {
|
|
cy.focused().tab()
|
|
|
|
const start = valueString.split('-')[0]
|
|
const end = valueString.split('-')[1]
|
|
|
|
cy.focused().type(start)
|
|
cy.focused().tab()
|
|
cy.focused().type(end)
|
|
}
|
|
default: {
|
|
break
|
|
}
|
|
}
|
|
|
|
cy.wait(100)
|
|
cy.focused().tab()
|
|
cy.wait(100)
|
|
cy.focused().tab()
|
|
cy.wait(100)
|
|
cy.focused().tab()
|
|
cy.wait(100)
|
|
cy.focused().tab()
|
|
cy.wait(100)
|
|
cy.focused().click()
|
|
|
|
if (callback) callback()
|
|
}
|
|
|
|
const openTableFromViewboxTree = (
|
|
libNameIncludes: string,
|
|
tablenames: string[]
|
|
) => {
|
|
cy.get('.add-new clr-tree > clr-tree-node', {
|
|
timeout: longerCommandTimeout
|
|
}).then((treeNodes: any) => {
|
|
let viyaLib
|
|
|
|
for (let node of treeNodes) {
|
|
if (node.innerText.toLowerCase().includes(libNameIncludes)) {
|
|
viyaLib = node
|
|
break
|
|
}
|
|
}
|
|
|
|
cy.get(viyaLib).within(() => {
|
|
cy.get('p')
|
|
.click()
|
|
.then(() => {
|
|
cy.get('.clr-treenode-link').then(async (innerNodes: any) => {
|
|
for (let innerNode of innerNodes) {
|
|
for (let tablename of tablenames) {
|
|
await pause(300)
|
|
if (innerNode.innerText.toLowerCase().includes(tablename)) {
|
|
innerNode.click()
|
|
}
|
|
}
|
|
}
|
|
})
|
|
})
|
|
})
|
|
})
|
|
}
|
|
|
|
const pause = (ms: number) => {
|
|
return new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
resolve(null)
|
|
}, ms)
|
|
})
|
|
}
|
|
|
|
const visitPage = (url: string) => {
|
|
cy.visit(`${hostUrl}${appLocation}/#/${url}`)
|
|
}
|