UNPKG

@revoloo/cypress6

Version:

Cypress.io end to end testing tool

145 lines (106 loc) 3.17 kB
const _ = require('lodash') const $errUtils = require('../cypress/error_utils') const aliasRe = /^@.+/ const aliasDisplayRe = /^([@]+)/ const requestXhrRe = /\.request$/ const reserved = ['test', 'runnable', 'timeout', 'slow', 'skip', 'inspect'] const aliasDisplayName = (name) => { return name.replace(aliasDisplayRe, '') } const getXhrTypeByAlias = (alias) => { if (requestXhrRe.test(alias)) { return 'request' } return 'response' } const validateAlias = (alias) => { if (!_.isString(alias)) { $errUtils.throwErrByPath('as.invalid_type') } if (aliasDisplayRe.test(alias)) { $errUtils.throwErrByPath('as.invalid_first_token', { args: { alias, suggestedName: alias.replace(aliasDisplayRe, ''), }, }) } if (_.isBlank(alias)) { $errUtils.throwErrByPath('as.empty_string') } if (reserved.includes(alias)) { return $errUtils.throwErrByPath('as.reserved_word', { args: { alias } }) } } const create = (cy) => { const addAlias = (ctx, aliasObj) => { const { alias, subject } = aliasObj const aliases = cy.state('aliases') || {} aliases[alias] = aliasObj cy.state('aliases', aliases) const remoteSubject = cy.getRemotejQueryInstance(subject) ctx[alias] = remoteSubject ?? subject } const getNextAlias = () => { const next = cy.state('current').get('next') if (next && (next.get('name') === 'as')) { return next.get('args')[0] } } const getAlias = (name, cmd, log) => { const aliases = cy.state('aliases') || {} // bail if the name doesnt reference an alias if (!aliasRe.test(name)) { return } const alias = aliases[name.slice(1)] // slice off the '@' if (!alias) { aliasNotFoundFor(name, cmd, log) } return alias } const getAvailableAliases = () => { const aliases = cy.state('aliases') if (!aliases) { return [] } return _.keys(aliases) } const aliasNotFoundFor = (name, cmd, log) => { let displayName const availableAliases = getAvailableAliases() // throw a very specific error if our alias isnt in the right // format, but its word is found in the availableAliases if (!aliasRe.test(name) && availableAliases.includes(name)) { displayName = aliasDisplayName(name) $errUtils.throwErrByPath('alias.invalid', { onFail: log, args: { name, displayName }, }) } cmd = cmd ?? ((log && log.get('name')) || cy.state('current').get('name')) displayName = aliasDisplayName(name) const errPath = availableAliases.length ? 'alias.not_registered_with_available' : 'alias.not_registered_without_available' return $errUtils.throwErrByPath(errPath, { onFail: log, args: { cmd, displayName, availableAliases: availableAliases.join(', ') }, }) } return { getAlias, addAlias, // these are public because its expected other commands // know about them and are expected to call them getNextAlias, validateAlias, aliasNotFoundFor, getXhrTypeByAlias, getAvailableAliases, } } module.exports = { create, }