UNPKG

@revoloo/cypress6

Version:

Cypress.io end to end testing tool

119 lines (94 loc) 3.52 kB
const path = require('path') const { fs } = require('./fs') const debug = require('debug')('cypress:server:path_helpers') const _ = require('lodash') // When we load the spec iframe, we set its url to start with the type of the spec file // thus all integration tests are at "/integration/..." // and all component tests are at "/component/..." // After the spec type the url is the relative path to the spec from // the parent folder _of that spec type_. // Example: // root/ // cypress/ // e2e/ // spec.js // Cypress config: // integrationFolder: cypress/e2e // Serving spec.js at url: /integration/spec.js const isIntegrationTestRe = /^integration/ const isComponentTestRe = /^component/ // require.resolve walks the symlinks, which can really change // the results. For example // /tmp/foo is symlink to /private/tmp/foo on Mac // thus resolving /tmp/foo to find /tmp/foo/index.js // can return /private/tmp/foo/index.js // which can really confuse the rest of the code. // Detect this switch by checking if the resolution of absolute // paths moved the prefix // // Good case: no switcheroo, return false // /foo/bar -> /foo/bar/index.js // Bad case: return true // /tmp/foo/bar -> /private/tmp/foo/bar/index.js const checkIfResolveChangedRootFolder = (resolved, initial) => { return path.isAbsolute(resolved) && path.isAbsolute(initial) && !resolved.startsWith(initial) } // real folder path found could be different due to symlinks // For example, folder /tmp/foo on Mac is really /private/tmp/foo const getRealFolderPath = (folder) => { // TODO check if folder is a non-empty string if (!folder) { throw new Error('Expected folder') } return fs.realpathAsync(folder) } const getRelativePathToSpec = (spec) => { switch (false) { // if our file is an integration test // then figure out the absolute path // to it case !isIntegrationTestRe.test(spec): // strip off the integration part return path.relative('integration', spec) case !isComponentTestRe.test(spec): return path.relative('component', spec) default: return spec } } module.exports = { checkIfResolveChangedRootFolder, getRealFolderPath, getRelativePathToSpec, getAbsolutePathToSpec (spec, config) { debug('get absolute path to spec %o', { spec }) const experimentalComponentTestingEnabled = _.get(config, 'resolved.experimentalComponentTesting.value', false) // if our file is an integration test // then figure out the absolute path // to it if (isIntegrationTestRe.test(spec)) { spec = getRelativePathToSpec(spec) // now simply join this with our integrationFolder // which makes it an absolute path const resolved = path.join(config.integrationFolder, spec) debug('resolved path %s', resolved) return resolved } if (experimentalComponentTestingEnabled && isComponentTestRe.test(spec)) { spec = getRelativePathToSpec(spec) const resolved = path.join(config.componentFolder, spec) debug('resolved component spec path %o', { spec, componentFolder: config.componentFolder, resolved }) return resolved } // when isUnitTestRe.test(spec) // // strip off the unit part // spec = path.relative("unit", spec) // // now simply resolve this with our unitFolder // // which makes it an absolute path // path.join(config.unitFolder, spec) debug('returning default path %s', spec) return spec }, }