influxdb/ui/cypress/e2e/tokens.test.ts

348 lines
10 KiB
TypeScript

import {Organization} from '@influxdata/influx'
describe('tokens', () => {
let authData: {description: string; status: boolean; id: string}[]
let testTokens: {
id: string
description: string
status: string
permissions: object[]
}[]
beforeEach(() => {
cy.flush()
authData = []
cy.signin().then(({body}) => {
const {
org: {id},
} = body
cy.wrap(body.org).as('org')
testTokens = [
{
id: id,
description: 'token test \u0950',
status: 'active',
permissions: [
{action: 'write', resource: {type: 'views'}},
{action: 'write', resource: {type: 'documents'}},
{action: 'write', resource: {type: 'dashboards'}},
{action: 'write', resource: {type: 'buckets'}},
],
},
{
id: id,
description: 'token test 02',
status: 'inactive',
permissions: [
{action: 'write', resource: {type: 'views'}},
{action: 'write', resource: {type: 'documents'}},
{action: 'write', resource: {type: 'dashboards'}},
{action: 'write', resource: {type: 'buckets'}},
],
},
{
id: id,
description: 'token test 03',
status: 'inactive',
permissions: [
{action: 'read', resource: {type: 'views'}},
{action: 'read', resource: {type: 'documents'}},
{action: 'read', resource: {type: 'dashboards'}},
{action: 'read', resource: {type: 'buckets'}},
],
},
]
//check out array.reduce for the nested calls here
cy.request('api/v2/authorizations').then(resp => {
expect(resp.body).to.exist
authData.push({
description: resp.body.authorizations[0].description,
status: resp.body.authorizations[0].status === 'active',
id: resp.body.authorizations[0].id,
})
testTokens.forEach(token => {
cy.createToken(
token.id,
token.description,
token.status,
token.permissions
).then(resp => {
expect(resp.body).to.exist
authData.push({
description: resp.body.description,
status: resp.body.status === 'active',
id: resp.body.id,
})
})
})
cy.fixture('routes').then(({orgs}) => {
cy.visit(`${orgs}/${id}/tokens`)
})
})
})
})
it('can list tokens', () => {
cy.getByTestID('table-row').should('have.length', 4)
cy.getByTestID('table-row').then(rows => {
authData = authData.sort((a, b) =>
// eslint-disable-next-line
a.description < b.description
? -1
: a.description > b.description
? 1
: 0
)
for (var i = 0; i < rows.length; i++) {
cy.getByTestID('editable-name')
.eq(i)
.children('a')
.children('span')
.should('have.text', authData[i].description)
if (authData[i].status) {
cy.getByTestID('slide-toggle')
.eq(i)
.should('have.class', 'active')
} else {
cy.getByTestID('slide-toggle')
.eq(i)
.should('not.have.class', 'active')
}
}
})
})
it('can filter tokens', () => {
//basic filter
cy.getByTestID('input-field--filter').type('test')
cy.getByTestID('table-row').should('have.length', 3)
//clear filter
cy.getByTestID('input-field--filter').clear()
cy.getByTestID('table-row').should('have.length', 4)
//exotic filter
cy.getByTestID('input-field--filter').type('\u0950')
cy.getByTestID('table-row').should('have.length', 1)
})
it('can change token activation status', () => {
//toggle on
cy.getByTestID('table-row')
.contains('token test 02')
.parents('[data-testid=table-row]')
.within(() => {
cy.getByTestID('slide-toggle')
.click()
.then(() => {
//wait for backend to sync
cy.wait(1000)
//check for status update on backend
// @ts-ignore
cy.request(
'api/v2/authorizations/' +
authData.find(function(item) {
return item.description === 'token test 02'
}).id
).then(resp => {
expect(resp.body.status).equals('active')
})
})
})
cy.getByTestID('table-row')
.contains('token test 02')
.parents('[data-testid=table-row]')
.within(() => {
cy.getByTestID('slide-toggle').should('have.class', 'active')
})
cy.getByTestID('table-row')
.contains('token test 02')
.parents('[data-testid=table-row]')
.within(() => {
cy.getByTestID('slide-toggle')
.click()
.then(() => {
//wait for backend to sync
cy.wait(1000)
//check for status update on backend
// @ts-ignore
cy.request(
'api/v2/authorizations/' +
authData.find(function(item) {
return item.description === 'token test 02'
}).id
).then(resp => {
expect(resp.body.status).equals('inactive')
})
})
})
cy.getByTestID('table-row')
.contains('token test 02')
.parents('[data-testid=table-row]')
.within(() => {
cy.getByTestID('slide-toggle').should('not.have.class', 'active')
})
})
it('can delete a token', () => {
cy.getByTestID('table-row').should('have.length', 4)
cy.getByTestID('table-row')
.contains('token test 03')
.parents('[data-testid=table-row]')
.within(() => {
cy.getByTestID('delete-button')
.click()
.then(() => {
cy.getByTestID('confirmation-button').click({force: true})
})
})
cy.getByTestID('table-row').should('have.length', 3)
cy.getByTestID('table-row')
.contains('token test 03')
.should('not.exist')
})
it('can generate a read/write token', () => {
cy.getByTestID('table-row').should('have.length', 4)
//create some extra buckets for filters
cy.get<Organization>('@org').then(({id, name}) => {
cy.createBucket(id, name, 'Magna Carta').then(() => {
cy.createBucket(id, name, 'Sicilsky Bull').then(() => {
cy.createBucket(id, name, 'A la Carta')
})
})
// open overlay
cy.getByTestID('dropdown-button--gen-token').click()
cy.getByTestIDSubStr('dropdown--item').should('have.length', 2)
cy.getByTestID('dropdown--item Read/Write Token').click()
cy.getByTestID('overlay--container').should('be.visible')
//check cancel
cy.getByTestID('button--cancel').click()
cy.getByTestID('overlay--container').should('not.be.visible')
cy.getByTestID('table-row').should('have.length', 4)
// open overlay - again
cy.getByTestID('dropdown-button--gen-token').click()
cy.getByTestIDSubStr('dropdown--item').should('have.length', 2)
cy.getByTestID('dropdown--item Read/Write Token').click()
cy.getByTestID('overlay--container').should('be.visible')
//Create a token //todo filters in this or seperate test
cy.getByTestID('input-field--descr').type('Jeton 01')
cy.getByTestID('builder-card--body')
.eq(0)
.within(() => {
cy.getByTitle('Click to filter by Sicilsky Bull').click()
cy.getByTitle('Click to filter by A la Carta').click()
})
cy.getByTestID('builder-card--body')
.eq(1)
.within(() => {
cy.getByTitle('Click to filter by Sicilsky Bull').click()
})
cy.getByTestID('button--save').click()
//Verify token
cy.getByTestID('table-row')
.should('have.length', 5)
.contains('Jeton 01')
.should('be.visible')
cy.getByTestID('table-row')
.contains('Jeton 01')
.click()
cy.getByTestID('overlay--container').should('be.visible')
cy.getByTestID('overlay--header').should('contain', 'Jeton 01')
cy.getByTestID('permissions-section').should('have.length', 2)
cy.getByTestID('permissions-section')
.contains('buckets-Sicilsky Bull')
.should('be.visible')
cy.getByTestID('permissions-section')
.contains('buckets-Sicilsky Bull')
.parent()
.parent()
.within(() => {
cy.getByTestID('permissions--item').should('have.length', 2)
cy.getByTestID('permissions--item')
.contains('write')
.should('be.visible')
cy.getByTestID('permissions--item')
.contains('read')
.should('be.visible')
})
cy.getByTestID('permissions-section')
.contains('buckets-A la Carta')
.parent()
.parent()
.within(() => {
cy.getByTestID('permissions--item').should('have.length', 1)
cy.getByTestID('permissions--item')
.contains('write')
.should('not.be.visible')
cy.getByTestID('permissions--item')
.contains('read')
.should('be.visible')
})
})
it('can view a token', () => {
cy.getByTestID('table-row')
.contains('token test \u0950')
.click()
//title match
cy.getByTestID('overlay--container').should('be.visible')
cy.getByTestID('overlay--header').should('contain', 'token test \u0950')
//summary match
cy.getByTestID('permissions-section').should('have.length', 4)
cy.getByTestID('permissions-section')
.contains('views')
.should('be.visible')
cy.getByTestID('permissions-section')
.contains('documents')
.should('be.visible')
cy.getByTestID('permissions-section')
.contains('dashboards')
.should('be.visible')
cy.getByTestID('permissions-section')
.contains('buckets')
.should('be.visible')
//copy to clipboard + notification
cy.getByTestID('button-copy').click()
cy.getByTestID('notification-success').should($msg => {
expect($msg).to.contain('has been copied to clipboard')
})
//todo check system clipboard
//close button
cy.getByTestID('overlay--header').within(() => {
cy.get('button').click()
})
cy.getByTestID('overlay--container').should('not.be.visible')
})
})
})