Files
cypress/packages/server/lib/open_project.coffee
Brian Mann 31f22c24b2 Issue 1155 (#1272)
* server: move hosts out of CLI args, keep as config only

* server, desktop-gui: fixes #1155 accept blacklistHosts from config CLI, display array on desktop gui settings

* server: pass args.config since its no longer flattened

* server: WIP trying to simplify config management

* server: fixes failing tests and circular refs

* server: fix failing tests with config hosts updates
2018-02-07 16:56:40 -05:00

153 lines
3.7 KiB
CoffeeScript

_ = require("lodash")
Promise = require("bluebird")
files = require("./controllers/files")
config = require("./config")
Project = require("./project")
browsers = require("./browsers")
log = require('./log')
create = ->
openProject = null
specIntervalId = null
relaunchBrowser = null
reset = ->
openProject = null
relaunchBrowser = null
tryToCall = (method) ->
return (args...) ->
if openProject
openProject[method].apply(openProject, args)
else
Promise.resolve(null)
return {
reset: tryToCall("reset")
getConfig: tryToCall("getConfig")
createCiProject: tryToCall("createCiProject")
getRecordKeys: tryToCall("getRecordKeys")
getRuns: tryToCall("getRuns")
requestAccess: tryToCall("requestAccess")
emit: tryToCall("emit")
getProject: -> openProject
launch: (browserName, spec, options = {}) ->
log("launching browser %s spec %s", browserName, spec)
## reset to reset server and socket state because
## of potential domain changes, request buffers, etc
@reset()
.then ->
openProject.ensureSpecUrl(spec)
.then (url) ->
openProject.getConfig()
.then (cfg) ->
options.browsers = cfg.browsers
options.proxyUrl = cfg.proxyUrl
options.userAgent = cfg.userAgent
options.proxyServer = cfg.proxyUrl
options.socketIoRoute = cfg.socketIoRoute
options.chromeWebSecurity = cfg.chromeWebSecurity
options.url = url
automation = openProject.getAutomation()
## use automation middleware if its
## been defined here
if am = options.automationMiddleware
automation.use(am)
do relaunchBrowser = ->
log "launching project in browser #{browserName}"
browsers.open(browserName, options, automation)
getSpecChanges: (options = {}) ->
currentSpecs = null
_.defaults(options, {
onChange: ->
onError: ->
})
sendIfChanged = (specs = []) ->
## dont do anything if the specs haven't changed
return if _.isEqual(specs, currentSpecs)
currentSpecs = specs
options.onChange(specs)
checkForSpecUpdates = =>
if not openProject
return @clearSpecInterval()
get()
.then(sendIfChanged)
.catch(options.onError)
get = ->
openProject.getConfig()
.then (cfg) ->
files.getTestFiles(cfg)
specIntervalId = setInterval(checkForSpecUpdates, 2500)
## immediately check the first time around
checkForSpecUpdates()
clearSpecInterval: ->
if specIntervalId
clearInterval(specIntervalId)
specIntervalId = null
closeBrowser: ->
browsers.close()
closeOpenProjectAndBrowsers: ->
Promise.all([
@closeBrowser()
openProject.close() if openProject
])
.then ->
reset()
return null
close: ->
log "closing opened project"
@clearSpecInterval()
@closeOpenProjectAndBrowsers()
create: (path, args = {}, options = {}) ->
## store the currently open project
openProject = Project(path)
_.defaults(options, {
onReloadBrowser: (url, browser) =>
if relaunchBrowser
relaunchBrowser()
})
options = _.extend {}, args.config, options
browsers.get()
.then (b = []) ->
options.browsers = b
## open the project and return
## the config for the project instance
log("opening project %s", path)
openProject.open(options)
.return(@)
}
module.exports = create()
module.exports.Factory = create