@zohodesk/testinglibrary 0.1.8-exp.5 → 0.1.8-exp.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/.babelrc +3 -0
  2. package/build/core/playwright/builtInFixtures/i18N.js +33 -0
  3. package/build/core/playwright/builtInFixtures/index.js +5 -1
  4. package/build/core/playwright/builtInFixtures/page.js +42 -39
  5. package/build/core/playwright/builtInFixtures/unauthenticatedPage.js +18 -0
  6. package/build/core/playwright/clear-caches.js +19 -8
  7. package/build/core/playwright/codegen.js +4 -4
  8. package/build/core/playwright/constants/browserTypes.js +1 -5
  9. package/build/core/playwright/env-initializer.js +10 -6
  10. package/build/core/playwright/helpers/auth/accountLogin.js +18 -0
  11. package/build/core/playwright/helpers/auth/checkAuthCookies.js +47 -0
  12. package/build/core/playwright/helpers/auth/getUrlOrigin.js +13 -0
  13. package/build/core/playwright/helpers/auth/getUsers.js +72 -0
  14. package/build/core/playwright/helpers/auth/loginSteps.js +36 -0
  15. package/build/core/playwright/helpers/configFileNameProvider.js +13 -0
  16. package/build/core/playwright/helpers/mergeObjects.js +13 -0
  17. package/build/core/playwright/readConfigFile.js +12 -11
  18. package/build/core/playwright/report-generator.js +7 -7
  19. package/build/core/playwright/setup/config-creator.js +2 -2
  20. package/build/core/playwright/setup/config-utils.js +1 -1
  21. package/build/index.js +0 -11
  22. package/build/lib/cli.js +0 -3
  23. package/build/lib/post-install.js +15 -10
  24. package/build/setup-folder-structure/helper.js +1 -0
  25. package/build/utils/cliArgsToObject.js +5 -1
  26. package/build/utils/fileUtils.js +3 -0
  27. package/build/utils/rootPath.js +16 -9
  28. package/changelog.md +2 -0
  29. package/npm-shrinkwrap.json +12 -12
  30. package/package.json +3 -3
package/.babelrc CHANGED
@@ -6,6 +6,8 @@
6
6
  "targets": {
7
7
  "node": "14"
8
8
  },
9
+ // We are adding plugin @babel/plugin-transform-destructuring to ensure babel does not transform the destructing
10
+ // as playwright does not allow parameters without destrucring
9
11
  "exclude": ["@babel/plugin-transform-destructuring"]
10
12
  }
11
13
  ]
@@ -13,6 +15,7 @@
13
15
  "plugins": [
14
16
  ["@babel/plugin-transform-runtime"]
15
17
  ],
18
+ // Ignored as these are setup files needed during init script. Files inside that folder are copied not transformed
16
19
  "ignore": [
17
20
  "./src/setup-folder-structure/samples"
18
21
  ]
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ /* eslint-disable no-undef */
8
+ /* eslint-disable no-param-reassign */
9
+
10
+ // Note: We are duplicating below method from @zohodesk/i18n. We are not importing it as react package not yet availble in test environment.
11
+ function replaceI18NValuesWithRegex(i18nStr, values) {
12
+ if (typeof values !== 'undefined') {
13
+ if (Array.isArray(values)) {
14
+ for (let i = 0; i < values.length; i++) {
15
+ i18nStr = i18nStr.replace(new RegExp(`\\{${i}\\}`, 'g'), values[i]);
16
+ }
17
+ } else {
18
+ i18nStr = i18nStr.replace(new RegExp('\\{0\\}', 'g'), values);
19
+ }
20
+ }
21
+ return i18nStr;
22
+ }
23
+ var _default = exports.default = {
24
+ i18N: async ({
25
+ page
26
+ }, use) => {
27
+ await use(async (key, values) => {
28
+ const i18nValue = await page.evaluate(i18nKey => window.i18n[i18nKey], key);
29
+ const i18nStr = replaceI18NValuesWithRegex(i18nValue, values);
30
+ return i18nStr;
31
+ });
32
+ }
33
+ };
@@ -9,11 +9,15 @@ var _page = _interopRequireDefault(require("./page"));
9
9
  var _context = _interopRequireDefault(require("./context"));
10
10
  var _cacheLayer = _interopRequireDefault(require("./cacheLayer"));
11
11
  var _addTags = _interopRequireDefault(require("./addTags"));
