🏡 index : quine-global/webdriverio.git

import assert from 'node:assert'

describe('smoke test multiremote', () => {
    it('should return value', async () => {
        assert.equal(
            JSON.stringify(await browser.getTitle()),
            JSON.stringify(['Mock Page Title', 'Mock Page Title']))

        if (browser.browserA) {
            assert.equal(await browser.browserB.getTitle(), 'Mock Page Title')
            assert.equal(await browser.browserA.getTitle(), 'Mock Page Title')
        } else {
            assert.equal(await browser.browserC.getTitle(), 'Mock Page Title')
            assert.equal(await browser.browserD.getTitle(), 'Mock Page Title')
        }
    })

    it('should allow to chain element calls', async () => {
        await browser.multiremoteFetch()
        const elem = await $('foo').$('bar')
        await elem.click()
    })

    describe('add customCommands', () => {
        it('should respect promises', async () => {
            browser.addCommand('customFn', async () => {
                const start = Date.now() - 1
                await browser.pause(30)
                return Promise.all([
                    Promise.resolve(Date.now() - start),
                    Promise.resolve(Date.now() - start)
                ])
            })

            const results = await browser.customFn()

            assert.strictEqual(results[0] >= 30, true, `First of [${results}] is less than 30`)
        })

        it('should respect promises if command was added to single browser', async () => {
            await browser.customCommandScenario(Object.keys(browser.instances).length)
            let browserObj = global.browserA,
                anotherBrowserObj  = global.browserB
            if (browser.browserC) {
                browserObj = global.browserC
                anotherBrowserObj  = global.browserD
            }

            browserObj.addCommand('foobar', async () => {
                const title = await browserObj.getTitle()
                return `Title: ${title}`
            })
            assert.strictEqual(await browserObj.foobar(), 'Title: Mock Page Title')
            assert.equal(typeof anotherBrowserObj.foobar, 'undefined')
        })

        it('should throw if promise rejects', async () => {
            browser.addCommand('customFn', () => {
                return Promise.reject(new Error('Boom!'))
            })

            let err = null
            try {
                await browser.customFn()
            } catch (e) {
                err = e
            }
            assert.equal(err.message, 'Boom!')
        })

        it('allows to create custom commands on elements that respects promises', async () => {
            await browser.customCommandScenario(Object.keys(browser.instances).length)
            browser.addCommand('myCustomPromiseCommand', async () => {
                const start = Date.now() - 1
                await browser.pause(30)
                return Promise.resolve(Date.now() - start)
            }, true)
            const elem = await $('elem')
            const results = await elem.myCustomPromiseCommand()

            assert.strictEqual(results[0] >= 30, true, `First of [${results}] is less than 30`)
        })
    })

    describe('overwrite native commands', () => {
        it('should allow to overwrite browser commands', async () => {
            await browser.customCommandScenario(Object.keys(browser.instances).length)
            browser.overwriteCommand('getTitle', async function (origCommand, pre = '') {
                return '' + (await origCommand()).map(result => pre + result)
            })

            assert.equal(await browser.getTitle('Foo '), 'Foo Mock Page Title,Foo Mock Page Title')
        })

        it('should allow to overwrite element commands of a single browser', async () => {
            await browser.customCommandScenario(Object.keys(browser.instances).length)
            let browserObj = global.browserA,
                anotherBrowserObj  = global.browserB
            if (browser.browserC) {
                browserObj = global.browserC
                anotherBrowserObj  = global.browserD
            }

            browserObj.overwriteCommand('getTitle', async function (origCommand) {
                return `Title: ${await origCommand()}`
            })
            assert.equal(await browserObj.getTitle(), 'Title: Mock Page Title')
            assert.equal(await anotherBrowserObj.getTitle(), 'Mock Page Title')
        })

        it('should allow to overwrite element commands', async () => {
            await browser.customCommandScenario(Object.keys(browser.instances).length)
            browser.overwriteCommand('getSize', async function (origCommand, ratio = 1) {
                const { width, height } = await origCommand()
                return { width: width * ratio, height: height * ratio }
            }, true)
            const elem = await $('elem')

            assert.equal(
                JSON.stringify(await elem.getSize(2)),
                JSON.stringify([{ width: 2, height: 4 }, { width: 2, height: 4 }])
            )
        })

        it('should keep the scope', async () => {
            await browser.customCommandScenario(Object.keys(browser.instances).length)
            browser.overwriteCommand('saveRecordingScreen', async function (origCommand, filepath, elem) {
                if (elem) {
                    return await this.execute('1+1') + '-' + elem.instances.map(i => elem[i].selector)
                }
                return origCommand(filepath)
            })

            assert.equal(await browser.saveRecordingScreen(null, await $('body')), '2,2-body,body')
        })

        it('should respect promises - browser', async () => {
            await browser.customCommandScenario(Object.keys(browser.instances).length)
            browser.overwriteCommand('getUrl', async function (origCommand, append = '') {
                return Promise.resolve((await origCommand()).map(result => result + append))
            })

            assert.equal(await browser.getUrl('/foobar'), 'https://mymockpage.com/foobar,https://mymockpage.com/foobar')
        })

        it('should respect promises - element', async () => {
            await browser.customCommandScenario(Object.keys(browser.instances).length)
            browser.overwriteCommand('getHTML', async function (origCommand) {
                return Promise.resolve('' + await origCommand())
            }, true)
            const elem = await $('elem')

            assert.equal(await elem.getHTML(), '2,2')
        })

        it('should throw if promise rejects', async () => {
            await browser.customCommandScenario(Object.keys(browser.instances).length)
            browser.overwriteCommand('deleteCookies', async (origCommand, fail) => {
                await origCommand()
                return fail ? Promise.reject(new Error('error')) : 'result'
            })

            let err = null
            try {
                await browser.deleteCookies(true)
            } catch (e) {
                err = e
            }
            assert.equal(err.message, 'error')
        })
    })
})