webdriverio/wdio-mocha-framework

View on GitHub
test/hooks.spec.js

Summary

Maintainability
F
2 wks
Test Coverage
import configQPromises from './fixtures/hooks.using.q.promises'
import configNativePromises from './fixtures/hooks.using.native.promises'
import configWDIOCommands from './fixtures/hooks.using.wdio.commands'
import configCustomCommands from './fixtures/hooks.using.custom.commands'
import configAsyncCommands from './fixtures/hooks.using.async.conf'
import { MochaAdapter } from '../lib/adapter'

const specs = ['./test/fixtures/sample.spec.js']
const specs2 = ['./test/fixtures/sample2.spec.js']
const specs3 = ['./test/fixtures/sample3.spec.js']
const specs4 = ['./test/fixtures/sample4.spec.js']
const specs5 = ['./test/fixtures/sample5.spec.js']
const NOOP = () => {}

const WebdriverIO = class {}
WebdriverIO.prototype = {
    /**
     * task of this command is to add 1 so we can have a simple demo test like
     * browser.command(1).should.be.equal(2)
     */
    command: (a) => new Promise((resolve) => {
        setTimeout(() => resolve(a + 1), 2000)
    }),
    pause: (ms = 500) => new Promise((resolve) => {
        setTimeout(() => resolve(), ms)
    }),
    addCommand: (name, fn) => {
        WebdriverIO.prototype[name] = fn
    },
    getPrototype: () => WebdriverIO.prototype
}

process.send = NOOP

