diff --git a/spec/jasmine-test-runner.coffee b/spec/jasmine-test-runner.coffee index 5a11530b705..8bf1d3ede69 100644 --- a/spec/jasmine-test-runner.coffee +++ b/spec/jasmine-test-runner.coffee @@ -10,6 +10,16 @@ module.exports = ({logFile, headless, testPaths, buildAtomEnvironment}) -> window[key] = value for key, value of require '../vendor/jasmine' require 'jasmine-tagged' + # Rewrite global jasmine functions to have support for async tests. + # This way packages can create async specs without having to import these from the + # async-spec-helpers file. + global.it = asyncifyJasmineFn global.it, 1 + global.fit = asyncifyJasmineFn global.fit, 1 + global.ffit = asyncifyJasmineFn global.ffit, 1 + global.fffit = asyncifyJasmineFn global.fffit, 1 + global.beforeEach = asyncifyJasmineFn global.beforeEach, 0 + global.afterEach = asyncifyJasmineFn global.afterEach, 0 + # Allow document.title to be assigned in specs without screwing up spec window title documentTitle = null Object.defineProperty document, 'title', @@ -59,6 +69,28 @@ module.exports = ({logFile, headless, testPaths, buildAtomEnvironment}) -> jasmineEnv.execute() promise +asyncifyJasmineFn = (fn, callbackPosition) -> + (args...) -> + if typeof args[callbackPosition] is 'function' + callback = args[callbackPosition] + + args[callbackPosition] = (args...) -> + result = callback.apply this, args + if result instanceof Promise + waitsForPromise(-> result) + + fn.apply this, args + +waitsForPromise = (fn) -> + promise = fn() + + global.waitsFor('spec promise to resolve', (done) -> + promise.then(done, (error) -> + jasmine.getEnv().currentSpec.fail error + done() + ) + ) + disableFocusMethods = -> ['fdescribe', 'ffdescribe', 'fffdescribe', 'fit', 'ffit', 'fffit'].forEach (methodName) -> focusMethod = window[methodName] @@ -124,4 +156,4 @@ buildTerminalReporter = (logFile, resolveWithExitCode) -> new JasmineListReporter(options) else {TerminalReporter} = require 'jasmine-tagged' - new TerminalReporter(options) + new TerminalReporter(options) \ No newline at end of file