UNPKG

@revoloo/cypress6

Version:

Cypress.io end to end testing tool

136 lines (111 loc) 4.06 kB
import Debug from 'debug' import config from '@packages/server/lib/config' import plugins from '@packages/server/lib/plugins' import devServer from '@packages/server/lib/plugins/dev-server' import { ProjectBase } from '@packages/server/lib/project-base' import settings from '@packages/server/lib/util/settings' import specsUtil from '@packages/server/lib/util/specs' import { ServerCt } from './server-ct' import { SpecsStore } from './specs-store' import { options } from '@packages/server/lib/config_options' export * from '@packages/server/lib/project-base' const debug = Debug('cypress:server-ct:project') export class ProjectCt extends ProjectBase<ServerCt> { get projectType () { return 'ct' } /** * override default viewport for component testing * 1. if user specified viewport values in their cypress.json, use those. * 2. otherwise, use 500/500 by default. */ addComponentTestingUniqueDefaults (cfg: Record<string, unknown>) { const defaultViewport = options.reduce<Record<string, number>>((acc, curr) => { if (curr.name === 'viewportHeight') { return { ...acc, viewportHeight: curr.defaultValue as number } } if (curr.name === 'viewportWidth') { return { ...acc, viewportWidth: curr.defaultValue as number } } return acc }, {}) return { ...cfg, viewportHeight: cfg.viewportHeight !== defaultViewport.viewportHeight ? cfg.viewportHeight : 500, viewportWidth: cfg.viewportWidth !== defaultViewport.viewportWidth ? cfg.viewportWidth : 500, } } changeToUrl (targetUrl: string) { this.server.socket.changeToUrl(targetUrl) } open (options) { this._server = new ServerCt() return super.open(options, { onOpen: (cfg) => { const cfgForComponentTesting = this.addComponentTestingUniqueDefaults(cfg) return this._initPlugins(cfgForComponentTesting, options) .then(({ cfg, specsStore }) => { return this.server.open(cfg, specsStore, this, options.onError, options.onWarning) .then(([port, warning]) => { return { cfg, port, warning, } }) }) }, onAfterOpen ({ cfg }) { cfg.proxyServer = cfg.proxyUrl return cfg }, }) } _initPlugins (cfg, options) { // only init plugins with the // allowed config values to // prevent tampering with the // internals and breaking cypress const allowedCfg = config.allowed(cfg) return plugins.init(allowedCfg, { projectRoot: this.projectRoot, configFile: settings.pathToConfigFile(this.projectRoot, options), }) .then((modifiedCfg) => { debug('plugin config yielded: %o', modifiedCfg) const updatedConfig = config.updateWithPluginValues(cfg, modifiedCfg) updatedConfig.componentTesting = true debug('updated config: %o', updatedConfig) return updatedConfig }) .then((modifiedConfig) => { // now that plugins have been initialized, we want to execute // the plugin event for 'dev-server:start' and get back // @ts-ignore - let's not attempt to TS all the things in packages/server return specsUtil.find(modifiedConfig) .filter((spec: Cypress.Cypress['spec']) => { return spec.specType === 'component' }) .then((specs) => { return devServer.start({ specs, config: modifiedConfig }) .then(({ port }) => { modifiedConfig.baseUrl = `http://localhost:${port}` const specsStore = new SpecsStore(cfg) specsStore.watch({ onSpecsChanged: (specs) => { // send new files to dev server devServer.updateSpecs(specs) // send new files to frontend this.server.sendSpecList(specs) }, }) return specsStore.storeSpecFiles() .return({ specsStore, cfg: modifiedConfig, }) }) }) }) } }