From 4b1b3e5384620bb9158c73ba32d9062f5dba1c42 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 11:08:57 +0800 Subject: [PATCH 01/20] feat(postSetup): Unit Test --- e2e.config.js | 17 ++ .../__test__/src/lifecycle/postSetup.test.js | 155 +++++++++++ .../src/lifecycle/postSetupTestData.js | 261 ++++++++++++++++++ packages/tees/src/lifecycle/postSetup.js | 90 +++++- 4 files changed, 514 insertions(+), 9 deletions(-) create mode 100644 e2e.config.js create mode 100644 packages/tees/__test__/src/lifecycle/postSetup.test.js create mode 100644 packages/tees/__test__/src/lifecycle/postSetupTestData.js diff --git a/e2e.config.js b/e2e.config.js new file mode 100644 index 0000000..373b3ca --- /dev/null +++ b/e2e.config.js @@ -0,0 +1,17 @@ +module.exports = { + selectorLabel: 'class', + params: { + projects: { + '${projectName}': { + type: 'uri', + location: 'https://cn.bing.com/', + } + } + }, + lookupConfig({ + config, + tag + }) { + return config.params.projects[tag.project]; + }, +}; diff --git a/packages/tees/__test__/src/lifecycle/postSetup.test.js b/packages/tees/__test__/src/lifecycle/postSetup.test.js new file mode 100644 index 0000000..53fabe3 --- /dev/null +++ b/packages/tees/__test__/src/lifecycle/postSetup.test.js @@ -0,0 +1,155 @@ +const { + caseParams, + caseParamsSkipped, + query, + instance, + caseTitle, + contextParamExpected, + context, + argFn, + execCaseParamExpected +} = require('./postSetupTestData.js'); +const { setup, testPrepare } = require('../../../src/lifecycle/setup.js'); +const { + beforeEachStart, + afterEachEnd, + getExecCaseParams, + execCase, + testCase, + testOnly, +} = require('../../../src/lifecycle/postSetup'); + + +describe('postSetup unit test :', () => { + + it('beforeEachStart, before hook for each case should be called', async () => { + const mockFn = jest.fn(); + + const result = await getExecCaseParams(context); + await beforeEachStart(result.context, mockFn); + + expect(mockFn).toBeCalled(); + expect(JSON.stringify(mockFn.mock.calls[0][0])).toBe(JSON.stringify(contextParamExpected)); + + }); + + + it('afterEachEnd, after hook for each case should be called and afterEachParam.driver.afterHooks should be called', async () => { + const hook1 = jest.fn(); + const hook2 = jest.fn(); + const afterEachParam = { + driver: { + afterHooks: [ + hook1, + hook2 + ] + }, + options: ['accounts'], + } + const afterEachFn = jest.fn(); + + await afterEachEnd(afterEachParam, afterEachFn); + + expect(afterEachFn).toBeCalled(); + expect(hook1).toBeCalled(); + expect(hook2).toBeCalled(); + }); + + it(`getExecCaseParams, should return result`, async () => { + + const result = await getExecCaseParams(context); + + expect(result.caseTitle).toEqual(caseTitle); + expect(JSON.stringify(result.instance.query)).toEqual(JSON.stringify(query)); + expect(JSON.stringify(result.context)).toEqual(JSON.stringify(contextParamExpected)); + }); + + it('execCase, verify the params of global and global.beforeEachStart should be called', async () => { + + const result = await getExecCaseParams(context); + global.getExecCaseParams = jest.fn().mockReturnValue(result); + + global.beforeEachStart = jest.fn(); + + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); + + await execCase(context); + + expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); + expect(global.__context__).toEqual(result.context); + expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); + expect(global.__afterEachCase__).toEqual(result.afterEachCase); + + expect(global.beforeEachStart).toBeCalled(); + expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); + + expect(result.context.driver.run).toBeCalled(); + + }); + + it('execCase, if test only should assign the params of global', async () => { + + context.isOnly = true; + + const result = await getExecCaseParams(context); + global.getExecCaseParams = jest.fn().mockReturnValue(result); + + global.beforeEachStart = jest.fn(); + + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); + + await execCase(context); + + expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); + expect(global.__context__).toEqual(result.context); + expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); + expect(global.__afterEachCase__).toEqual(result.afterEachCase); + + expect(global.beforeEachStart).toBeCalled(); + expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); + + expect(result.context.driver.run).toBeCalled(); + }); + + it(`testCase, global.execCase should be called and the param is equal to ${execCaseParamExpected}`, async () => { + + global.execCase = jest.fn(); + + await testCase(caseParams, argFn); + + expect(global.execCase).toBeCalled(); + expect(global.execCase).toHaveBeenCalledWith(execCaseParamExpected); + + }); + + it(`testCase, global.execCase should not be called`, async () => { + + global.execCase = jest.fn(); + + await testCase(caseParamsSkipped, argFn); + + expect(global.execCase).not.toBeCalled(); + + }); + + it(`testOnly, return global.testCase `, async () => { + + const fn = jest.fn(); + global.test = jest.fn(); + + const result = await testOnly(caseParams, fn); + + expect(global.test).toBeCalled(); + expect(global.test.mock.calls[0][0]).toBe(caseParams); + expect(global.test.mock.calls[0][1]).toBe(fn); + expect(global.test.mock.calls[0][2]).toBe(true); + expect(result).toBe(global.test(caseParams, fn, true)); + + }); + +}); + diff --git a/packages/tees/__test__/src/lifecycle/postSetupTestData.js b/packages/tees/__test__/src/lifecycle/postSetupTestData.js new file mode 100644 index 0000000..7319115 --- /dev/null +++ b/packages/tees/__test__/src/lifecycle/postSetupTestData.js @@ -0,0 +1,261 @@ +//global params +global.afterEach = jest.fn() + +const accounts = { + googleAccount: 'username', + googlePwd: 'password', +}; + +const drivers = ['enzyme', 'puppeteer', 'firefox', 'safari', 'chrome', 'webextGeckodriver']; + +const params = { + projects: { + google: { + type: 'extension', + source: 'source', + driver: { + setting: { + defaultViewport: { + height: 650, + width: 1100, + }, + args: [ + 'args', + ] + } + }, + params: { + brands: { + rc: { + ...accounts, + extension: 'extension', + location: 'location', + }, + } + } + }, + }, + drivers, + levels: ['p0', 'p1', 'p2', 'p3'], + brands: ['rc', 'bt', 'telus', 'att'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], +} + +const defaults = { + drivers, + levels: ['p3'], + brands: ['rc'], + accounts: ['account'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], +} + +global.execGlobal = { + defaults, + params, + selectorLabel: 'selectorLabel', +} + +global.execTags = [['google', + { + drivers, + levels: ['p3'], + brands: ['rc'], + tags: ['salesforce'], + options: ['accounts'], + accounts: ['account'], + }]] +global.execDrivers = defaults.drivers; +global.drivers = defaults.drivers; +global.execModes = [] +global.afterEach = jest.fn(); +global.beforeEachCase = jest.fn(); +global.afterEachCase = jest.fn(); +global.test = jest.fn((caseTitle, func) => func({ + instance: { + query + }, + context: contextParamExpected, + beforeEachCase: global.beforeEachCase, + afterEachCase: global.afterEachCase +})) + +global.test.only = jest.fn((caseTitle, func) => func({ + instance: { + query + }, + context: contextParamExpected, + beforeEachCase: global.beforeEachCase, + afterEachCase: global.afterEachCase +})) + +const caseParams = { + title: 'test postSetup', + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], +} + +const caseParamsSkipped = { + title: 'test postSetup', + tags: [['google'], ['office'], ['salesforce']], + options: [{ + accounts: ['account'], + loginType: 'loginType', + callingType: 'Other Phone', + }], +} + +const query = node => new Query(node, { + label: inputSetting.selectorLabel +}) + +const helper = require('../../../src/lifecycle/helper'); + +const caseTitle = "execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & accounts-account on puppeteer)" + +const instance = helper.getDriverInstance({ drivers: global.drivers, driver: "puppeteer", isSandbox: true }); + +const contextParamExpected = { + logger: helper.generateLogger(caseTitle, global.hasReporter), + get browser() { + return instance.driver.browser; + }, + get page() { + return instance.driver.page; + }, + driver: instance.driver, + options: { + option: { + accounts: [ + "account" + ], + loginType: "loginType" + }, + config: { + type: "extension", + source: "source", + driver: { + setting: { + defaultViewport: { + height: 650, + width: 1100 + }, + args: [ + "args" + ] + } + }, + params: { + brands: { + rc: { + googleAccount: "username", + googlePwd: "password", + extension: "extension", + location: "location" + } + } + } + }, + tag: { + project: "google" + }, + driver: "puppeteer", + modes: [], + isSandbox: true, + isHeadless: false, + isDebugger: false, + isVerbose: false, + isVirtual: false, + isUT: false + } +} + +const argFn = jest.fn(); +let context = { + driver: "puppeteer", + option: { + accounts: ['account'], + loginType: 'loginType', + }, + title: 'execute case', + project: "google", + group: ['levels-p3', + 'brands-rc', + 'tags-salesforce', + 'options-accounts', + 'accounts-account' + ], + caseParams, + tag: { project: 'google' }, + modes: [], + caseTag: ['google', + { + drivers, + levels: ['p3'], + brands: ['rc'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], + accounts: ['account'] + } + ], + isSandbox: true, + isHeadless: false, + isDebugger: false, + isVerbose: false, + isOnly: false, + fn: argFn +} + +const execCaseParamExpected = { + driver: "enzyme", + option: "accounts", + title: 'test postSetup', + project: "google", + group: ['levels-p3', + 'brands-rc', + 'tags-salesforce', + 'options-accounts', + 'accounts-account' + ], + caseParams, + tag: { + "accounts": "account", + "brands": "rc", + "levels": "p3", + "options": "accounts", + "project": "google", + "tags": "salesforce", + }, + modes: [], + caseTag: ['google', + { + drivers, + levels: ['p3'], + brands: ['rc'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], + accounts: ['account'] + } + ], + isSandbox: false, + isHeadless: false, + isDebugger: false, + isVerbose: false, + isOnly: false, + fn: argFn +} + +module.exports = { + caseParams, + caseParamsSkipped, + instance, + query, + caseTitle, + contextParamExpected, + context, + argFn, + execCaseParamExpected +}; + + diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index 8b76a03..4dc8e5e 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -57,10 +57,10 @@ async function afterEachEnd(context, afterHook) { } /** - * execute case with case config and exection config. + * exection config * @param {object} params - execution params. */ -function execCase({ +function getExecCaseParams({ driver, option, title, @@ -106,7 +106,7 @@ function execCase({ option, caseTag, tag - }); + }) const context = { logger: generateLogger(caseTitle, global.hasReporter), driver: instance.driver, @@ -132,8 +132,65 @@ function execCase({ }; // cache serialization options for retry. __optionsMapping__.set(context, JSON.stringify(context.options)); + + return { + caseTitle, + instance, + context, + beforeEachCase, + afterEachCase, + } + +} + +/** + * execute case with case config and exection config. + * @param {object} params - execution params. + */ +function execCase({ + driver, + option, + title, + project, + group, + caseParams, + tag, + modes, + caseTag, + isSandbox, + isHeadless, + isDebugger, + isVerbose, + isOnly, + fn, +}) { /* eslint-disable */ - const func = (async function ({ + + const { + caseTitle, + instance, + context, + beforeEachCase, + afterEachCase, + } = global.getExecCaseParams({ + driver, + option, + title, + project, + group, + caseParams, + tag, + modes, + caseTag, + isSandbox, + isHeadless, + isDebugger, + isVerbose, + isOnly, + fn, + }) + + const func = async function ({ instance, context, beforeEachCase, @@ -143,7 +200,8 @@ function execCase({ global.__context__ = context; global.__beforeEachCase__ = beforeEachCase; global.__afterEachCase__ = afterEachCase; - await beforeEachStart(context, beforeEachCase); + + await global.beforeEachStart(context, beforeEachCase); if (!context.options.isUT) { if (context.options.isSandbox) { const isAuth = context.options.option.isAuth; @@ -153,7 +211,7 @@ function execCase({ await context.driver.goto(context.options.config); } await fn(context); - }).bind(null, { + }.bind(null, { instance, context, beforeEachCase, @@ -209,7 +267,7 @@ function testCase(caseParams, fn, isOnly = false) { if (isSkipped) { break; } - execCase({ + global.execCase({ driver, option, title, @@ -244,7 +302,7 @@ function testSkip(...args) { } function testOnly(...args) { - return testCase(...args, true); + return global.test(...args, true); } function testDescribe(...args) { @@ -258,4 +316,18 @@ global.test = testCase; global.describe = testDescribe; global.describe.skip = _describe.skip; global.test.skip = testSkip; -global.test.only = testOnly; \ No newline at end of file +global.test.only = testOnly; +global.execCase = execCase; +global.beforeEachStart = beforeEachStart; +global.getExecCaseParams = getExecCaseParams; + +module.exports = { + beforeEachStart, + afterEachEnd, + getExecCaseParams, + execCase, + testCase, + testSkip, + testOnly, + testDescribe +}; \ No newline at end of file From 716ac5aace0863a0efdc39da46d5497eb6bb8d88 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 11:21:24 +0800 Subject: [PATCH 02/20] feat(postSetup): Unit Test --- packages/tees/src/lifecycle/postSetup.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index 4dc8e5e..00b9a4c 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -85,6 +85,11 @@ function getExecCaseParams({ keys: Object.keys(templateMappding), values: Object.values(templateMappding), }); + const _option = extendTagOption({ + option, + caseTag, + tag + }) const groupInfos = group.length > 0 ? `in ${group.join(' & ')} ` : ''; const tail = ` => (${project} ${groupInfos}on ${driver})`; const caseTitle = `${name}${tail}`; @@ -102,11 +107,6 @@ function getExecCaseParams({ modes, isSandbox, }); - const _option = extendTagOption({ - option, - caseTag, - tag - }) const context = { logger: generateLogger(caseTitle, global.hasReporter), driver: instance.driver, From 1215798b0366bec37f3150df989712788dcadc45 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 15:09:37 +0800 Subject: [PATCH 03/20] feat(postSetup): Unit Test --- packages/tees/src/lifecycle/postSetup.js | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index aa7876f..958e61d 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -89,18 +89,9 @@ function getExecCaseParams({ option, caseTag, tag - }); + }) const groupInfos = group.length > 0 ? `in ${group.join(' & ')} ` : ''; - const _optionTags = Object.entries(_option) - .reduce((tags, [name, value]) => { - const isAccountTag = ['loginAccount', 'accounts'].includes(name); - if (!isAccountTag) return tags; - return [ - ...tags, - `& ${name}-${value}` - ]; - }, []).join(' '); - const tail = ` => (${project} ${groupInfos}${_optionTags}on ${driver})`; + const tail = ` => (${project} ${groupInfos}on ${driver})`; const caseTitle = `${name}${tail}`; const { config, @@ -116,8 +107,9 @@ function getExecCaseParams({ modes, isSandbox, }); + const context = { - logger: generateLogger(caseTitle, global.hasReporter, isVerbose), + logger: generateLogger(caseTitle, global.hasReporter), driver: instance.driver, get browser() { return context.driver.browser; From fb8285e30c709e396daee5e76c3e8749b1e87413 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 21 Oct 2019 14:47:52 +0800 Subject: [PATCH 04/20] feat(ut):postSetup --- .../__test__/src/lifecycle/postSetup.test.js | 239 ++++++++++++------ .../src/lifecycle/postSetupTestData.js | 16 ++ 2 files changed, 173 insertions(+), 82 deletions(-) diff --git a/packages/tees/__test__/src/lifecycle/postSetup.test.js b/packages/tees/__test__/src/lifecycle/postSetup.test.js index 53fabe3..eb36d8b 100644 --- a/packages/tees/__test__/src/lifecycle/postSetup.test.js +++ b/packages/tees/__test__/src/lifecycle/postSetup.test.js @@ -20,7 +20,7 @@ const { } = require('../../../src/lifecycle/postSetup'); -describe('postSetup unit test :', () => { +describe('postSetup unit test : beforeEachStart', () => { it('beforeEachStart, before hook for each case should be called', async () => { const mockFn = jest.fn(); @@ -33,123 +33,198 @@ describe('postSetup unit test :', () => { }); +}), - it('afterEachEnd, after hook for each case should be called and afterEachParam.driver.afterHooks should be called', async () => { - const hook1 = jest.fn(); - const hook2 = jest.fn(); - const afterEachParam = { - driver: { - afterHooks: [ - hook1, - hook2 - ] - }, - options: ['accounts'], - } - const afterEachFn = jest.fn(); - - await afterEachEnd(afterEachParam, afterEachFn); - - expect(afterEachFn).toBeCalled(); - expect(hook1).toBeCalled(); - expect(hook2).toBeCalled(); - }); + describe('postSetup unit test : afterEachEnd', () => { - it(`getExecCaseParams, should return result`, async () => { + it('afterEachEnd, after hook for each case should be called and afterEachParam.driver.afterHooks should be called', async () => { + const hook1 = jest.fn(); + const hook2 = jest.fn(); + const afterEachParam = { + driver: { + afterHooks: [ + hook1, + hook2 + ] + }, + options: ['accounts'], + } + const afterEachFn = jest.fn(); - const result = await getExecCaseParams(context); + await afterEachEnd(afterEachParam, afterEachFn); - expect(result.caseTitle).toEqual(caseTitle); - expect(JSON.stringify(result.instance.query)).toEqual(JSON.stringify(query)); - expect(JSON.stringify(result.context)).toEqual(JSON.stringify(contextParamExpected)); - }); + expect(afterEachFn).toBeCalled(); + expect(hook1).toBeCalled(); + expect(hook2).toBeCalled(); + }); - it('execCase, verify the params of global and global.beforeEachStart should be called', async () => { + }), - const result = await getExecCaseParams(context); - global.getExecCaseParams = jest.fn().mockReturnValue(result); + describe('postSetup unit test : getExecCaseParams', () => { - global.beforeEachStart = jest.fn(); + it(`getExecCaseParams, should return result`, async () => { - result.context.driver.run = jest.fn(); - result.context.driver.newPage = jest.fn(); - result.context.driver.goto = jest.fn(); + const result = await getExecCaseParams(context); - await execCase(context); + expect(result.caseTitle).toEqual(caseTitle); + expect(JSON.stringify(result.instance.query)).toEqual(JSON.stringify(query)); + expect(JSON.stringify(result.context)).toEqual(JSON.stringify(contextParamExpected)); + }); + }), - expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); - expect(global.__context__).toEqual(result.context); - expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); - expect(global.__afterEachCase__).toEqual(result.afterEachCase); + describe('postSetup unit test : execCase', () => { - expect(global.beforeEachStart).toBeCalled(); - expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); + it('execCase, verify the params of global and global.beforeEachStart should be called', async () => { - expect(result.context.driver.run).toBeCalled(); + let result = await getExecCaseParams(context); - }); + global.getExecCaseParams = jest.fn().mockReturnValue(result); - it('execCase, if test only should assign the params of global', async () => { + global.beforeEachStart = jest.fn(); - context.isOnly = true; + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); - const result = await getExecCaseParams(context); - global.getExecCaseParams = jest.fn().mockReturnValue(result); + await execCase(context); - global.beforeEachStart = jest.fn(); + expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); + expect(global.__context__).toEqual(result.context); + expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); + expect(global.__afterEachCase__).toEqual(result.afterEachCase); - result.context.driver.run = jest.fn(); - result.context.driver.newPage = jest.fn(); - result.context.driver.goto = jest.fn(); + expect(global.beforeEachStart).toBeCalled(); + expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); - await execCase(context); + expect(result.context.driver.run).toBeCalled(); - expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); - expect(global.__context__).toEqual(result.context); - expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); - expect(global.__afterEachCase__).toEqual(result.afterEachCase); + }); - expect(global.beforeEachStart).toBeCalled(); - expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); + it('execCase, if test only should assign the params of global', async () => { - expect(result.context.driver.run).toBeCalled(); - }); + context.isOnly = true; - it(`testCase, global.execCase should be called and the param is equal to ${execCaseParamExpected}`, async () => { + result = await getExecCaseParams(context); + global.getExecCaseParams = jest.fn().mockReturnValue(result); - global.execCase = jest.fn(); + global.beforeEachStart = jest.fn(); - await testCase(caseParams, argFn); + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); - expect(global.execCase).toBeCalled(); - expect(global.execCase).toHaveBeenCalledWith(execCaseParamExpected); + await execCase(context); - }); + expect(result.context.driver.run).toBeCalled(); + }); - it(`testCase, global.execCase should not be called`, async () => { + it('execCase, if isUT is true context.driver.run should not be called', async () => { - global.execCase = jest.fn(); + context.driver = "ut"; - await testCase(caseParamsSkipped, argFn); + result = await getExecCaseParams(context); - expect(global.execCase).not.toBeCalled(); + global.getExecCaseParams = jest.fn().mockReturnValue(result); - }); + global.beforeEachStart = jest.fn(); - it(`testOnly, return global.testCase `, async () => { + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); - const fn = jest.fn(); - global.test = jest.fn(); + await execCase(context); - const result = await testOnly(caseParams, fn); + expect(result.context.driver.run).not.toBeCalled(); - expect(global.test).toBeCalled(); - expect(global.test.mock.calls[0][0]).toBe(caseParams); - expect(global.test.mock.calls[0][1]).toBe(fn); - expect(global.test.mock.calls[0][2]).toBe(true); - expect(result).toBe(global.test(caseParams, fn, true)); + context.driver = "puppeteer"; - }); + }); + + it('execCase, verify the params of global and global.beforeEachStart should be called', async () => { + + context.isHeadless = true; + context.isDebugger = true; + context.isVerbose = true; + + result = await getExecCaseParams(context); + + global.getExecCaseParams = jest.fn().mockReturnValue(result); + + global.beforeEachStart = jest.fn(); + + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); + + await execCase(context); + + expect(result.context.driver.run).toBeCalled(); + + }); + + + it('execCase, if isSandbox is false context.driver.run should not be called', async () => { + + context.isSandbox = false; + + const result = await getExecCaseParams(context); + + global.getExecCaseParams = jest.fn().mockReturnValue(result); -}); + global.beforeEachStart = jest.fn(); + + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); + + await execCase(context); + + expect(result.context.driver.run).not.toBeCalled(); + + }); + + }), + + describe('postSetup unit test : testCase', () => { + + it(`testCase, global.execCase should be called and the param is equal to ${execCaseParamExpected}`, async () => { + + global.execCase = jest.fn(); + + await testCase(caseParams, argFn); + + expect(global.execCase).toBeCalled(); + expect(global.execCase).toHaveBeenCalledWith(execCaseParamExpected); + + }); + + it(`testCase, global.execCase should not be called`, async () => { + + global.execCase = jest.fn(); + + await testCase(caseParamsSkipped, argFn); + + expect(global.execCase).not.toBeCalled(); + + }); + }), + describe('postSetup unit test : testCase', () => { + + it(`testOnly, return global.testCase `, async () => { + + const fn = jest.fn(); + global.test = jest.fn(); + + const result = await testOnly(caseParams, fn); + + expect(global.test).toBeCalled(); + expect(global.test.mock.calls[0][0]).toBe(caseParams); + expect(global.test.mock.calls[0][1]).toBe(fn); + expect(global.test.mock.calls[0][2]).toBe(true); + expect(result).toBe(global.test(caseParams, fn, true)); + + }); + + + }); diff --git a/packages/tees/__test__/src/lifecycle/postSetupTestData.js b/packages/tees/__test__/src/lifecycle/postSetupTestData.js index 7319115..0dadf83 100644 --- a/packages/tees/__test__/src/lifecycle/postSetupTestData.js +++ b/packages/tees/__test__/src/lifecycle/postSetupTestData.js @@ -114,8 +114,24 @@ const helper = require('../../../src/lifecycle/helper'); const caseTitle = "execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & accounts-account on puppeteer)" +const mockProcessArgv = () => process.argv = ['/usr/local/bin/node', + '/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/node_modules/jest/bin/jest.js', + '--config={"verbose":true,"testMatch":["/packages/tees/templates/exampleSpec.js"],"testPathIgnorePatterns":[],"setupFiles":["/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/src/lifecycle/setup.js"],"setupFilesAfterEnv":["/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/src/lifecycle/postSetup.js"],"globals":{"hasReporter":false,"configPath":"/Users/lena.chen/RingCentral/tee-ut/tees/e2e.config.js","retryTimes":0,"execTags":[],"execModes":[],"execDrivers":["puppeteer"],"execGlobal":{"selectorLabel":"class","params":{"drivers":["puppeteer"],"projects":{"${projectName}":{"type":"uri","location":"https://cn.bing.com/"}}},"exec":{"drivers":["puppeteer"]},"defaults":{"drivers":["puppeteer"]}},"execDefaults":{"browsers":{}}},"globalSetup":"tees-environment/setup","globalTeardown":"tees-environment/teardown","testEnvironment":"tees-environment","transform":{"^.+\\\\.(jsx|js)$":"babel-jest"},"testRunner":"jest-circus/runner"}', + '--forceExit', + '--no-cache', + '--detectOpenHandles']; + +mockProcessArgv(); + const instance = helper.getDriverInstance({ drivers: global.drivers, driver: "puppeteer", isSandbox: true }); +let driversObj = {}; +global.drivers.forEach(element => { + driversObj[element] = instance; +}); + +global.drivers = driversObj; + const contextParamExpected = { logger: helper.generateLogger(caseTitle, global.hasReporter), get browser() { From 119221de2ab63d5319f28b9f20ce4495c5f9b3bf Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 21 Oct 2019 16:30:39 +0800 Subject: [PATCH 05/20] feat(ut):postSetup --- packages/tees/__test__/src/lifecycle/postSetup.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tees/__test__/src/lifecycle/postSetup.test.js b/packages/tees/__test__/src/lifecycle/postSetup.test.js index eb36d8b..8af702a 100644 --- a/packages/tees/__test__/src/lifecycle/postSetup.test.js +++ b/packages/tees/__test__/src/lifecycle/postSetup.test.js @@ -208,7 +208,7 @@ describe('postSetup unit test : beforeEachStart', () => { }); }), - describe('postSetup unit test : testCase', () => { + describe('postSetup unit test : testOnly', () => { it(`testOnly, return global.testCase `, async () => { From 1a64071c89e386957311df1fb40f259cfa223bbc Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 21 Oct 2019 17:04:24 +0800 Subject: [PATCH 06/20] feat(ut):postSetup --- .../__test__/src/lifecycle/postSetupTestData.js | 3 +-- packages/tees/src/lifecycle/postSetup.js | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/tees/__test__/src/lifecycle/postSetupTestData.js b/packages/tees/__test__/src/lifecycle/postSetupTestData.js index 0dadf83..debeb82 100644 --- a/packages/tees/__test__/src/lifecycle/postSetupTestData.js +++ b/packages/tees/__test__/src/lifecycle/postSetupTestData.js @@ -199,8 +199,7 @@ let context = { group: ['levels-p3', 'brands-rc', 'tags-salesforce', - 'options-accounts', - 'accounts-account' + 'options-accounts' ], caseParams, tag: { project: 'google' }, diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index 958e61d..90311e8 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -91,7 +91,16 @@ function getExecCaseParams({ tag }) const groupInfos = group.length > 0 ? `in ${group.join(' & ')} ` : ''; - const tail = ` => (${project} ${groupInfos}on ${driver})`; + const _optionTags = Object.entries(_option) + .reduce((tags, [name, value]) => { + const isAccountTag = ['loginAccount', 'accounts'].includes(name); + if (!isAccountTag) return tags; + return [ + ...tags, + `& ${name}-${value}` + ]; + }, []).join(' '); + const tail = ` => (${project} ${groupInfos}${_optionTags} on ${driver})`; const caseTitle = `${name}${tail}`; const { config, @@ -109,7 +118,7 @@ function getExecCaseParams({ }); const context = { - logger: generateLogger(caseTitle, global.hasReporter), + logger: generateLogger(caseTitle, global.hasReporter, isVerbose), driver: instance.driver, get browser() { return context.driver.browser; @@ -191,7 +200,7 @@ function execCase({ fn, }) - const func = async function ({ + const func = (async function ({ instance, context, beforeEachCase, @@ -212,7 +221,7 @@ function execCase({ await context.driver.goto(context.options.config); } await fn(context); - }.bind(null, { + }).bind(null, { instance, context, beforeEachCase, From ad1749277507adf5ca4e6d36a9ecaa45400aacf4 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 11:08:57 +0800 Subject: [PATCH 07/20] feat(postSetup): Unit Test --- e2e.config.js | 17 ++ .../__test__/src/lifecycle/postSetup.test.js | 155 +++++++++++ .../src/lifecycle/postSetupTestData.js | 261 ++++++++++++++++++ packages/tees/src/lifecycle/postSetup.js | 89 +++++- 4 files changed, 514 insertions(+), 8 deletions(-) create mode 100644 e2e.config.js create mode 100644 packages/tees/__test__/src/lifecycle/postSetup.test.js create mode 100644 packages/tees/__test__/src/lifecycle/postSetupTestData.js diff --git a/e2e.config.js b/e2e.config.js new file mode 100644 index 0000000..373b3ca --- /dev/null +++ b/e2e.config.js @@ -0,0 +1,17 @@ +module.exports = { + selectorLabel: 'class', + params: { + projects: { + '${projectName}': { + type: 'uri', + location: 'https://cn.bing.com/', + } + } + }, + lookupConfig({ + config, + tag + }) { + return config.params.projects[tag.project]; + }, +}; diff --git a/packages/tees/__test__/src/lifecycle/postSetup.test.js b/packages/tees/__test__/src/lifecycle/postSetup.test.js new file mode 100644 index 0000000..53fabe3 --- /dev/null +++ b/packages/tees/__test__/src/lifecycle/postSetup.test.js @@ -0,0 +1,155 @@ +const { + caseParams, + caseParamsSkipped, + query, + instance, + caseTitle, + contextParamExpected, + context, + argFn, + execCaseParamExpected +} = require('./postSetupTestData.js'); +const { setup, testPrepare } = require('../../../src/lifecycle/setup.js'); +const { + beforeEachStart, + afterEachEnd, + getExecCaseParams, + execCase, + testCase, + testOnly, +} = require('../../../src/lifecycle/postSetup'); + + +describe('postSetup unit test :', () => { + + it('beforeEachStart, before hook for each case should be called', async () => { + const mockFn = jest.fn(); + + const result = await getExecCaseParams(context); + await beforeEachStart(result.context, mockFn); + + expect(mockFn).toBeCalled(); + expect(JSON.stringify(mockFn.mock.calls[0][0])).toBe(JSON.stringify(contextParamExpected)); + + }); + + + it('afterEachEnd, after hook for each case should be called and afterEachParam.driver.afterHooks should be called', async () => { + const hook1 = jest.fn(); + const hook2 = jest.fn(); + const afterEachParam = { + driver: { + afterHooks: [ + hook1, + hook2 + ] + }, + options: ['accounts'], + } + const afterEachFn = jest.fn(); + + await afterEachEnd(afterEachParam, afterEachFn); + + expect(afterEachFn).toBeCalled(); + expect(hook1).toBeCalled(); + expect(hook2).toBeCalled(); + }); + + it(`getExecCaseParams, should return result`, async () => { + + const result = await getExecCaseParams(context); + + expect(result.caseTitle).toEqual(caseTitle); + expect(JSON.stringify(result.instance.query)).toEqual(JSON.stringify(query)); + expect(JSON.stringify(result.context)).toEqual(JSON.stringify(contextParamExpected)); + }); + + it('execCase, verify the params of global and global.beforeEachStart should be called', async () => { + + const result = await getExecCaseParams(context); + global.getExecCaseParams = jest.fn().mockReturnValue(result); + + global.beforeEachStart = jest.fn(); + + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); + + await execCase(context); + + expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); + expect(global.__context__).toEqual(result.context); + expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); + expect(global.__afterEachCase__).toEqual(result.afterEachCase); + + expect(global.beforeEachStart).toBeCalled(); + expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); + + expect(result.context.driver.run).toBeCalled(); + + }); + + it('execCase, if test only should assign the params of global', async () => { + + context.isOnly = true; + + const result = await getExecCaseParams(context); + global.getExecCaseParams = jest.fn().mockReturnValue(result); + + global.beforeEachStart = jest.fn(); + + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); + + await execCase(context); + + expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); + expect(global.__context__).toEqual(result.context); + expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); + expect(global.__afterEachCase__).toEqual(result.afterEachCase); + + expect(global.beforeEachStart).toBeCalled(); + expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); + + expect(result.context.driver.run).toBeCalled(); + }); + + it(`testCase, global.execCase should be called and the param is equal to ${execCaseParamExpected}`, async () => { + + global.execCase = jest.fn(); + + await testCase(caseParams, argFn); + + expect(global.execCase).toBeCalled(); + expect(global.execCase).toHaveBeenCalledWith(execCaseParamExpected); + + }); + + it(`testCase, global.execCase should not be called`, async () => { + + global.execCase = jest.fn(); + + await testCase(caseParamsSkipped, argFn); + + expect(global.execCase).not.toBeCalled(); + + }); + + it(`testOnly, return global.testCase `, async () => { + + const fn = jest.fn(); + global.test = jest.fn(); + + const result = await testOnly(caseParams, fn); + + expect(global.test).toBeCalled(); + expect(global.test.mock.calls[0][0]).toBe(caseParams); + expect(global.test.mock.calls[0][1]).toBe(fn); + expect(global.test.mock.calls[0][2]).toBe(true); + expect(result).toBe(global.test(caseParams, fn, true)); + + }); + +}); + diff --git a/packages/tees/__test__/src/lifecycle/postSetupTestData.js b/packages/tees/__test__/src/lifecycle/postSetupTestData.js new file mode 100644 index 0000000..7319115 --- /dev/null +++ b/packages/tees/__test__/src/lifecycle/postSetupTestData.js @@ -0,0 +1,261 @@ +//global params +global.afterEach = jest.fn() + +const accounts = { + googleAccount: 'username', + googlePwd: 'password', +}; + +const drivers = ['enzyme', 'puppeteer', 'firefox', 'safari', 'chrome', 'webextGeckodriver']; + +const params = { + projects: { + google: { + type: 'extension', + source: 'source', + driver: { + setting: { + defaultViewport: { + height: 650, + width: 1100, + }, + args: [ + 'args', + ] + } + }, + params: { + brands: { + rc: { + ...accounts, + extension: 'extension', + location: 'location', + }, + } + } + }, + }, + drivers, + levels: ['p0', 'p1', 'p2', 'p3'], + brands: ['rc', 'bt', 'telus', 'att'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], +} + +const defaults = { + drivers, + levels: ['p3'], + brands: ['rc'], + accounts: ['account'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], +} + +global.execGlobal = { + defaults, + params, + selectorLabel: 'selectorLabel', +} + +global.execTags = [['google', + { + drivers, + levels: ['p3'], + brands: ['rc'], + tags: ['salesforce'], + options: ['accounts'], + accounts: ['account'], + }]] +global.execDrivers = defaults.drivers; +global.drivers = defaults.drivers; +global.execModes = [] +global.afterEach = jest.fn(); +global.beforeEachCase = jest.fn(); +global.afterEachCase = jest.fn(); +global.test = jest.fn((caseTitle, func) => func({ + instance: { + query + }, + context: contextParamExpected, + beforeEachCase: global.beforeEachCase, + afterEachCase: global.afterEachCase +})) + +global.test.only = jest.fn((caseTitle, func) => func({ + instance: { + query + }, + context: contextParamExpected, + beforeEachCase: global.beforeEachCase, + afterEachCase: global.afterEachCase +})) + +const caseParams = { + title: 'test postSetup', + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], +} + +const caseParamsSkipped = { + title: 'test postSetup', + tags: [['google'], ['office'], ['salesforce']], + options: [{ + accounts: ['account'], + loginType: 'loginType', + callingType: 'Other Phone', + }], +} + +const query = node => new Query(node, { + label: inputSetting.selectorLabel +}) + +const helper = require('../../../src/lifecycle/helper'); + +const caseTitle = "execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & accounts-account on puppeteer)" + +const instance = helper.getDriverInstance({ drivers: global.drivers, driver: "puppeteer", isSandbox: true }); + +const contextParamExpected = { + logger: helper.generateLogger(caseTitle, global.hasReporter), + get browser() { + return instance.driver.browser; + }, + get page() { + return instance.driver.page; + }, + driver: instance.driver, + options: { + option: { + accounts: [ + "account" + ], + loginType: "loginType" + }, + config: { + type: "extension", + source: "source", + driver: { + setting: { + defaultViewport: { + height: 650, + width: 1100 + }, + args: [ + "args" + ] + } + }, + params: { + brands: { + rc: { + googleAccount: "username", + googlePwd: "password", + extension: "extension", + location: "location" + } + } + } + }, + tag: { + project: "google" + }, + driver: "puppeteer", + modes: [], + isSandbox: true, + isHeadless: false, + isDebugger: false, + isVerbose: false, + isVirtual: false, + isUT: false + } +} + +const argFn = jest.fn(); +let context = { + driver: "puppeteer", + option: { + accounts: ['account'], + loginType: 'loginType', + }, + title: 'execute case', + project: "google", + group: ['levels-p3', + 'brands-rc', + 'tags-salesforce', + 'options-accounts', + 'accounts-account' + ], + caseParams, + tag: { project: 'google' }, + modes: [], + caseTag: ['google', + { + drivers, + levels: ['p3'], + brands: ['rc'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], + accounts: ['account'] + } + ], + isSandbox: true, + isHeadless: false, + isDebugger: false, + isVerbose: false, + isOnly: false, + fn: argFn +} + +const execCaseParamExpected = { + driver: "enzyme", + option: "accounts", + title: 'test postSetup', + project: "google", + group: ['levels-p3', + 'brands-rc', + 'tags-salesforce', + 'options-accounts', + 'accounts-account' + ], + caseParams, + tag: { + "accounts": "account", + "brands": "rc", + "levels": "p3", + "options": "accounts", + "project": "google", + "tags": "salesforce", + }, + modes: [], + caseTag: ['google', + { + drivers, + levels: ['p3'], + brands: ['rc'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], + accounts: ['account'] + } + ], + isSandbox: false, + isHeadless: false, + isDebugger: false, + isVerbose: false, + isOnly: false, + fn: argFn +} + +module.exports = { + caseParams, + caseParamsSkipped, + instance, + query, + caseTitle, + contextParamExpected, + context, + argFn, + execCaseParamExpected +}; + + diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index a713fa0..706eb3b 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -57,10 +57,10 @@ async function afterEachEnd(context, afterHook) { } /** - * execute case with case config and exection config. + * exection config * @param {object} params - execution params. */ -function execCase({ +function getExecCaseParams({ driver, option, title, @@ -116,6 +116,7 @@ function execCase({ modes, isSandbox, }); + const context = { logger: generateLogger(caseTitle, global.hasReporter, isVerbose), driver: instance.driver, @@ -141,8 +142,65 @@ function execCase({ }; // cache serialization options for retry. __optionsMapping__.set(context, JSON.stringify(context.options)); + + return { + caseTitle, + instance, + context, + beforeEachCase, + afterEachCase, + } + +} + +/** + * execute case with case config and exection config. + * @param {object} params - execution params. + */ +function execCase({ + driver, + option, + title, + project, + group, + caseParams, + tag, + modes, + caseTag, + isSandbox, + isHeadless, + isDebugger, + isVerbose, + isOnly, + fn, +}) { /* eslint-disable */ - const func = (async function ({ + + const { + caseTitle, + instance, + context, + beforeEachCase, + afterEachCase, + } = global.getExecCaseParams({ + driver, + option, + title, + project, + group, + caseParams, + tag, + modes, + caseTag, + isSandbox, + isHeadless, + isDebugger, + isVerbose, + isOnly, + fn, + }) + + const func = async function ({ instance, context, beforeEachCase, @@ -152,7 +210,8 @@ function execCase({ global.__context__ = context; global.__beforeEachCase__ = beforeEachCase; global.__afterEachCase__ = afterEachCase; - await beforeEachStart(context, beforeEachCase); + + await global.beforeEachStart(context, beforeEachCase); if (!context.options.isUT) { if (context.options.isSandbox) { const isAuth = context.options.option.isAuth; @@ -162,7 +221,7 @@ function execCase({ await context.driver.goto(context.options.config); } await fn(context); - }).bind(null, { + }.bind(null, { instance, context, beforeEachCase, @@ -218,7 +277,7 @@ function testCase(caseParams, fn, isOnly = false) { if (isSkipped) { break; } - execCase({ + global.execCase({ driver, option, title, @@ -253,7 +312,7 @@ function testSkip(...args) { } function testOnly(...args) { - return testCase(...args, true); + return global.test(...args, true); } function testDescribe(...args) { @@ -267,4 +326,18 @@ global.test = testCase; global.describe = testDescribe; global.describe.skip = _describe.skip; global.test.skip = testSkip; -global.test.only = testOnly; \ No newline at end of file +global.test.only = testOnly; +global.execCase = execCase; +global.beforeEachStart = beforeEachStart; +global.getExecCaseParams = getExecCaseParams; + +module.exports = { + beforeEachStart, + afterEachEnd, + getExecCaseParams, + execCase, + testCase, + testSkip, + testOnly, + testDescribe +}; \ No newline at end of file From 789b2ff9d4b0d828131a084e5d1c7d24f17532f9 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 11:21:24 +0800 Subject: [PATCH 08/20] feat(postSetup): Unit Test --- packages/tees/src/lifecycle/postSetup.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index 706eb3b..750687d 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -89,7 +89,11 @@ function getExecCaseParams({ option, caseTag, tag +<<<<<<< HEAD }); +======= + }) +>>>>>>> feat(postSetup): Unit Test const groupInfos = group.length > 0 ? `in ${group.join(' & ')} ` : ''; const _optionTags = Object.entries(_option) .reduce((tags, [name, value]) => { @@ -116,7 +120,6 @@ function getExecCaseParams({ modes, isSandbox, }); - const context = { logger: generateLogger(caseTitle, global.hasReporter, isVerbose), driver: instance.driver, From ba16a86c3abbeb3eee6908d9d1a412ac14da3161 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 15:09:37 +0800 Subject: [PATCH 09/20] feat(postSetup): Unit Test --- packages/tees/src/lifecycle/postSetup.js | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index 750687d..085ca6e 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -89,22 +89,9 @@ function getExecCaseParams({ option, caseTag, tag -<<<<<<< HEAD }); -======= - }) ->>>>>>> feat(postSetup): Unit Test const groupInfos = group.length > 0 ? `in ${group.join(' & ')} ` : ''; - const _optionTags = Object.entries(_option) - .reduce((tags, [name, value]) => { - const isAccountTag = ['loginAccount', 'accounts'].includes(name); - if (!isAccountTag) return tags; - return [ - ...tags, - `& ${name}-${value}` - ]; - }, []).join(' '); - const tail = ` => (${project} ${groupInfos}${_optionTags}on ${driver})`; + const tail = ` => (${project} ${groupInfos}on ${driver})`; const caseTitle = `${name}${tail}`; const { config, @@ -120,8 +107,9 @@ function getExecCaseParams({ modes, isSandbox, }); + const context = { - logger: generateLogger(caseTitle, global.hasReporter, isVerbose), + logger: generateLogger(caseTitle, global.hasReporter), driver: instance.driver, get browser() { return context.driver.browser; From a8c7564605ce1d1e47c91de6ee8362e0ebf5c68e Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 4 Nov 2019 09:32:02 +0800 Subject: [PATCH 10/20] feat(postSetup): Unit Test --- .../__test__/src/lifecycle/postSetup.test.js | 109 +++++++++++++++--- .../src/lifecycle/postSetupTestData.js | 90 +++++++-------- 2 files changed, 139 insertions(+), 60 deletions(-) diff --git a/packages/tees/__test__/src/lifecycle/postSetup.test.js b/packages/tees/__test__/src/lifecycle/postSetup.test.js index fa9f1af..f2fb5bf 100644 --- a/packages/tees/__test__/src/lifecycle/postSetup.test.js +++ b/packages/tees/__test__/src/lifecycle/postSetup.test.js @@ -35,20 +35,24 @@ describe('postSetup unit test : beforeEachStart', () => { }), describe('postSetup unit test : afterEachEnd', () => { + const hook1 = jest.fn(); + const hook2 = jest.fn(); + const close = jest.fn(); + const afterEachParam = { + driver: { + afterHooks: [ + hook1, + hook2 + ], + close + }, + options: { + isSandbox: true + }, + } + const afterEachFn = jest.fn(); it('afterEachEnd, after hook for each case should be called and afterEachParam.driver.afterHooks should be called', async () => { - const hook1 = jest.fn(); - const hook2 = jest.fn(); - const afterEachParam = { - driver: { - afterHooks: [ - hook1, - hook2 - ] - }, - options: ['accounts'], - } - const afterEachFn = jest.fn(); await afterEachEnd(afterEachParam, afterEachFn); @@ -57,6 +61,20 @@ describe('postSetup unit test : beforeEachStart', () => { expect(hook2).toBeCalled(); }); + it('afterEachEnd, after hook for each case should be called and afterEachParam.driver.afterHooks should be called', async () => { + afterEachParam.options.isSandbox = true; + + await afterEachEnd(afterEachParam, afterEachFn); + expect(close).toBeCalled(); + }); + + it('afterEachEnd, when afterHooks arg is null', async () => { + afterEachParam.driver.afterHooks = null; + + await afterEachEnd(afterEachParam, afterEachFn).catch(e => expect(String(e)).toMatch('TypeError: driver.afterHooks is not iterable')); + + }); + }), describe('postSetup unit test : getExecCaseParams', () => { @@ -69,6 +87,27 @@ describe('postSetup unit test : beforeEachStart', () => { expect(JSON.stringify(result.instance.query)).toEqual(JSON.stringify(query)); expect(JSON.stringify(result.context)).toEqual(JSON.stringify(contextParamExpected)); }); + + it(`getExecCaseParams, when case tags don't include loginAccount`, async () => { + context.option = { loginAccount: 'loginAccount' }; + const caseTitleNoLoginAccount = `execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & loginAccount-loginAccount on puppeteer)`; + contextParamExpected.options.option = context.option; + + const result = await getExecCaseParams(context); + + expect(result.caseTitle).toEqual(caseTitleNoLoginAccount); + expect(result.context.options.option).toEqual(context.option); + }); + + it(`getExecCaseParams, when case tags don't include account`, async () => { + context.option = { accounts: ['account'] }; + const caseTitleNoAccounts = `execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & accounts-account on puppeteer)`; + + const result = await getExecCaseParams(context); + + expect(result.caseTitle).toEqual(caseTitleNoAccounts); + expect(result.context.options.option).toEqual(context.option); + }); }), describe('postSetup unit test : execCase', () => { @@ -189,24 +228,66 @@ describe('postSetup unit test : beforeEachStart', () => { it(`testCase, global.execCase should be called and the param is equal to ${execCaseParamExpected}`, async () => { global.execCase = jest.fn(); - await testCase(caseParams, argFn); expect(global.execCase).toBeCalled(); expect(global.execCase).toHaveBeenCalledWith(execCaseParamExpected); + expect(global.execCase.mock.instances.length).toBe(6); + }); + + it(`testCase, the param isOnly is true and global.execCase should be called `, async () => { + + global.execCase = jest.fn(); + await testCase(caseParams, argFn, true); + + expect(global.execCase).toBeCalled(); + expect(global.execCase.mock.calls[0][0].isOnly).toEqual(true); }); - it(`testCase, global.execCase should not be called`, async () => { + it(`testCase, when modes is not null and global.execCase should be called`, async () => { global.execCase = jest.fn(); + caseParams.modes = ['headless']; + await testCase(caseParams, argFn); + + expect(global.execCase).toBeCalled(); + expect(global.execCase.mock.calls[0][0].modes).toEqual([...caseParams.modes, ...global.execModes]); + + }); + + it(`testCase, when tags is [] and global.execCase should be called`, async () => { + + global.execCase = jest.fn(); + caseParams.tags = []; + + await testCase(caseParams, argFn); + + expect(global.execCase).not.toBeCalled(); + }); + + it(`testCase, when options is [{}] and global.execCase should be called`, async () => { + + global.execCase = jest.fn(); + caseParams.options = [{}]; + + await testCase(caseParams, argFn); + + expect(global.execCase).not.toBeCalled(); + }); + + it(`testCase, isSkiped is true and global.execCase should not be called`, async () => { + + global.execCase = jest.fn(); await testCase(caseParamsSkipped, argFn); expect(global.execCase).not.toBeCalled(); }); + }), + describe('postSetup unit test : testOnly', () => { it(`testOnly, return global.testCase `, async () => { diff --git a/packages/tees/__test__/src/lifecycle/postSetupTestData.js b/packages/tees/__test__/src/lifecycle/postSetupTestData.js index debeb82..8a08c9f 100644 --- a/packages/tees/__test__/src/lifecycle/postSetupTestData.js +++ b/packages/tees/__test__/src/lifecycle/postSetupTestData.js @@ -94,6 +94,7 @@ const caseParams = { title: 'test postSetup', tags: [['google'], ['office'], ['salesforce']], options: ['accounts'], + modes: [] } const caseParamsSkipped = { @@ -101,7 +102,7 @@ const caseParamsSkipped = { tags: [['google'], ['office'], ['salesforce']], options: [{ accounts: ['account'], - loginType: 'loginType', + loginAccount: 'loginAccount', callingType: 'Other Phone', }], } @@ -112,11 +113,11 @@ const query = node => new Query(node, { const helper = require('../../../src/lifecycle/helper'); -const caseTitle = "execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & accounts-account on puppeteer)" +const caseTitle = "execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & accounts-account & loginAccount-loginAccount on puppeteer)" const mockProcessArgv = () => process.argv = ['/usr/local/bin/node', - '/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/node_modules/jest/bin/jest.js', - '--config={"verbose":true,"testMatch":["/packages/tees/templates/exampleSpec.js"],"testPathIgnorePatterns":[],"setupFiles":["/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/src/lifecycle/setup.js"],"setupFilesAfterEnv":["/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/src/lifecycle/postSetup.js"],"globals":{"hasReporter":false,"configPath":"/Users/lena.chen/RingCentral/tee-ut/tees/e2e.config.js","retryTimes":0,"execTags":[],"execModes":[],"execDrivers":["puppeteer"],"execGlobal":{"selectorLabel":"class","params":{"drivers":["puppeteer"],"projects":{"${projectName}":{"type":"uri","location":"https://cn.bing.com/"}}},"exec":{"drivers":["puppeteer"]},"defaults":{"drivers":["puppeteer"]}},"execDefaults":{"browsers":{}}},"globalSetup":"tees-environment/setup","globalTeardown":"tees-environment/teardown","testEnvironment":"tees-environment","transform":{"^.+\\\\.(jsx|js)$":"babel-jest"},"testRunner":"jest-circus/runner"}', + '../../../node_modules/jest/bin/jest.js', + '--config={"verbose":true,"testMatch":["/packages/tees/templates/exampleSpec.js"],"testPathIgnorePatterns":[],"setupFiles":["/packages/tees/src/lifecycle/setup.js"],"setupFilesAfterEnv":["/packages/tees/src/lifecycle/postSetup.js"],"globals":{"hasReporter":false,"configPath":"../../../../tees/e2e.config.js","retryTimes":0,"execTags":[],"execModes":[],"execDrivers":["puppeteer"],"execGlobal":{"selectorLabel":"class","params":{"drivers":["puppeteer"],"projects":{"${projectName}":{"type":"uri","location":"https://cn.bing.com/"}}},"exec":{"drivers":["puppeteer"]},"defaults":{"drivers":["puppeteer"]}},"execDefaults":{"browsers":{}}},"globalSetup":"tees-environment/setup","globalTeardown":"tees-environment/teardown","testEnvironment":"tees-environment","transform":{"^.+\\\\.(jsx|js)$":"babel-jest"},"testRunner":"jest-circus/runner"}', '--forceExit', '--no-cache', '--detectOpenHandles']; @@ -132,7 +133,42 @@ global.drivers.forEach(element => { global.drivers = driversObj; -const contextParamExpected = { +const argFn = jest.fn(); +let context = { + driver: "puppeteer", + option: { + accounts: ['account'], + loginAccount: 'loginAccount', + }, + title: 'execute case', + project: "google", + group: ['levels-p3', + 'brands-rc', + 'tags-salesforce', + 'options-accounts' + ], + caseParams, + tag: { project: 'google' }, + modes: [], + caseTag: ['google', + { + drivers, + levels: ['p3'], + brands: ['rc'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], + accounts: ['account'] + } + ], + isSandbox: true, + isHeadless: false, + isDebugger: false, + isVerbose: false, + isOnly: false, + fn: argFn +} + +let contextParamExpected = { logger: helper.generateLogger(caseTitle, global.hasReporter), get browser() { return instance.driver.browser; @@ -142,12 +178,7 @@ const contextParamExpected = { }, driver: instance.driver, options: { - option: { - accounts: [ - "account" - ], - loginType: "loginType" - }, + option: context.option, config: { type: "extension", source: "source", @@ -187,42 +218,9 @@ const contextParamExpected = { } } -const argFn = jest.fn(); -let context = { - driver: "puppeteer", - option: { - accounts: ['account'], - loginType: 'loginType', - }, - title: 'execute case', - project: "google", - group: ['levels-p3', - 'brands-rc', - 'tags-salesforce', - 'options-accounts' - ], - caseParams, - tag: { project: 'google' }, - modes: [], - caseTag: ['google', - { - drivers, - levels: ['p3'], - brands: ['rc'], - tags: [['google'], ['office'], ['salesforce']], - options: ['accounts'], - accounts: ['account'] - } - ], - isSandbox: true, - isHeadless: false, - isDebugger: false, - isVerbose: false, - isOnly: false, - fn: argFn -} -const execCaseParamExpected = { + +let execCaseParamExpected = { driver: "enzyme", option: "accounts", title: 'test postSetup', From fc5e72b307823ac3903dc61854d31d38865b6666 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 11:08:57 +0800 Subject: [PATCH 11/20] feat(postSetup): Unit Test --- e2e.config.js | 17 ++ .../__test__/src/lifecycle/postSetup.test.js | 155 +++++++++++ .../src/lifecycle/postSetupTestData.js | 261 ++++++++++++++++++ packages/tees/src/lifecycle/postSetup.js | 88 +++++- 4 files changed, 513 insertions(+), 8 deletions(-) create mode 100644 e2e.config.js create mode 100644 packages/tees/__test__/src/lifecycle/postSetup.test.js create mode 100644 packages/tees/__test__/src/lifecycle/postSetupTestData.js diff --git a/e2e.config.js b/e2e.config.js new file mode 100644 index 0000000..373b3ca --- /dev/null +++ b/e2e.config.js @@ -0,0 +1,17 @@ +module.exports = { + selectorLabel: 'class', + params: { + projects: { + '${projectName}': { + type: 'uri', + location: 'https://cn.bing.com/', + } + } + }, + lookupConfig({ + config, + tag + }) { + return config.params.projects[tag.project]; + }, +}; diff --git a/packages/tees/__test__/src/lifecycle/postSetup.test.js b/packages/tees/__test__/src/lifecycle/postSetup.test.js new file mode 100644 index 0000000..53fabe3 --- /dev/null +++ b/packages/tees/__test__/src/lifecycle/postSetup.test.js @@ -0,0 +1,155 @@ +const { + caseParams, + caseParamsSkipped, + query, + instance, + caseTitle, + contextParamExpected, + context, + argFn, + execCaseParamExpected +} = require('./postSetupTestData.js'); +const { setup, testPrepare } = require('../../../src/lifecycle/setup.js'); +const { + beforeEachStart, + afterEachEnd, + getExecCaseParams, + execCase, + testCase, + testOnly, +} = require('../../../src/lifecycle/postSetup'); + + +describe('postSetup unit test :', () => { + + it('beforeEachStart, before hook for each case should be called', async () => { + const mockFn = jest.fn(); + + const result = await getExecCaseParams(context); + await beforeEachStart(result.context, mockFn); + + expect(mockFn).toBeCalled(); + expect(JSON.stringify(mockFn.mock.calls[0][0])).toBe(JSON.stringify(contextParamExpected)); + + }); + + + it('afterEachEnd, after hook for each case should be called and afterEachParam.driver.afterHooks should be called', async () => { + const hook1 = jest.fn(); + const hook2 = jest.fn(); + const afterEachParam = { + driver: { + afterHooks: [ + hook1, + hook2 + ] + }, + options: ['accounts'], + } + const afterEachFn = jest.fn(); + + await afterEachEnd(afterEachParam, afterEachFn); + + expect(afterEachFn).toBeCalled(); + expect(hook1).toBeCalled(); + expect(hook2).toBeCalled(); + }); + + it(`getExecCaseParams, should return result`, async () => { + + const result = await getExecCaseParams(context); + + expect(result.caseTitle).toEqual(caseTitle); + expect(JSON.stringify(result.instance.query)).toEqual(JSON.stringify(query)); + expect(JSON.stringify(result.context)).toEqual(JSON.stringify(contextParamExpected)); + }); + + it('execCase, verify the params of global and global.beforeEachStart should be called', async () => { + + const result = await getExecCaseParams(context); + global.getExecCaseParams = jest.fn().mockReturnValue(result); + + global.beforeEachStart = jest.fn(); + + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); + + await execCase(context); + + expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); + expect(global.__context__).toEqual(result.context); + expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); + expect(global.__afterEachCase__).toEqual(result.afterEachCase); + + expect(global.beforeEachStart).toBeCalled(); + expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); + + expect(result.context.driver.run).toBeCalled(); + + }); + + it('execCase, if test only should assign the params of global', async () => { + + context.isOnly = true; + + const result = await getExecCaseParams(context); + global.getExecCaseParams = jest.fn().mockReturnValue(result); + + global.beforeEachStart = jest.fn(); + + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); + + await execCase(context); + + expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); + expect(global.__context__).toEqual(result.context); + expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); + expect(global.__afterEachCase__).toEqual(result.afterEachCase); + + expect(global.beforeEachStart).toBeCalled(); + expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); + + expect(result.context.driver.run).toBeCalled(); + }); + + it(`testCase, global.execCase should be called and the param is equal to ${execCaseParamExpected}`, async () => { + + global.execCase = jest.fn(); + + await testCase(caseParams, argFn); + + expect(global.execCase).toBeCalled(); + expect(global.execCase).toHaveBeenCalledWith(execCaseParamExpected); + + }); + + it(`testCase, global.execCase should not be called`, async () => { + + global.execCase = jest.fn(); + + await testCase(caseParamsSkipped, argFn); + + expect(global.execCase).not.toBeCalled(); + + }); + + it(`testOnly, return global.testCase `, async () => { + + const fn = jest.fn(); + global.test = jest.fn(); + + const result = await testOnly(caseParams, fn); + + expect(global.test).toBeCalled(); + expect(global.test.mock.calls[0][0]).toBe(caseParams); + expect(global.test.mock.calls[0][1]).toBe(fn); + expect(global.test.mock.calls[0][2]).toBe(true); + expect(result).toBe(global.test(caseParams, fn, true)); + + }); + +}); + diff --git a/packages/tees/__test__/src/lifecycle/postSetupTestData.js b/packages/tees/__test__/src/lifecycle/postSetupTestData.js new file mode 100644 index 0000000..7319115 --- /dev/null +++ b/packages/tees/__test__/src/lifecycle/postSetupTestData.js @@ -0,0 +1,261 @@ +//global params +global.afterEach = jest.fn() + +const accounts = { + googleAccount: 'username', + googlePwd: 'password', +}; + +const drivers = ['enzyme', 'puppeteer', 'firefox', 'safari', 'chrome', 'webextGeckodriver']; + +const params = { + projects: { + google: { + type: 'extension', + source: 'source', + driver: { + setting: { + defaultViewport: { + height: 650, + width: 1100, + }, + args: [ + 'args', + ] + } + }, + params: { + brands: { + rc: { + ...accounts, + extension: 'extension', + location: 'location', + }, + } + } + }, + }, + drivers, + levels: ['p0', 'p1', 'p2', 'p3'], + brands: ['rc', 'bt', 'telus', 'att'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], +} + +const defaults = { + drivers, + levels: ['p3'], + brands: ['rc'], + accounts: ['account'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], +} + +global.execGlobal = { + defaults, + params, + selectorLabel: 'selectorLabel', +} + +global.execTags = [['google', + { + drivers, + levels: ['p3'], + brands: ['rc'], + tags: ['salesforce'], + options: ['accounts'], + accounts: ['account'], + }]] +global.execDrivers = defaults.drivers; +global.drivers = defaults.drivers; +global.execModes = [] +global.afterEach = jest.fn(); +global.beforeEachCase = jest.fn(); +global.afterEachCase = jest.fn(); +global.test = jest.fn((caseTitle, func) => func({ + instance: { + query + }, + context: contextParamExpected, + beforeEachCase: global.beforeEachCase, + afterEachCase: global.afterEachCase +})) + +global.test.only = jest.fn((caseTitle, func) => func({ + instance: { + query + }, + context: contextParamExpected, + beforeEachCase: global.beforeEachCase, + afterEachCase: global.afterEachCase +})) + +const caseParams = { + title: 'test postSetup', + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], +} + +const caseParamsSkipped = { + title: 'test postSetup', + tags: [['google'], ['office'], ['salesforce']], + options: [{ + accounts: ['account'], + loginType: 'loginType', + callingType: 'Other Phone', + }], +} + +const query = node => new Query(node, { + label: inputSetting.selectorLabel +}) + +const helper = require('../../../src/lifecycle/helper'); + +const caseTitle = "execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & accounts-account on puppeteer)" + +const instance = helper.getDriverInstance({ drivers: global.drivers, driver: "puppeteer", isSandbox: true }); + +const contextParamExpected = { + logger: helper.generateLogger(caseTitle, global.hasReporter), + get browser() { + return instance.driver.browser; + }, + get page() { + return instance.driver.page; + }, + driver: instance.driver, + options: { + option: { + accounts: [ + "account" + ], + loginType: "loginType" + }, + config: { + type: "extension", + source: "source", + driver: { + setting: { + defaultViewport: { + height: 650, + width: 1100 + }, + args: [ + "args" + ] + } + }, + params: { + brands: { + rc: { + googleAccount: "username", + googlePwd: "password", + extension: "extension", + location: "location" + } + } + } + }, + tag: { + project: "google" + }, + driver: "puppeteer", + modes: [], + isSandbox: true, + isHeadless: false, + isDebugger: false, + isVerbose: false, + isVirtual: false, + isUT: false + } +} + +const argFn = jest.fn(); +let context = { + driver: "puppeteer", + option: { + accounts: ['account'], + loginType: 'loginType', + }, + title: 'execute case', + project: "google", + group: ['levels-p3', + 'brands-rc', + 'tags-salesforce', + 'options-accounts', + 'accounts-account' + ], + caseParams, + tag: { project: 'google' }, + modes: [], + caseTag: ['google', + { + drivers, + levels: ['p3'], + brands: ['rc'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], + accounts: ['account'] + } + ], + isSandbox: true, + isHeadless: false, + isDebugger: false, + isVerbose: false, + isOnly: false, + fn: argFn +} + +const execCaseParamExpected = { + driver: "enzyme", + option: "accounts", + title: 'test postSetup', + project: "google", + group: ['levels-p3', + 'brands-rc', + 'tags-salesforce', + 'options-accounts', + 'accounts-account' + ], + caseParams, + tag: { + "accounts": "account", + "brands": "rc", + "levels": "p3", + "options": "accounts", + "project": "google", + "tags": "salesforce", + }, + modes: [], + caseTag: ['google', + { + drivers, + levels: ['p3'], + brands: ['rc'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], + accounts: ['account'] + } + ], + isSandbox: false, + isHeadless: false, + isDebugger: false, + isVerbose: false, + isOnly: false, + fn: argFn +} + +module.exports = { + caseParams, + caseParamsSkipped, + instance, + query, + caseTitle, + contextParamExpected, + context, + argFn, + execCaseParamExpected +}; + + diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index a713fa0..aa7876f 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -57,10 +57,10 @@ async function afterEachEnd(context, afterHook) { } /** - * execute case with case config and exection config. + * exection config * @param {object} params - execution params. */ -function execCase({ +function getExecCaseParams({ driver, option, title, @@ -141,8 +141,65 @@ function execCase({ }; // cache serialization options for retry. __optionsMapping__.set(context, JSON.stringify(context.options)); + + return { + caseTitle, + instance, + context, + beforeEachCase, + afterEachCase, + } + +} + +/** + * execute case with case config and exection config. + * @param {object} params - execution params. + */ +function execCase({ + driver, + option, + title, + project, + group, + caseParams, + tag, + modes, + caseTag, + isSandbox, + isHeadless, + isDebugger, + isVerbose, + isOnly, + fn, +}) { /* eslint-disable */ - const func = (async function ({ + + const { + caseTitle, + instance, + context, + beforeEachCase, + afterEachCase, + } = global.getExecCaseParams({ + driver, + option, + title, + project, + group, + caseParams, + tag, + modes, + caseTag, + isSandbox, + isHeadless, + isDebugger, + isVerbose, + isOnly, + fn, + }) + + const func = async function ({ instance, context, beforeEachCase, @@ -152,7 +209,8 @@ function execCase({ global.__context__ = context; global.__beforeEachCase__ = beforeEachCase; global.__afterEachCase__ = afterEachCase; - await beforeEachStart(context, beforeEachCase); + + await global.beforeEachStart(context, beforeEachCase); if (!context.options.isUT) { if (context.options.isSandbox) { const isAuth = context.options.option.isAuth; @@ -162,7 +220,7 @@ function execCase({ await context.driver.goto(context.options.config); } await fn(context); - }).bind(null, { + }.bind(null, { instance, context, beforeEachCase, @@ -218,7 +276,7 @@ function testCase(caseParams, fn, isOnly = false) { if (isSkipped) { break; } - execCase({ + global.execCase({ driver, option, title, @@ -253,7 +311,7 @@ function testSkip(...args) { } function testOnly(...args) { - return testCase(...args, true); + return global.test(...args, true); } function testDescribe(...args) { @@ -267,4 +325,18 @@ global.test = testCase; global.describe = testDescribe; global.describe.skip = _describe.skip; global.test.skip = testSkip; -global.test.only = testOnly; \ No newline at end of file +global.test.only = testOnly; +global.execCase = execCase; +global.beforeEachStart = beforeEachStart; +global.getExecCaseParams = getExecCaseParams; + +module.exports = { + beforeEachStart, + afterEachEnd, + getExecCaseParams, + execCase, + testCase, + testSkip, + testOnly, + testDescribe +}; \ No newline at end of file From 40d8cfd26d5cfa48e5aa26a2c5ab76fd318dc44b Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 11:21:24 +0800 Subject: [PATCH 12/20] feat(postSetup): Unit Test --- packages/tees/src/lifecycle/postSetup.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index aa7876f..38f43f8 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -92,14 +92,14 @@ function getExecCaseParams({ }); const groupInfos = group.length > 0 ? `in ${group.join(' & ')} ` : ''; const _optionTags = Object.entries(_option) - .reduce((tags, [name, value]) => { - const isAccountTag = ['loginAccount', 'accounts'].includes(name); - if (!isAccountTag) return tags; - return [ - ...tags, - `& ${name}-${value}` - ]; - }, []).join(' '); + .reduce((tags, [name, value]) => { + const isAccountTag = ['loginAccount', 'accounts'].includes(name); + if (!isAccountTag) return tags; + return [ + ...tags, + `& ${name}-${value}` + ]; + }, []).join(' '); const tail = ` => (${project} ${groupInfos}${_optionTags}on ${driver})`; const caseTitle = `${name}${tail}`; const { From fbeb6186c68a7c48dcd7685e4ba06608e309c398 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 15:09:37 +0800 Subject: [PATCH 13/20] feat(postSetup): Unit Test --- packages/tees/src/lifecycle/postSetup.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index 38f43f8..65a81d6 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -89,7 +89,7 @@ function getExecCaseParams({ option, caseTag, tag - }); + }) const groupInfos = group.length > 0 ? `in ${group.join(' & ')} ` : ''; const _optionTags = Object.entries(_option) .reduce((tags, [name, value]) => { @@ -116,8 +116,9 @@ function getExecCaseParams({ modes, isSandbox, }); + const context = { - logger: generateLogger(caseTitle, global.hasReporter, isVerbose), + logger: generateLogger(caseTitle, global.hasReporter), driver: instance.driver, get browser() { return context.driver.browser; From 5d9514b306aeabb2f9772b9d54776c4bf38416b9 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 21 Oct 2019 14:47:52 +0800 Subject: [PATCH 14/20] feat(ut):postSetup --- .../__test__/src/lifecycle/postSetup.test.js | 239 ++++++++++++------ .../src/lifecycle/postSetupTestData.js | 16 ++ 2 files changed, 173 insertions(+), 82 deletions(-) diff --git a/packages/tees/__test__/src/lifecycle/postSetup.test.js b/packages/tees/__test__/src/lifecycle/postSetup.test.js index 53fabe3..eb36d8b 100644 --- a/packages/tees/__test__/src/lifecycle/postSetup.test.js +++ b/packages/tees/__test__/src/lifecycle/postSetup.test.js @@ -20,7 +20,7 @@ const { } = require('../../../src/lifecycle/postSetup'); -describe('postSetup unit test :', () => { +describe('postSetup unit test : beforeEachStart', () => { it('beforeEachStart, before hook for each case should be called', async () => { const mockFn = jest.fn(); @@ -33,123 +33,198 @@ describe('postSetup unit test :', () => { }); +}), - it('afterEachEnd, after hook for each case should be called and afterEachParam.driver.afterHooks should be called', async () => { - const hook1 = jest.fn(); - const hook2 = jest.fn(); - const afterEachParam = { - driver: { - afterHooks: [ - hook1, - hook2 - ] - }, - options: ['accounts'], - } - const afterEachFn = jest.fn(); - - await afterEachEnd(afterEachParam, afterEachFn); - - expect(afterEachFn).toBeCalled(); - expect(hook1).toBeCalled(); - expect(hook2).toBeCalled(); - }); + describe('postSetup unit test : afterEachEnd', () => { - it(`getExecCaseParams, should return result`, async () => { + it('afterEachEnd, after hook for each case should be called and afterEachParam.driver.afterHooks should be called', async () => { + const hook1 = jest.fn(); + const hook2 = jest.fn(); + const afterEachParam = { + driver: { + afterHooks: [ + hook1, + hook2 + ] + }, + options: ['accounts'], + } + const afterEachFn = jest.fn(); - const result = await getExecCaseParams(context); + await afterEachEnd(afterEachParam, afterEachFn); - expect(result.caseTitle).toEqual(caseTitle); - expect(JSON.stringify(result.instance.query)).toEqual(JSON.stringify(query)); - expect(JSON.stringify(result.context)).toEqual(JSON.stringify(contextParamExpected)); - }); + expect(afterEachFn).toBeCalled(); + expect(hook1).toBeCalled(); + expect(hook2).toBeCalled(); + }); - it('execCase, verify the params of global and global.beforeEachStart should be called', async () => { + }), - const result = await getExecCaseParams(context); - global.getExecCaseParams = jest.fn().mockReturnValue(result); + describe('postSetup unit test : getExecCaseParams', () => { - global.beforeEachStart = jest.fn(); + it(`getExecCaseParams, should return result`, async () => { - result.context.driver.run = jest.fn(); - result.context.driver.newPage = jest.fn(); - result.context.driver.goto = jest.fn(); + const result = await getExecCaseParams(context); - await execCase(context); + expect(result.caseTitle).toEqual(caseTitle); + expect(JSON.stringify(result.instance.query)).toEqual(JSON.stringify(query)); + expect(JSON.stringify(result.context)).toEqual(JSON.stringify(contextParamExpected)); + }); + }), - expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); - expect(global.__context__).toEqual(result.context); - expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); - expect(global.__afterEachCase__).toEqual(result.afterEachCase); + describe('postSetup unit test : execCase', () => { - expect(global.beforeEachStart).toBeCalled(); - expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); + it('execCase, verify the params of global and global.beforeEachStart should be called', async () => { - expect(result.context.driver.run).toBeCalled(); + let result = await getExecCaseParams(context); - }); + global.getExecCaseParams = jest.fn().mockReturnValue(result); - it('execCase, if test only should assign the params of global', async () => { + global.beforeEachStart = jest.fn(); - context.isOnly = true; + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); - const result = await getExecCaseParams(context); - global.getExecCaseParams = jest.fn().mockReturnValue(result); + await execCase(context); - global.beforeEachStart = jest.fn(); + expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); + expect(global.__context__).toEqual(result.context); + expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); + expect(global.__afterEachCase__).toEqual(result.afterEachCase); - result.context.driver.run = jest.fn(); - result.context.driver.newPage = jest.fn(); - result.context.driver.goto = jest.fn(); + expect(global.beforeEachStart).toBeCalled(); + expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); - await execCase(context); + expect(result.context.driver.run).toBeCalled(); - expect(JSON.stringify(global.$)).toEqual(JSON.stringify(result.instance.query)); - expect(global.__context__).toEqual(result.context); - expect(global.__beforeEachCase__).toEqual(result.beforeEachCase); - expect(global.__afterEachCase__).toEqual(result.afterEachCase); + }); - expect(global.beforeEachStart).toBeCalled(); - expect(global.beforeEachStart).toHaveBeenCalledWith(result.context, result.beforeEachCase); + it('execCase, if test only should assign the params of global', async () => { - expect(result.context.driver.run).toBeCalled(); - }); + context.isOnly = true; - it(`testCase, global.execCase should be called and the param is equal to ${execCaseParamExpected}`, async () => { + result = await getExecCaseParams(context); + global.getExecCaseParams = jest.fn().mockReturnValue(result); - global.execCase = jest.fn(); + global.beforeEachStart = jest.fn(); - await testCase(caseParams, argFn); + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); - expect(global.execCase).toBeCalled(); - expect(global.execCase).toHaveBeenCalledWith(execCaseParamExpected); + await execCase(context); - }); + expect(result.context.driver.run).toBeCalled(); + }); - it(`testCase, global.execCase should not be called`, async () => { + it('execCase, if isUT is true context.driver.run should not be called', async () => { - global.execCase = jest.fn(); + context.driver = "ut"; - await testCase(caseParamsSkipped, argFn); + result = await getExecCaseParams(context); - expect(global.execCase).not.toBeCalled(); + global.getExecCaseParams = jest.fn().mockReturnValue(result); - }); + global.beforeEachStart = jest.fn(); - it(`testOnly, return global.testCase `, async () => { + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); - const fn = jest.fn(); - global.test = jest.fn(); + await execCase(context); - const result = await testOnly(caseParams, fn); + expect(result.context.driver.run).not.toBeCalled(); - expect(global.test).toBeCalled(); - expect(global.test.mock.calls[0][0]).toBe(caseParams); - expect(global.test.mock.calls[0][1]).toBe(fn); - expect(global.test.mock.calls[0][2]).toBe(true); - expect(result).toBe(global.test(caseParams, fn, true)); + context.driver = "puppeteer"; - }); + }); + + it('execCase, verify the params of global and global.beforeEachStart should be called', async () => { + + context.isHeadless = true; + context.isDebugger = true; + context.isVerbose = true; + + result = await getExecCaseParams(context); + + global.getExecCaseParams = jest.fn().mockReturnValue(result); + + global.beforeEachStart = jest.fn(); + + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); + + await execCase(context); + + expect(result.context.driver.run).toBeCalled(); + + }); + + + it('execCase, if isSandbox is false context.driver.run should not be called', async () => { + + context.isSandbox = false; + + const result = await getExecCaseParams(context); + + global.getExecCaseParams = jest.fn().mockReturnValue(result); -}); + global.beforeEachStart = jest.fn(); + + result.context.driver.run = jest.fn(); + result.context.driver.newPage = jest.fn(); + result.context.driver.goto = jest.fn(); + + await execCase(context); + + expect(result.context.driver.run).not.toBeCalled(); + + }); + + }), + + describe('postSetup unit test : testCase', () => { + + it(`testCase, global.execCase should be called and the param is equal to ${execCaseParamExpected}`, async () => { + + global.execCase = jest.fn(); + + await testCase(caseParams, argFn); + + expect(global.execCase).toBeCalled(); + expect(global.execCase).toHaveBeenCalledWith(execCaseParamExpected); + + }); + + it(`testCase, global.execCase should not be called`, async () => { + + global.execCase = jest.fn(); + + await testCase(caseParamsSkipped, argFn); + + expect(global.execCase).not.toBeCalled(); + + }); + }), + describe('postSetup unit test : testCase', () => { + + it(`testOnly, return global.testCase `, async () => { + + const fn = jest.fn(); + global.test = jest.fn(); + + const result = await testOnly(caseParams, fn); + + expect(global.test).toBeCalled(); + expect(global.test.mock.calls[0][0]).toBe(caseParams); + expect(global.test.mock.calls[0][1]).toBe(fn); + expect(global.test.mock.calls[0][2]).toBe(true); + expect(result).toBe(global.test(caseParams, fn, true)); + + }); + + + }); diff --git a/packages/tees/__test__/src/lifecycle/postSetupTestData.js b/packages/tees/__test__/src/lifecycle/postSetupTestData.js index 7319115..0dadf83 100644 --- a/packages/tees/__test__/src/lifecycle/postSetupTestData.js +++ b/packages/tees/__test__/src/lifecycle/postSetupTestData.js @@ -114,8 +114,24 @@ const helper = require('../../../src/lifecycle/helper'); const caseTitle = "execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & accounts-account on puppeteer)" +const mockProcessArgv = () => process.argv = ['/usr/local/bin/node', + '/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/node_modules/jest/bin/jest.js', + '--config={"verbose":true,"testMatch":["/packages/tees/templates/exampleSpec.js"],"testPathIgnorePatterns":[],"setupFiles":["/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/src/lifecycle/setup.js"],"setupFilesAfterEnv":["/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/src/lifecycle/postSetup.js"],"globals":{"hasReporter":false,"configPath":"/Users/lena.chen/RingCentral/tee-ut/tees/e2e.config.js","retryTimes":0,"execTags":[],"execModes":[],"execDrivers":["puppeteer"],"execGlobal":{"selectorLabel":"class","params":{"drivers":["puppeteer"],"projects":{"${projectName}":{"type":"uri","location":"https://cn.bing.com/"}}},"exec":{"drivers":["puppeteer"]},"defaults":{"drivers":["puppeteer"]}},"execDefaults":{"browsers":{}}},"globalSetup":"tees-environment/setup","globalTeardown":"tees-environment/teardown","testEnvironment":"tees-environment","transform":{"^.+\\\\.(jsx|js)$":"babel-jest"},"testRunner":"jest-circus/runner"}', + '--forceExit', + '--no-cache', + '--detectOpenHandles']; + +mockProcessArgv(); + const instance = helper.getDriverInstance({ drivers: global.drivers, driver: "puppeteer", isSandbox: true }); +let driversObj = {}; +global.drivers.forEach(element => { + driversObj[element] = instance; +}); + +global.drivers = driversObj; + const contextParamExpected = { logger: helper.generateLogger(caseTitle, global.hasReporter), get browser() { From 43d041967e841a16dd6e8152edf48300a5829bff Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 21 Oct 2019 16:30:39 +0800 Subject: [PATCH 15/20] feat(ut):postSetup --- packages/tees/__test__/src/lifecycle/postSetup.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tees/__test__/src/lifecycle/postSetup.test.js b/packages/tees/__test__/src/lifecycle/postSetup.test.js index eb36d8b..8af702a 100644 --- a/packages/tees/__test__/src/lifecycle/postSetup.test.js +++ b/packages/tees/__test__/src/lifecycle/postSetup.test.js @@ -208,7 +208,7 @@ describe('postSetup unit test : beforeEachStart', () => { }); }), - describe('postSetup unit test : testCase', () => { + describe('postSetup unit test : testOnly', () => { it(`testOnly, return global.testCase `, async () => { From dabcf8cc904997d6bbbe1213984641707adae7ab Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 21 Oct 2019 17:04:24 +0800 Subject: [PATCH 16/20] feat(ut):postSetup --- packages/tees/__test__/src/lifecycle/postSetupTestData.js | 3 +-- packages/tees/src/lifecycle/postSetup.js | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/tees/__test__/src/lifecycle/postSetupTestData.js b/packages/tees/__test__/src/lifecycle/postSetupTestData.js index 0dadf83..debeb82 100644 --- a/packages/tees/__test__/src/lifecycle/postSetupTestData.js +++ b/packages/tees/__test__/src/lifecycle/postSetupTestData.js @@ -199,8 +199,7 @@ let context = { group: ['levels-p3', 'brands-rc', 'tags-salesforce', - 'options-accounts', - 'accounts-account' + 'options-accounts' ], caseParams, tag: { project: 'google' }, diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index 65a81d6..634e6b9 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -118,7 +118,7 @@ function getExecCaseParams({ }); const context = { - logger: generateLogger(caseTitle, global.hasReporter), + logger: generateLogger(caseTitle, global.hasReporter, isVerbose), driver: instance.driver, get browser() { return context.driver.browser; @@ -200,7 +200,7 @@ function execCase({ fn, }) - const func = async function ({ + const func = (async function ({ instance, context, beforeEachCase, @@ -221,7 +221,7 @@ function execCase({ await context.driver.goto(context.options.config); } await fn(context); - }.bind(null, { + }).bind(null, { instance, context, beforeEachCase, From 14605ebce34d4374d3b418836b0d7dbce85c8201 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 11:08:57 +0800 Subject: [PATCH 17/20] feat(postSetup): Unit Test --- .../__test__/src/lifecycle/postSetup.test.js | 111 +++++++++++++++--- .../src/lifecycle/postSetupTestData.js | 91 +++++++------- 2 files changed, 141 insertions(+), 61 deletions(-) diff --git a/packages/tees/__test__/src/lifecycle/postSetup.test.js b/packages/tees/__test__/src/lifecycle/postSetup.test.js index 8af702a..87e0486 100644 --- a/packages/tees/__test__/src/lifecycle/postSetup.test.js +++ b/packages/tees/__test__/src/lifecycle/postSetup.test.js @@ -32,24 +32,27 @@ describe('postSetup unit test : beforeEachStart', () => { expect(JSON.stringify(mockFn.mock.calls[0][0])).toBe(JSON.stringify(contextParamExpected)); }); - }), describe('postSetup unit test : afterEachEnd', () => { + const hook1 = jest.fn(); + const hook2 = jest.fn(); + const close = jest.fn(); + const afterEachParam = { + driver: { + afterHooks: [ + hook1, + hook2 + ], + close + }, + options: { + isSandbox: true + }, + } + const afterEachFn = jest.fn(); it('afterEachEnd, after hook for each case should be called and afterEachParam.driver.afterHooks should be called', async () => { - const hook1 = jest.fn(); - const hook2 = jest.fn(); - const afterEachParam = { - driver: { - afterHooks: [ - hook1, - hook2 - ] - }, - options: ['accounts'], - } - const afterEachFn = jest.fn(); await afterEachEnd(afterEachParam, afterEachFn); @@ -58,6 +61,20 @@ describe('postSetup unit test : beforeEachStart', () => { expect(hook2).toBeCalled(); }); + it('afterEachEnd, after hook for each case should be called and afterEachParam.driver.afterHooks should be called', async () => { + afterEachParam.options.isSandbox = true; + + await afterEachEnd(afterEachParam, afterEachFn); + expect(close).toBeCalled(); + }); + + it('afterEachEnd, when afterHooks arg is null', async () => { + afterEachParam.driver.afterHooks = null; + + await afterEachEnd(afterEachParam, afterEachFn).catch(e => expect(String(e)).toMatch('TypeError: driver.afterHooks is not iterable')); + + }); + }), describe('postSetup unit test : getExecCaseParams', () => { @@ -70,6 +87,27 @@ describe('postSetup unit test : beforeEachStart', () => { expect(JSON.stringify(result.instance.query)).toEqual(JSON.stringify(query)); expect(JSON.stringify(result.context)).toEqual(JSON.stringify(contextParamExpected)); }); + + it(`getExecCaseParams, when case tags don't include loginAccount`, async () => { + context.option = { loginAccount: 'loginAccount' }; + const caseTitleNoLoginAccount = `execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & loginAccount-loginAccount on puppeteer)`; + contextParamExpected.options.option = context.option; + + const result = await getExecCaseParams(context); + + expect(result.caseTitle).toEqual(caseTitleNoLoginAccount); + expect(result.context.options.option).toEqual(context.option); + }); + + it(`getExecCaseParams, when case tags don't include account`, async () => { + context.option = { accounts: ['account'] }; + const caseTitleNoAccounts = `execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & accounts-account on puppeteer)`; + + const result = await getExecCaseParams(context); + + expect(result.caseTitle).toEqual(caseTitleNoAccounts); + expect(result.context.options.option).toEqual(context.option); + }); }), describe('postSetup unit test : execCase', () => { @@ -190,24 +228,66 @@ describe('postSetup unit test : beforeEachStart', () => { it(`testCase, global.execCase should be called and the param is equal to ${execCaseParamExpected}`, async () => { global.execCase = jest.fn(); - await testCase(caseParams, argFn); expect(global.execCase).toBeCalled(); expect(global.execCase).toHaveBeenCalledWith(execCaseParamExpected); + expect(global.execCase.mock.instances.length).toBe(6); + }); + + it(`testCase, the param isOnly is true and global.execCase should be called `, async () => { + + global.execCase = jest.fn(); + await testCase(caseParams, argFn, true); + + expect(global.execCase).toBeCalled(); + expect(global.execCase.mock.calls[0][0].isOnly).toEqual(true); }); - it(`testCase, global.execCase should not be called`, async () => { + it(`testCase, when modes is not null and global.execCase should be called`, async () => { global.execCase = jest.fn(); + caseParams.modes = ['headless']; + await testCase(caseParams, argFn); + + expect(global.execCase).toBeCalled(); + expect(global.execCase.mock.calls[0][0].modes).toEqual([...caseParams.modes, ...global.execModes]); + + }); + + it(`testCase, when tags is [] and global.execCase should be called`, async () => { + + global.execCase = jest.fn(); + caseParams.tags = []; + + await testCase(caseParams, argFn); + + expect(global.execCase).not.toBeCalled(); + }); + + it(`testCase, when options is [{}] and global.execCase should be called`, async () => { + + global.execCase = jest.fn(); + caseParams.options = [{}]; + + await testCase(caseParams, argFn); + + expect(global.execCase).not.toBeCalled(); + }); + + it(`testCase, isSkiped is true and global.execCase should not be called`, async () => { + + global.execCase = jest.fn(); await testCase(caseParamsSkipped, argFn); expect(global.execCase).not.toBeCalled(); }); + }), + describe('postSetup unit test : testOnly', () => { it(`testOnly, return global.testCase `, async () => { @@ -228,3 +308,4 @@ describe('postSetup unit test : beforeEachStart', () => { }); + diff --git a/packages/tees/__test__/src/lifecycle/postSetupTestData.js b/packages/tees/__test__/src/lifecycle/postSetupTestData.js index debeb82..dfcc748 100644 --- a/packages/tees/__test__/src/lifecycle/postSetupTestData.js +++ b/packages/tees/__test__/src/lifecycle/postSetupTestData.js @@ -94,6 +94,7 @@ const caseParams = { title: 'test postSetup', tags: [['google'], ['office'], ['salesforce']], options: ['accounts'], + modes: [] } const caseParamsSkipped = { @@ -101,7 +102,7 @@ const caseParamsSkipped = { tags: [['google'], ['office'], ['salesforce']], options: [{ accounts: ['account'], - loginType: 'loginType', + loginAccount: 'loginAccount', callingType: 'Other Phone', }], } @@ -112,11 +113,11 @@ const query = node => new Query(node, { const helper = require('../../../src/lifecycle/helper'); -const caseTitle = "execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & accounts-account on puppeteer)" +const caseTitle = "execute case => (google in levels-p3 & brands-rc & tags-salesforce & options-accounts & accounts-account & loginAccount-loginAccount on puppeteer)" const mockProcessArgv = () => process.argv = ['/usr/local/bin/node', - '/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/node_modules/jest/bin/jest.js', - '--config={"verbose":true,"testMatch":["/packages/tees/templates/exampleSpec.js"],"testPathIgnorePatterns":[],"setupFiles":["/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/src/lifecycle/setup.js"],"setupFilesAfterEnv":["/Users/lena.chen/RingCentral/tee-ut/tees/packages/tees/src/lifecycle/postSetup.js"],"globals":{"hasReporter":false,"configPath":"/Users/lena.chen/RingCentral/tee-ut/tees/e2e.config.js","retryTimes":0,"execTags":[],"execModes":[],"execDrivers":["puppeteer"],"execGlobal":{"selectorLabel":"class","params":{"drivers":["puppeteer"],"projects":{"${projectName}":{"type":"uri","location":"https://cn.bing.com/"}}},"exec":{"drivers":["puppeteer"]},"defaults":{"drivers":["puppeteer"]}},"execDefaults":{"browsers":{}}},"globalSetup":"tees-environment/setup","globalTeardown":"tees-environment/teardown","testEnvironment":"tees-environment","transform":{"^.+\\\\.(jsx|js)$":"babel-jest"},"testRunner":"jest-circus/runner"}', + '../../../node_modules/jest/bin/jest.js', + '--config={"verbose":true,"testMatch":["/packages/tees/templates/exampleSpec.js"],"testPathIgnorePatterns":[],"setupFiles":["/packages/tees/src/lifecycle/setup.js"],"setupFilesAfterEnv":["/packages/tees/src/lifecycle/postSetup.js"],"globals":{"hasReporter":false,"configPath":"../../../../tees/e2e.config.js","retryTimes":0,"execTags":[],"execModes":[],"execDrivers":["puppeteer"],"execGlobal":{"selectorLabel":"class","params":{"drivers":["puppeteer"],"projects":{"${projectName}":{"type":"uri","location":"https://cn.bing.com/"}}},"exec":{"drivers":["puppeteer"]},"defaults":{"drivers":["puppeteer"]}},"execDefaults":{"browsers":{}}},"globalSetup":"tees-environment/setup","globalTeardown":"tees-environment/teardown","testEnvironment":"tees-environment","transform":{"^.+\\\\.(jsx|js)$":"babel-jest"},"testRunner":"jest-circus/runner"}', '--forceExit', '--no-cache', '--detectOpenHandles']; @@ -132,7 +133,42 @@ global.drivers.forEach(element => { global.drivers = driversObj; -const contextParamExpected = { +const argFn = jest.fn(); +let context = { + driver: "puppeteer", + option: { + accounts: ['account'], + loginAccount: 'loginAccount', + }, + title: 'execute case', + project: "google", + group: ['levels-p3', + 'brands-rc', + 'tags-salesforce', + 'options-accounts' + ], + caseParams, + tag: { project: 'google' }, + modes: [], + caseTag: ['google', + { + drivers, + levels: ['p3'], + brands: ['rc'], + tags: [['google'], ['office'], ['salesforce']], + options: ['accounts'], + accounts: ['account'] + } + ], + isSandbox: true, + isHeadless: false, + isDebugger: false, + isVerbose: false, + isOnly: false, + fn: argFn +} + +let contextParamExpected = { logger: helper.generateLogger(caseTitle, global.hasReporter), get browser() { return instance.driver.browser; @@ -142,12 +178,7 @@ const contextParamExpected = { }, driver: instance.driver, options: { - option: { - accounts: [ - "account" - ], - loginType: "loginType" - }, + option: context.option, config: { type: "extension", source: "source", @@ -187,42 +218,9 @@ const contextParamExpected = { } } -const argFn = jest.fn(); -let context = { - driver: "puppeteer", - option: { - accounts: ['account'], - loginType: 'loginType', - }, - title: 'execute case', - project: "google", - group: ['levels-p3', - 'brands-rc', - 'tags-salesforce', - 'options-accounts' - ], - caseParams, - tag: { project: 'google' }, - modes: [], - caseTag: ['google', - { - drivers, - levels: ['p3'], - brands: ['rc'], - tags: [['google'], ['office'], ['salesforce']], - options: ['accounts'], - accounts: ['account'] - } - ], - isSandbox: true, - isHeadless: false, - isDebugger: false, - isVerbose: false, - isOnly: false, - fn: argFn -} -const execCaseParamExpected = { + +let execCaseParamExpected = { driver: "enzyme", option: "accounts", title: 'test postSetup', @@ -274,3 +272,4 @@ module.exports = { }; + From dde73ec67c62bd00505b80e83457a5052edf7bb8 Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 11:21:24 +0800 Subject: [PATCH 18/20] feat(postSetup): Unit Test --- packages/tees/src/lifecycle/postSetup.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index 634e6b9..961733b 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -89,7 +89,7 @@ function getExecCaseParams({ option, caseTag, tag - }) + }); const groupInfos = group.length > 0 ? `in ${group.join(' & ')} ` : ''; const _optionTags = Object.entries(_option) .reduce((tags, [name, value]) => { @@ -116,7 +116,6 @@ function getExecCaseParams({ modes, isSandbox, }); - const context = { logger: generateLogger(caseTitle, global.hasReporter, isVerbose), driver: instance.driver, From 68c121732b554a88b9eaf79176e74b0d0b085a7c Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 9 Sep 2019 15:09:37 +0800 Subject: [PATCH 19/20] feat(postSetup): Unit Test --- packages/tees/src/lifecycle/postSetup.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index 961733b..4e933e9 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -116,8 +116,9 @@ function getExecCaseParams({ modes, isSandbox, }); + const context = { - logger: generateLogger(caseTitle, global.hasReporter, isVerbose), + logger: generateLogger(caseTitle, global.hasReporter), driver: instance.driver, get browser() { return context.driver.browser; From 86921044e9139bf782a9b17662e8ab1d5c94c34c Mon Sep 17 00:00:00 2001 From: lenaChenv Date: Mon, 4 Nov 2019 15:01:45 +0800 Subject: [PATCH 20/20] add space --- packages/tees/src/lifecycle/postSetup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tees/src/lifecycle/postSetup.js b/packages/tees/src/lifecycle/postSetup.js index ddba984..874548e 100644 --- a/packages/tees/src/lifecycle/postSetup.js +++ b/packages/tees/src/lifecycle/postSetup.js @@ -100,7 +100,7 @@ function getExecCaseParams({ `& ${name}-${value}` ]; }, []).join(' '); - const tail = ` => (${project} ${groupInfos}${_optionTags}on ${driver})`; + const tail = ` => (${project} ${groupInfos}${_optionTags} on ${driver})`; const caseTitle = `${name}${tail}`; const { config,