12
+ var _i18N = _interopRequireDefault(require("./i18N"));
13
+ var _unauthenticatedPage = _interopRequireDefault(require("./unauthenticatedPage"));
12
14
  function getBuiltInFixtures(bddMode) {
13
15
  let builtInFixtures = {
14
16
  ..._page.default,
15
17
  ..._context.default,
16
- ..._cacheLayer.default
18
+ ..._cacheLayer.default,
19
+ ..._i18N.default,
20
+ ..._unauthenticatedPage.default
17
21
  };
18
22
  if (bddMode) {
19
23
  builtInFixtures = {
@@ -1,51 +1,54 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.default = void 0;
7
- // function test(descrition, callback) {
8
- // return test(descrition, ({ page }) => {
9
- // const { locator, ...custompage } = page
10
- // callback({ page: custompage })
11
- // })
12
- // }
13
- // class FilteredPage {
14
- // constructor(page) {
15
- // this.page = page;
16
- // this.allowedMethods = ['getByText', 'getByTitle'];
17
- // this.context = page.context;
18
- // }
19
- // goto(...args) {
20
- // return this.page['goto'](...args);
21
- // }
22
- // getByRole(...args) {
23
- // return this.page['getByRole'](...args);
24
- // }
25
- // }
26
- // function FilteredPage(page) {
27
- // return {
28
- // getByRole: () => {
29
- // throw new Error('You cannnot use getByRole property')
30
- // }
31
- // }
32
- // }
8
+ var _getUsers = require("../helpers/auth/getUsers");
9
+ var _loginSteps = _interopRequireDefault(require("../helpers/auth/loginSteps"));
10
+ /* eslint-disable global-require */
11
+
12
+ function getTagInputFromSelectedTags(tags, inputString) {
13
+ const selectedTag = tags.find(tag => tag.startsWith(inputString));
14
+ let tagInput = null;
15
+ if (selectedTag) {
16
+ tagInput = selectedTag.split(`${inputString}_`).pop().toLowerCase();
17
+ }
18
+ return tagInput;
19
+ }
20
+ function getCustomAccountDetails(tags) {
21
+ const filteredTags = tags.filter(tag => tag.startsWith('@profile') || tag.startsWith('@edition') || tag.startsWith('@profile') || tag.startsWith('@darkLaunch'));
22
+ if (filteredTags && filteredTags.length > 0) {
23
+ const selectedProfile = getTagInputFromSelectedTags(filteredTags, '@profile');
24
+ const selectedEdition = getTagInputFromSelectedTags(filteredTags, '@edition');
25
+ const darkLaunchFeature = getTagInputFromSelectedTags(filteredTags, '@darkLaunch');
26
+ const user = (0, _getUsers.getUserForSelectedEditionAndProfile)(selectedEdition, selectedProfile, darkLaunchFeature);
27
+ return user;
28
+ }
29
+ return null;
30
+ }
33
31
  var _default = exports.default = {
34
32
  page: async ({
33
+ context,
34
+ $tags,
35
35
  page
36
36
  }, use) => {
37
- page.getBaseUrl = function () {
38
- if (process.env.mode === 'dev') {
39
- return `${process.env.domain}?devURL=${process.env.devUrl}`;
40
- }
41
- return `${process.env.domain}`;
42
- };
43
- page.getCustomPageUrl = function (url) {
44
- if (process.env.mode === 'dev') {
45
- return `${process.env.domain}/${url}?devURL=${process.env.devUrl}`;
46
- }
47
- return `${process.env.domain}/${url}`;
48
- };
49
- await use(page);
37
+ const customAccountDetails = getCustomAccountDetails($tags);
38
+ if (customAccountDetails === null) {
39
+ await page.goto(process.env.domain);
40
+ await use(page);
41
+ } else {
42
+ await context.clearCookies();
43
+ await (0, _loginSteps.default)({
44
+ page,
45
+ role: `${customAccountDetails.role}-${customAccountDetails.edition}`,
46
+ useremail: customAccountDetails.email,
47
+ password: customAccountDetails.password
48
+ }, async () => page.url().includes(process.env.domain));
49
+ await page.goto(process.env.domain);
50
+ await use(page);
51
+ await context.close();
52
+ }
50
53
  }
51
54
  };
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = exports.default = {
8
+ unauthenticatedPage: async ({
9
+ browser
10
+ }, use) => {
11
+ const context = await browser.newContext({
12
+ storageState: null
13
+ });
14
+ const unauthenticatedPage = await context.newPage();
15
+ await use(unauthenticatedPage);
16
+ await context.close();
17
+ }
18
+ };
@@ -9,21 +9,32 @@ var _path = _interopRequireDefault(require("path"));
9
9
  var _fileUtils = require("../../utils/fileUtils");
10
10
  var _logger = require("../../utils/logger");
11
11
  var _readConfigFile = require("./readConfigFile");
12
+ function deleteAuthFiles(authFilePath) {
13
+ authFilePath.split('/').pop();
14
+ _logger.Logger.log(_logger.Logger.INFO_TYPE, `Deleting auth files present in ${authFilePath}`);
15
+ (0, _fileUtils.deleteFolder)(_path.default.resolve(process.cwd(), authFilePath));
16
+ }
17
+ function deletePlaywrightReport(reportPath) {
18
+ _logger.Logger.log(_logger.Logger.INFO_TYPE, `Deleting Playwright report ${reportPath}`);
19
+ (0, _fileUtils.deleteFolder)(reportPath);
20
+ }
21
+ function deleteGeneratedFeatures() {
22
+ const featuresGenPath = _path.default.resolve(process.cwd(), 'uat', '.features-gen');
23
+ _logger.Logger.log(_logger.Logger.INFO_TYPE, `Deleting generated features at ${featuresGenPath}`);
24
+ (0, _fileUtils.deleteFolder)(featuresGenPath);
25
+ }
12
26
  function clearCaches() {
13
27
  try {
14
28
  const {
15
29
  authFilePath,
16
30
  reportPath
17
31
  } = (0, _readConfigFile.generateConfigFromFile)();
18
- authFilePath.split('/').pop();
19
- _logger.Logger.log(_logger.Logger.INFO_TYPE, `Deleting auth files present in ${authFilePath}`);
20
- (0, _fileUtils.deleteFolder)(_path.default.resolve(process.cwd(), authFilePath));
21
- _logger.Logger.log(_logger.Logger.INFO_TYPE, `Deleting Playwright report ${reportPath}`);
22
- (0, _fileUtils.deleteFolder)(reportPath);
23
- (0, _fileUtils.deleteFolder)(_path.default.resolve(process.cwd(), 'uat', '.features-gen'));
24
- _logger.Logger.log(_logger.Logger.SUCCESS_TYPE, 'Caches Cleared');
32
+ deleteAuthFiles(authFilePath);
33
+ deletePlaywrightReport(reportPath);
34
+ deleteGeneratedFeatures();
35
+ _logger.Logger.log(_logger.Logger.SUCCESS_TYPE, 'Caches Cleared. Now you can try running npm run uat');
25
36
  } catch (err) {
26
- _logger.Logger.log(_logger.Logger.FAILURE_TYPE, 'Error While clearing cookies');
37
+ _logger.Logger.log(_logger.Logger.FAILURE_TYPE, 'Error While clearing cookies. Try manually delete folder uat/playwright and uat/playwright-report');
27
38
  }
28
39
  }
29
40
  var _default = exports.default = clearCaches;
@@ -9,11 +9,11 @@ var _child_process = require("child_process");
9
9
  var _path = _interopRequireDefault(require("path"));
10
10
  var _logger = require("../../utils/logger");
11
11
  var _rootPath = require("../../utils/rootPath");
12
- const userArgs = process.argv.slice(3);
13
- const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
14
- const command = playwrightPath;
15
- const args = ['codegen'].concat(userArgs);
16
12
  function generateCodegen() {
13
+ const domainUrl = process.argv.slice(3);
14
+ const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
15
+ const command = playwrightPath;
16
+ const args = ['codegen'].concat(domainUrl);
17
17
  const childProcess = (0, _child_process.spawn)(command, args, {
18
18
  stdio: 'inherit'
19
19
  });
@@ -3,11 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.SAFARI = exports.FIREFOX = exports.EDGE = exports.CHROME = exports.BROWSER_PROJECT_MAPPING = void 0;
7
- const CHROME = exports.CHROME = 'chromium';
8
- const EDGE = exports.EDGE = 'Microsoft Edge';
9
- const FIREFOX = exports.FIREFOX = 'firefox';
10
- const SAFARI = exports.SAFARI = 'webkit';
6
+ exports.BROWSER_PROJECT_MAPPING = void 0;
11
7
  const BROWSER_PROJECT_MAPPING = exports.BROWSER_PROJECT_MAPPING = {
12
8
  CHROME: 'chromium',
13
9
  EDGE: 'Microsoft Edge',
@@ -7,15 +7,19 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.initializeEnvConfig = initializeEnvConfig;
8
8
  var _fs = require("fs");
9
9
  var _path = _interopRequireDefault(require("path"));
10
+ var _configFileNameProvider = require("./helpers/configFileNameProvider");
11
+ function setEnvironmentVariables(mode, configJSON) {
12
+ process.env.mode = mode;
13
+ for (const key in configJSON[mode]) {
14
+ process.env[key] = configJSON[mode][key];
15
+ }
16
+ }
10
17
  function initializeEnvConfig(mode = 'dev') {
11
18
  try {
12
- const configFile = (0, _fs.readFileSync)(_path.default.resolve(process.cwd(), './uat/env-config.json'));
19
+ const configFile = (0, _fs.readFileSync)(_path.default.resolve(process.cwd(), `./${(0, _configFileNameProvider.getEnvConfigFilePath)()}`));
13
20
  const configJSON = JSON.parse(configFile);
14
- process.env.mode = mode;
15
- for (const key in configJSON[mode]) {
16
- process.env[key] = configJSON[mode][key];
17
- }
21
+ setEnvironmentVariables(mode, configJSON);
18
22
  } catch (err) {
19
- throw new Error('Config File Not Exists. Please provide a config file to intiailize the environment variables');
23
+ throw new Error(`Config File Not Exists. Please provide a config file ${(0, _configFileNameProvider.getEnvConfigFilePath)()} to intiailize the environment variables`);
20
24
  }
21
25
  }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _getUrlOrigin = _interopRequireDefault(require("./getUrlOrigin"));
9
+ async function accountLogin(page, useremail, password) {
10
+ await page.locator('#login_id').fill(useremail);
11
+ await page.locator('#nextbtn').click();
12
+ await page.locator('#password').fill(password);
13
+ await page.locator('#nextbtn').click();
14
+ const domainUrlOrigin = (0, _getUrlOrigin.default)(process.env.domain);
15
+ await page.waitForNavigation();
16
+ await Promise.race([page.waitForURL(`${domainUrlOrigin}/**`), page.waitForURL('**/announcement/**')]);
17
+ }
18
+ var _default = exports.default = accountLogin;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.authDirectory = void 0;
8
+ exports.loadCookiesIfPresent = loadCookiesIfPresent;
9
+ exports.verifyIfCookieFileExists = verifyIfCookieFileExists;
10
+ var _path = _interopRequireDefault(require("path"));
11
+ var _fs = require("fs");
12
+ var _readConfigFile = require("../../readConfigFile");
13
+ /* eslint-disable no-console */
14
+
15
+ const {
16
+ uatDirectory
17
+ } = (0, _readConfigFile.generateConfigFromFile)();
18
+ const authDirectory = exports.authDirectory = _path.default.resolve(_path.default.join(uatDirectory, 'playwright', '.auth'));
19
+ const authContent = {
20
+ cookies: []
21
+ };
22
+ function verifyIfCookieFileExists(authFile) {
23
+ if (!(0, _fs.existsSync)(authDirectory)) {
24
+ console.log('Creating auth directory for the first time setup...');
25
+ (0, _fs.mkdirSync)(authDirectory, {
26
+ recursive: true
27
+ });
28
+ }
29
+ if (!(0, _fs.existsSync)(authFile)) {
30
+ console.log('creating auth file..');
31
+ (0, _fs.writeFileSync)(authFile, JSON.stringify(authContent, null, 2));
32
+ }
33
+ }
34
+ function convertCookiesToParse(cookies, authFilePath) {
35
+ try {
36
+ return JSON.parse(cookies);
37
+ } catch (err) {
38
+ throw new Error(` Error while parsing cookies ${err} \n${_path.default.resolve(process.cwd(), authFilePath)} File is Empty`);
39
+ // process.exit()
40
+ }
41
+ }
42
+ async function loadCookiesIfPresent(page, authFile) {
43
+ verifyIfCookieFileExists(authFile);
44
+ const cookies = (0, _fs.readFileSync)(authFile);
45
+ const parsedCookies = convertCookiesToParse(cookies, authFile);
46
+ await page.context().addCookies(parsedCookies.cookies === undefined ? [] : parsedCookies.cookies);
47
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ function getUrlOrigin(url) {
8
+ const {
9
+ origin
10
+ } = new URL(url);
11
+ return origin;
12
+ }
13
+ var _default = exports.default = getUrlOrigin;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getListOfUsers = getListOfUsers;
8
+ exports.getPrimaryUser = getPrimaryUser;
9
+ exports.getUserForSelectedEditionAndProfile = getUserForSelectedEditionAndProfile;
10
+ exports.isCI = isCI;
11
+ var _path = _interopRequireDefault(require("path"));
12
+ var _readConfigFile = require("../../readConfigFile");
13
+ /* eslint-disable global-require */
14
+ function isCI() {
15
+ return process.env.mode === 'CI' || process.env.mode === 'ci';
16
+ }
17
+ function getListOfUsers() {
18
+ let users;
19
+ const {
20
+ uatDirectory
21
+ } = (0, _readConfigFile.generateConfigFromFile)();
22
+ if (isCI()) {
23
+ users = require(_path.default.join(uatDirectory, 'conf/ci/actors/index'));
24
+ } else {
25
+ users = require(_path.default.join(uatDirectory, '.conf/dev/actors/index'));
26
+ }
27
+ return users;
28
+ }
29
+ function getPrimaryUser() {
30
+ let primaryUser;
31
+ const {
32
+ uatDirectory
33
+ } = (0, _readConfigFile.generateConfigFromFile)();
34
+ if (isCI()) {
35
+ primaryUser = require(_path.default.join(uatDirectory, 'conf/ci/settings.json'));
36
+ } else {
37
+ primaryUser = require(_path.default.join(uatDirectory, 'conf/dev/settings.json'));
38
+ }
39
+ return primaryUser;
40
+ }
41
+ function getUserForSelectedEditionAndProfile(preferedEdition, preferredProfile, darkLaunchFeature) {
42
+ const {
43
+ editions: userdata,
44
+ darkLaunch
45
+ } = getListOfUsers();
46
+ const primaryUser = getPrimaryUser();
47
+ const edition = preferedEdition || primaryUser.edition;
48
+ const profile = preferredProfile || primaryUser.role;
49
+ let selectedProfile = {};
50
+ if (darkLaunchFeature && darkLaunchFeature !== null) {
51
+ const {
52
+ profiles: darkLaunchProfiles,
53
+ ...darkLaunchEditionData
54
+ } = darkLaunch[darkLaunchFeature] ? darkLaunch[darkLaunchFeature][0] : {};
55
+ selectedProfile = darkLaunchProfiles.find(user => user.role === profile);
56
+ return {
57
+ ...darkLaunchEditionData,
58
+ ...selectedProfile
59
+ };
60
+ }
61
+ // TODO: We are returning the first data from array. We need to check the possiblity of having multiple users for same role and possibly round robin
62
+ // For this we need to get the data from ci environment.
63
+ const {
64
+ profiles,
65
+ ...editionData
66
+ } = userdata[edition] ? userdata[edition][0] : {};
67
+ selectedProfile = profiles.find(user => user.role === profile);
68
+ return {
69
+ ...editionData,
70
+ ...selectedProfile
71
+ };
72
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _path = _interopRequireDefault(require("path"));
9
+ var _accountLogin = _interopRequireDefault(require("./accountLogin"));
10
+ var _checkAuthCookies = require("./checkAuthCookies");
11
+ /* eslint-disable no-console */
12
+
13
+ async function performLoginSteps({
14
+ page,
15
+ role,
16
+ useremail,
17
+ password
18
+ }, isLoggedIn) {
19
+ const authFile = _path.default.resolve(_path.default.join(_checkAuthCookies.authDirectory, `${role}-cookies.json`));
20
+ await (0, _checkAuthCookies.loadCookiesIfPresent)(page, authFile);
21
+ await page.goto(process.env.domain);
22
+ await page.waitForNavigation();
23
+ const loginStatus = await isLoggedIn(page);
24
+ if (!loginStatus) {
25
+ await (0, _accountLogin.default)(page, useremail, password);
26
+ await page.goto(process.env.domain);
27
+
28
+ // await page.waitForLoadState();
29
+
30
+ await isLoggedIn(page);
31
+ await page.context().storageState({
32
+ path: authFile
33
+ });
34
+ }
35
+ }
36
+ var _default = exports.default = performLoginSteps;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getEnvConfigFilePath = getEnvConfigFilePath;
7
+ exports.getUATFileName = getUATFileName;
8
+ function getUATFileName() {
9
+ return 'uat.config.js';
10
+ }
11
+ function getEnvConfigFilePath() {
12
+ return `uat/env-config.json`;
13
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.mergeObjects = mergeObjects;
7
+ // Utility function to merge objects using spread operator
8
+ function mergeObjects(obj1, obj2) {
9
+ return {
10
+ ...obj1,
11
+ ...obj2
12
+ };
13
+ }
@@ -4,16 +4,19 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.fileName = void 0;
8
7
  exports.generateConfigFromFile = generateConfigFromFile;
9
8
  exports.getAuthFilePath = getAuthFilePath;
10
9
  exports.isUserConfigFileAvailable = isUserConfigFileAvailable;
11
10
  var _fs = require("fs");
12
11
  var _path = _interopRequireDefault(require("path"));
13
12
  var _logger = require("../../utils/logger");
14
- const fileName = exports.fileName = 'uat.config.js';
13
+ var _configFileNameProvider = require("./helpers/configFileNameProvider");
14
+ var _mergeObjects = require("./helpers/mergeObjects");
15
+ // const fileName = 'uat.config.js';
16
+
15
17
  function getDefaultConfig() {
16
18
  return {
19
+ uatDirectory: _path.default.join(process.cwd(), 'uat'),
17
20
  headless: false,
18
21
  browsers: ['Chrome'],
19
22
  trace: false,
@@ -51,21 +54,19 @@ function combineDefaultConfigWithUserConfig(userConfiguration) {
51
54
  _logger.Logger.log(_logger.Logger.INFO_TYPE, `key - ${configKey} is not yet supported in uat configuration. This will not be used while creating playwright configuration`);
52
55
  }
53
56
  });
54
- return {
55
- ...defaultConfig,
56
- ...configurationObj
57
- };
57
+ return (0, _mergeObjects.mergeObjects)(defaultConfig, configurationObj);
58
58
  }
59
59
 
60
60
  /**
61
61
  * @typedef {Object|null} viewportConfig
62
62
  * @property {number} width - width of the viewport
63
- * @property {number} height - height of the viewport
63
+ * @property {number} height - height of the viewport
64
64
  */
65
65
 
66
66
  /**
67
67
  * Represents the user configuration object.
68
68
  * @typedef {Object} UserConfig
69
+ * @property {string} uatDirectory - Directory in which uat configuration is places.
69
70
  * @property {string} headless - Headless Browsers mode.
70
71
  * @property {number} trace - trace for test cases.
71
72
  * @property {boolean} video - video for test cases,
@@ -74,7 +75,7 @@ function combineDefaultConfigWithUserConfig(userConfiguration) {
74
75
  * @property {boolean} isAuthMode - Auth Mode. config whether authentication step needed before running test cases
75
76
  * @property {string} authFilePath - File Path where the cookies stored
76
77
  * @property {any} browsers: List of browsers
77
- * @property {string} openReportOn: default Option value (never, on-failure and always)
78
+ * @property {string} openReportOn: default Option value (never, on-failure and always)
78
79
  * @property {any} reportPath : directory where report is generate
79
80
  * @property {boolean} bddMode: Feature files needs to be processed
80
81
  * @property {number} expectTimeout: time in milliseconds which the expect condition should fail
@@ -91,9 +92,9 @@ function combineDefaultConfigWithUserConfig(userConfiguration) {
91
92
  * Generates a configuration object from a file, if it exists.
92
93
  *
93
94
  * @returns {UserConfig}
94
- */
95
+ */
95
96
  function generateConfigFromFile() {
96
- const filePath = _path.default.resolve(process.cwd(), fileName);
97
+ const filePath = _path.default.resolve(process.cwd(), (0, _configFileNameProvider.getUATFileName)());
97
98
  if ((0, _fs.existsSync)(filePath)) {
98
99
  /** @type {UserConfig} */
99
100
  const config = require(filePath);
@@ -103,7 +104,7 @@ function generateConfigFromFile() {
103
104
  return {};
104
105
  }
105
106
  function isUserConfigFileAvailable() {
106
- const filePath = _path.default.resolve(process.cwd(), fileName);
107
+ const filePath = _path.default.resolve(process.cwd(), (0, _configFileNameProvider.getUATFileName)());
107
108
  if ((0, _fs.existsSync)(filePath)) {
108
109
  return true;
109
110
  }
@@ -10,15 +10,15 @@ var _path = _interopRequireDefault(require("path"));
10
10
  var _logger = require("../../utils/logger");
11
11
  var _rootPath = require("../../utils/rootPath");
12
12
  var _readConfigFile = require("./readConfigFile");
13
- const userArgs = process.argv.slice(3);
14
- const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
15
- const command = playwrightPath;
16
- const {
17
- reportPath: htmlPath
18
- } = (0, _readConfigFile.generateConfigFromFile)();
19
- const args = ['show-report', htmlPath].concat(userArgs);
20
13
  async function generateReport() {
21
14
  // await preProcessReport()
15
+ const userArgs = process.argv.slice(3);
16
+ const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
17
+ const command = playwrightPath;
18
+ const {
19
+ reportPath: htmlPath
20
+ } = (0, _readConfigFile.generateConfigFromFile)();
21
+ const args = ['show-report', htmlPath].concat(userArgs);
22
22
  const childProcess = (0, _child_process.spawn)(command, args, {
23
23
  stdio: 'inherit'
24
24
  });
@@ -9,7 +9,7 @@ var _test = require("@playwright/test");
9
9
  var _path = _interopRequireDefault(require("path"));
10
10
  var _readConfigFile = require("../readConfigFile");
11
11
  var _configUtils = require("./config-utils");
12
- const defaultBrowsers = ['Chrome', 'Firefox', 'Edge', 'Safari'];
12
+ const defaultCIBrowsers = ['Chrome', 'Firefox', 'Edge', 'Safari'];
13
13
  const {
14
14
  browsers,
15
15
  trace,
@@ -26,7 +26,7 @@ const {
26
26
  stepDefinitionsFolder,
27
27
  testIdAttribute
28
28
  } = (0, _readConfigFile.generateConfigFromFile)();
29
- const browserList = process.env.mode === 'ci' ? defaultBrowsers : browsers;
29
+ const browserList = process.env.mode === 'ci' ? defaultCIBrowsers : browsers;
30
30
  const projects = (0, _configUtils.getProjects)({
31
31
  browsers: browserList,
32
32
  isAuthMode,
@@ -116,7 +116,7 @@ function getBrowsersList(browserFromArgs) {
116
116
  if (browserFromArgs) {
117
117
  if (typeof browserFromArgs === 'string') {
118
118
  let listOfbrowsers = browserFromArgs.split(',').map(browser => browser.trim().toLowerCase());
119
- _logger.Logger.log(_logger.Logger.INFO_TYPE, '');
119
+ _logger.Logger.log(_logger.Logger.INFO_TYPE, 'Using browsers from command line args');
120
120
  return listOfbrowsers;
121
121
  }
122
122
  }
package/build/index.js CHANGED
@@ -23,17 +23,6 @@ Object.defineProperty(exports, "test", {
23
23
  }
24
24
  });
25
25
  var _index = require("./core/playwright/index");
26
- // const { expect, test, createBdd } = require('./core/playwright/index');
27
- // const { fireEvent, render } = require('@testing-library/react');
28
-
29
- // module.exports = {
30
- // expect,
31
- // test,
32
- // fireEvent,
33
- // render,
34
- // createBdd
35
- // }
36
-
37
26
  // import { fireEvent, render } from '@testing-library/react';
38
27
 
39
28
  const {
package/build/lib/cli.js CHANGED
@@ -12,9 +12,6 @@ var _helper = _interopRequireDefault(require("../setup-folder-structure/helper")
12
12
  // import createJestRunner from '../core/jest/runner/jest-runner';
13
13
 
14
14
  const [,, option, ...otherOptions] = process.argv;
15
- // const args = process.argv.slice(3);
16
- // const appPath = process.cwd();
17
-
18
15
  switch (option) {
19
16
  case 'test':
20
17
  {
@@ -5,13 +5,18 @@ var _path = _interopRequireDefault(require("path"));
5
5
  var _child_process = require("child_process");
6
6
  var _logger = require("../utils/logger");
7
7
  var _rootPath = require("../utils/rootPath");
8
- const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
9
- const command = playwrightPath;
10
- const args = ['install'];
11
- _logger.Logger.log(_logger.Logger.INFO_TYPE, 'Downloading browsers for running tests');
12
- const childProcess = (0, _child_process.spawn)(command, args, {
13
- stdio: 'inherit'
14
- });
15
- childProcess.on('error', error => {
16
- _logger.Logger.log(_logger.Logger.FAILURE_TYPE, error);
17
- });
8
+ // We are skipping the download of browsers when NODE_ENV is set to production or flag SKIP_BROWSER_DOWNLOAD is set to true
9
+ if (process.env.NODE_ENV !== 'production' || process.env.SKIP_BROWSER_DOWNLOAD === true) {
10
+ const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
11
+ const command = playwrightPath;
12
+ const args = ['install'];
13
+ _logger.Logger.log(_logger.Logger.INFO_TYPE, 'Downloading browsers for running tests');
14
+ const childProcess = (0, _child_process.spawn)(command, args, {
15
+ stdio: 'inherit'
16
+ });
17
+ childProcess.on('error', error => {
18
+ _logger.Logger.log(_logger.Logger.FAILURE_TYPE, error);
19
+ });
20
+ } else {
21
+ _logger.Logger.log(_logger.Logger.INFO_TYPE, 'Skipping browsers download in production mode');
22
+ }
@@ -29,6 +29,7 @@ function helpercmd() {
29
29
  _commander.program.option('--debug', 'This command is used to initiate a debugging session');
30
30
  _commander.program.option('--tags', 'Run specific test case with mentioned tags (Usage: -- --tags="@live")');
31
31
  _commander.program.option('--workers', 'Specify number of workers to run the test case parallely (Usage: -- --workers=2)');
32
+ _commander.program.option('--edition', 'Specify edition to run the test cases (Usage: -- --edition="standard". This will run the test cases with either no edition mentioned or edition standard)');
32
33
  _commander.program.option('--browsers', 'Specify the browsers on which the test case should run (Usage: -- --browsers="chrome,firefox,safari")');
33
34
  _commander.program.parse(process.argv);
34
35
  }
@@ -5,6 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.cliArgsToObject = cliArgsToObject;
7
7
  exports.objectToCliArgs = objectToCliArgs;
8
+ function isMatchForOption(option) {
9
+ return /^--./.test(option);
10
+ }
11
+
8
12
  /**
9
13
  * Converts an array of command-line arguments into an object.
10
14
  *
@@ -23,7 +27,7 @@ exports.objectToCliArgs = objectToCliArgs;
23
27
  function cliArgsToObject(cliArgs, isKeyNeedToBeAdded) {
24
28
  const processEnv = {};
25
29
  cliArgs.forEach(option => {
26
- if (/^--./.test(option)) {
30
+ if (isMatchForOption(option)) {
27
31
  const equIndex = option.indexOf('=');
28
32
  let key = option.slice(2, equIndex);
29
33
  let value = option.slice(equIndex + 1);
@@ -11,6 +11,7 @@ exports.readFileContents = readFileContents;
11
11
  exports.writeFileContents = writeFileContents;
12
12
  var _fs = _interopRequireDefault(require("fs"));
13
13
  var _path = _interopRequireDefault(require("path"));
14
+ var _logger = require("./logger");
14
15
  function checkIfFileExists(file) {
15
16
  try {
16
17
  _fs.default.accessSync(file, _fs.default.constants.F_OK);
@@ -49,6 +50,8 @@ function deleteFile(filePath) {
49
50
  } catch (err) {
50
51
  throw new Error(`Error while deleting the test data file: ${filePath}`);
51
52
  }
53
+ } else {
54
+ _logger.Logger.log(_logger.Logger.INFO_TYPE, `File Does not Exist in the path ${filePath}`);
52
55
  }
53
56
  }
54
57
  function deleteFolder(folderPath) {
@@ -12,24 +12,31 @@ var _path = _interopRequireDefault(require("path"));
12
12
  var _fs = _interopRequireDefault(require("fs"));
13
13
  var _logger = require("./logger");
14
14
  var _getFilePath = _interopRequireDefault(require("./getFilePath"));
15
- function findBinaryPath(directory, command) {
16
- const binaryPath = _path.default.join(directory, '.bin', (0, _getFilePath.default)(command));
17
- if (_fs.default.existsSync(binaryPath)) {
18
- return binaryPath;
15
+ // TODO: Publish and check this change of finding package.json working fine.
16
+ function findPath(directory, pathToFind) {
17
+ const filePath = _path.default.join(directory, pathToFind);
18
+ if (_fs.default.existsSync(filePath)) {
19
+ return filePath;
19
20
  }
20
-
21
- // Recursively search parent directories. Might be time-consuming ?? Can we look for npm module like which?
22
21
  const parentDir = _path.default.dirname(directory);
23
22
  if (parentDir === directory) {
24
23
  return null;
25
24
  }
26
- return findBinaryPath(parentDir, command);
25
+ return findPath(parentDir, pathToFind);
26
+ }
27
+ function findPackageJSON(startDir) {
28
+ return findPath(startDir, 'package.json');
29
+ }
30
+ function findBinaryPath(directory, command) {
31
+ const binaryPath = _path.default.join('.bin', (0, _getFilePath.default)(command));
32
+ return findPath(directory, binaryPath);
27
33
  }
28
34
  function getRootPath() {
29
- return _path.default.resolve(__dirname, '../', '../');
35
+ return findPackageJSON(_path.default.resolve(__dirname));
30
36
  }
31
37
  function getRootNodeModulesPath() {
32
- return _path.default.resolve(getRootPath(), 'node_modules');
38
+ const rootPath = getRootPath();
39
+ return _path.default.resolve(_path.default.dirname(rootPath), 'node_modules');
33
40
  }
34
41
  function getBinPath(command) {
35
42
  const packageNodeModulesPath = getRootNodeModulesPath();
package/changelog.md CHANGED
@@ -6,6 +6,8 @@
6
6
  **Enhancements**
7
7
  - Added option to specify browsers in command line.
8
8
  - npm run uat -- --browsers='chrome,firefox'
9
+ - Playwright version updated to 1.41.1
10
+ - Added option to Skip Browser download
9
11
 
10
12
  # 0.1.8
11
13
  **Issue Fixes**
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zohodesk/testinglibrary",
3
- "version": "0.1.8",
3
+ "version": "0.1.8-exp.7",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
@@ -2074,11 +2074,11 @@
2074
2074
  "integrity": "sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q=="
2075
2075
  },
2076
2076
  "@playwright/test": {
2077
- "version": "1.40.1",
2078
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.1.tgz",
2079
- "integrity": "sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw==",
2077
+ "version": "1.41.2",
2078
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.41.2.tgz",
2079
+ "integrity": "sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg==",
2080
2080
  "requires": {
2081
- "playwright": "1.40.1"
2081
+ "playwright": "1.41.2"
2082
2082
  }
2083
2083
  },
2084
2084
  "@sinclair/typebox": {
@@ -5387,18 +5387,18 @@
5387
5387
  }
5388
5388
  },
5389
5389
  "playwright": {
5390
- "version": "1.40.1",
5391
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz",
5392
- "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==",
5390
+ "version": "1.41.2",
5391
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.41.2.tgz",
5392
+ "integrity": "sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==",
5393
5393
  "requires": {
5394
5394
  "fsevents": "2.3.2",
5395
- "playwright-core": "1.40.1"
5395
+ "playwright-core": "1.41.2"
5396
5396
  }
5397
5397
  },
5398
5398
  "playwright-core": {
5399
- "version": "1.40.1",
5400
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz",
5401
- "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ=="
5399
+ "version": "1.41.2",
5400
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.2.tgz",
5401
+ "integrity": "sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA=="
5402
5402
  },
5403
5403
  "pretty-format": {
5404
5404
  "version": "29.7.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zohodesk/testinglibrary",
3
- "version": "0.1.8-exp.5",
3
+ "version": "0.1.8-exp.7",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {
@@ -22,7 +22,7 @@
22
22
  "dependencies": {
23
23
  "@babel/preset-react": "7.22.5",
24
24
  "@cucumber/cucumber": "9.2.0",
25
- "@playwright/test": "1.40.1",
25
+ "@playwright/test": "1.41.2",
26
26
  "@testing-library/jest-dom": "5.11.9",
27
27
  "@testing-library/react": "11.2.7",
28
28
  "@testing-library/react-hooks": "7.0.2",
@@ -32,7 +32,7 @@
32
32
  "jest": "29.6.2",
33
33
  "jest-environment-jsdom": "29.6.2",
34
34
  "msw": "1.2.3",
35
- "playwright": "1.40.1"
35
+ "playwright": "1.41.2"
36
36
  },
37
37
  "bin": {
38
38
  "ZDTestingFramework": "./bin/cli.js"