describe('MochaAdapter executes hooks using native Promises', () => {
    before(async () => {
        global.browser = new WebdriverIO()
        global.browser.options = {}
        const adapter = new MochaAdapter(0, configNativePromises, specs, configNativePromises.capabilities);
        (await adapter.run()).should.be.equal(0, 'actual test failed')
    })

    describe('before', () => {
        let beforeHook

        before(() => {
            beforeHook = global._wdio.before
        })

        it('should get executed', () => {
            beforeHook.wasExecuted.should.be.true()
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeHook.end - beforeHook.start
            duration.should.be.greaterThan(490)
        })

        it('should contain capabilities and spec parameters', () => {
            beforeHook.args[0].should.be.equal(configNativePromises.capabilities)
            beforeHook.args[1].should.be.equal(specs)
        })
    })

    describe('beforeSuite', () => {
        let beforeSuiteHook

        before(() => {
            beforeSuiteHook = global._wdio.beforeSuite
        })

        it('should get executed', () => {
            beforeSuiteHook.wasExecuted.should.be.true()
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeSuiteHook.end - beforeSuiteHook.start
            duration.should.be.greaterThan(490)
        })

        it('should contain right suite data', () => {
            let suite = beforeSuiteHook.args[0]
            suite.type.should.be.equal('beforeSuite')
            suite.title.should.be.equal('dummy test')
        })
    })

    describe('beforeHook', () => {
        let beforeHookHook

        before(() => {
            beforeHookHook = global._wdio.beforeHook
        })

        it('should get executed', () => {
            beforeHookHook.wasExecuted.should.be.true()
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeHookHook.end - beforeHookHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterHook', () => {
        let afterHookHook

        before(() => {
            afterHookHook = global._wdio.afterHook
        })

        it('should get executed', () => {
            afterHookHook.wasExecuted.should.be.true()
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterHookHook.end - afterHookHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeTest', () => {
        let beforeTestHook

        before(() => {
            beforeTestHook = global._wdio.beforeTest
        })

        it('should get executed', () => {
            beforeTestHook.wasExecuted.should.be.true()
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeTestHook.end - beforeTestHook.start
            duration.should.be.greaterThan(490)
        })

        it('should contain right test data', () => {
            let test = beforeTestHook.args[0]
            test.type.should.be.equal('beforeTest')
            test.title.should.be.equal('sample test')
            test.fullTitle.should.be.equal('dummy test sample test')
            test.parent.should.be.equal('dummy test')
            test.passed.should.be.false()
        })
    })

    describe('beforeCommand', () => {
        let beforeCommandHook

        before(() => {
            beforeCommandHook = global._wdio.beforeCommand
        })

        it('should get executed', () => {
            beforeCommandHook.wasExecuted.should.be.true()
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeCommandHook.end - beforeCommandHook.start
            duration.should.be.greaterThan(490)
        })

        it('should contain right command parameter', () => {
            beforeCommandHook.args[0].should.be.equal('command')
            beforeCommandHook.args[1][0].should.be.equal(1) // input
        })
    })

    describe('afterCommand', () => {
        let afterCommandHook

        before(() => {
            afterCommandHook = global._wdio.afterCommand
        })

        it('should get executed', () => {
            afterCommandHook.wasExecuted.should.be.true()
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterCommandHook.end - afterCommandHook.start
            duration.should.be.greaterThan(490)
        })

        it('should contain right command parameter', () => {
            afterCommandHook.args[0].should.be.equal('command')
            afterCommandHook.args[1][0].should.be.equal(1) // input
            afterCommandHook.args[2].should.be.equal(2) // result
        })
    })

    describe('afterTest', () => {
        let afterTestHook

        before(() => {
            afterTestHook = global._wdio.afterTest
        })

        it('should get executed', () => {
            afterTestHook.wasExecuted.should.be.true()
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterTestHook.end - afterTestHook.start
            duration.should.be.greaterThan(490)
        })

        it('should contain right test data', () => {
            let test = afterTestHook.args[0]
            test.type.should.be.equal('afterTest')
            test.title.should.be.equal('sample test')
            test.fullTitle.should.be.equal('dummy test sample test')
            test.parent.should.be.equal('dummy test')
            test.duration.should.be.greaterThan(2990) // 2000ms command, 2 * 500ms hooks
            test.passed.should.be.true()
        })
    })

    describe('afterSuite', () => {
        let afterSuiteHook

        before(() => {
            afterSuiteHook = global._wdio.afterSuite
        })

        it('should get executed', () => {
            afterSuiteHook.wasExecuted.should.be.true()
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterSuiteHook.end - afterSuiteHook.start
            duration.should.be.greaterThan(490)
        })

        it('should contain right suite data', () => {
            let suite = afterSuiteHook.args[0]
            suite.type.should.be.equal('afterSuite')
            suite.title.should.be.equal('dummy test')
        })
    })

    describe('after', () => {
        let afterHook

        before(() => {
            afterHook = global._wdio.after
        })

        it('should get executed', () => {
            afterHook.wasExecuted.should.be.true()
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterHook.end - afterHook.start
            duration.should.be.greaterThan(490)
        })

        it('should contain capabilities and spec parameters', () => {
            afterHook.args[0].should.be.equal(0)
            afterHook.args[1].should.be.equal(configNativePromises.capabilities)
            afterHook.args[2].should.be.equal(specs)
        })
    })

    after(() => {
        delete global.browser
    })
})

describe('MochaAdapter executes hooks using WDIO commands', () => {
    before(async () => {
        global.browser = new WebdriverIO()
        global.browser.options = {}
        const adapter = new MochaAdapter(0, configWDIOCommands, specs2, configWDIOCommands.capabilities);
        (await adapter.run()).should.be.equal(0, 'actual test failed')
    })

    describe('before', () => {
        let beforeHook

        before(() => {
            beforeHook = global.__wdio.before
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeHook.end - beforeHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeSuite', () => {
        let beforeSuiteHook

        before(() => {
            beforeSuiteHook = global.__wdio.beforeSuite
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeSuiteHook.end - beforeSuiteHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeHook', () => {
        let beforeHookHook

        before(() => {
            beforeHookHook = global.__wdio.beforeHook
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeHookHook.end - beforeHookHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterHook', () => {
        let afterHookHook

        before(() => {
            afterHookHook = global.__wdio.afterHook
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterHookHook.end - afterHookHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeTest', () => {
        let beforeTestHook

        before(() => {
            beforeTestHook = global.__wdio.beforeTest
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeTestHook.end - beforeTestHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeCommand', () => {
        let beforeCommandHook

        before(() => {
            beforeCommandHook = global.__wdio.beforeCommand
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeCommandHook.end - beforeCommandHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterCommand', () => {
        let afterCommandHook

        before(() => {
            afterCommandHook = global.__wdio.afterCommand
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterCommandHook.end - afterCommandHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterTest', () => {
        let afterTestHook

        before(() => {
            afterTestHook = global.__wdio.afterTest
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterTestHook.end - afterTestHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterSuite', () => {
        let afterSuiteHook

        before(() => {
            afterSuiteHook = global.__wdio.afterSuite
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterSuiteHook.end - afterSuiteHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('after', () => {
        let afterHook

        before(() => {
            afterHook = global.__wdio.after
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterHook.end - afterHook.start
            duration.should.be.greaterThan(490)
        })
    })
})

describe('MochaAdapter executes hooks using 3rd party libs (q library)', () => {
    before(async () => {
        global.browser = new WebdriverIO()
        global.browser.options = {}
        const adapter = new MochaAdapter(0, configQPromises, specs3, configQPromises.capabilities);
        (await adapter.run()).should.be.equal(0, 'actual test failed')
    })

    describe('before', () => {
        let beforeHook

        before(() => {
            beforeHook = global.___wdio.before
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeHook.end - beforeHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeSuite', () => {
        let beforeSuiteHook

        before(() => {
            beforeSuiteHook = global.___wdio.beforeSuite
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeSuiteHook.end - beforeSuiteHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeHook', () => {
        let beforeHookHook

        before(() => {
            beforeHookHook = global.___wdio.beforeHook
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeHookHook.end - beforeHookHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterHook', () => {
        let afterHookHook

        before(() => {
            afterHookHook = global.___wdio.afterHook
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterHookHook.end - afterHookHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeTest', () => {
        let beforeTestHook

        before(() => {
            beforeTestHook = global.___wdio.beforeTest
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeTestHook.end - beforeTestHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeCommand', () => {
        let beforeCommandHook

        before(() => {
            beforeCommandHook = global.___wdio.beforeCommand
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeCommandHook.end - beforeCommandHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterCommand', () => {
        let afterCommandHook

        before(() => {
            afterCommandHook = global.___wdio.afterCommand
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterCommandHook.end - afterCommandHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterTest', () => {
        let afterTestHook

        before(() => {
            afterTestHook = global.___wdio.afterTest
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterTestHook.end - afterTestHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterSuite', () => {
        let afterSuiteHook

        before(() => {
            afterSuiteHook = global.___wdio.afterSuite
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterSuiteHook.end - afterSuiteHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('after', () => {
        let afterHook

        before(() => {
            afterHook = global.___wdio.after
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterHook.end - afterHook.start
            duration.should.be.greaterThan(490)
        })
    })
})

describe('MochaAdapter executes custom commands', () => {
    before(async () => {
        global.browser = new WebdriverIO()
        global.browser.options = {}
        const adapter = new MochaAdapter(0, configCustomCommands, specs4, configCustomCommands.capabilities);
        (await adapter.run()).should.be.equal(0, 'actual test failed')
    })

    it('should defer execution until custom wdio command completes', () => {
        let duration = global.____wdio.customWdio.end - global.____wdio.customWdio.start
        duration.should.be.greaterThan(990)
    })

    it('should defer execution until custom wdio promise command resolves', () => {
        let duration = global.____wdio.customWdioPromise.end - global.____wdio.customWdioPromise.start
        duration.should.be.greaterThan(990)
    })

    it('should defer execution until custom native promise command resolves', () => {
        let duration = global.____wdio.customNativePromise.end - global.____wdio.customNativePromise.start
        duration.should.be.greaterThan(990)
    })

    it('should defer execution until custom q promise command resolves', () => {
        let duration = global.____wdio.customQPromise.end - global.____wdio.customQPromise.start
        duration.should.be.greaterThan(990)
    })

    it('should defer execution until custom command wrapping custom wdio command resolves', () => {
        let duration = global.____wdio.customWrapWdio.end - global.____wdio.customWrapWdio.start
        duration.should.be.greaterThan(990)
    })

    it('should defer execution until custom command wrapping custom wdio promise command resolves', () => {
        let duration = global.____wdio.customWrapWdioPromise.end - global.____wdio.customWrapWdioPromise.start
        duration.should.be.greaterThan(990)
    })

    it('should defer execution until custom command wrapping two native promise commands resolves', () => {
        let duration = global.____wdio.customWrapTwoPromises.end - global.____wdio.customWrapTwoPromises.start
        duration.should.be.greaterThan(1990)
    })

    it('should defer execution until custom command wrapping wdio comamnd treated as promise resolves', () => {
        let duration = global.____wdio.customHandleWdioAsPromise.end - global.____wdio.customHandleWdioAsPromise.start
        duration.should.be.greaterThan(1990)
    })
})

describe('MochaAdapter executes async hooks', () => {
    before(async () => {
        global.browser = new WebdriverIO()
        global.browser.options = { sync: false }
        const adapter = new MochaAdapter(0, configAsyncCommands, specs5, configAsyncCommands.capabilities);
        (await adapter.run()).should.be.equal(0, 'actual test failed')
    })

    describe('before', () => {
        let beforeHook

        before(() => {
            beforeHook = global._____wdio.before
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeHook.end - beforeHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeSuite', () => {
        let beforeSuiteHook

        before(() => {
            beforeSuiteHook = global._____wdio.beforeSuite
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeSuiteHook.end - beforeSuiteHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeHook', () => {
        let beforeHookHook

        before(() => {
            beforeHookHook = global._____wdio.beforeHook
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeHookHook.end - beforeHookHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterHook', () => {
        let afterHookHook

        before(() => {
            afterHookHook = global._____wdio.afterHook
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterHookHook.end - afterHookHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('beforeTest', () => {
        let beforeTestHook

        before(() => {
            beforeTestHook = global._____wdio.beforeTest
        })

        it('should defer execution until promise was resolved', () => {
            let duration = beforeTestHook.end - beforeTestHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterTest', () => {
        let afterTestHook

        before(() => {
            afterTestHook = global._____wdio.afterTest
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterTestHook.end - afterTestHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('afterSuite', () => {
        let afterSuiteHook

        before(() => {
            afterSuiteHook = global._____wdio.afterSuite
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterSuiteHook.end - afterSuiteHook.start
            duration.should.be.greaterThan(490)
        })
    })

    describe('after', () => {
        let afterHook

        before(() => {
            afterHook = global._____wdio.after
        })

        it('should defer execution until promise was resolved', () => {
            let duration = afterHook.end - afterHook.start
            duration.should.be.greaterThan(490)
        })
    })
})