@zohodesk/testinglibrary 0.1.8-exp.6 → 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.
- package/build/core/playwright/builtInFixtures/i18N.js +33 -0
- package/build/core/playwright/builtInFixtures/index.js +5 -1
- package/build/core/playwright/builtInFixtures/page.js +42 -39
- package/build/core/playwright/builtInFixtures/unauthenticatedPage.js +18 -0
- package/build/core/playwright/helpers/auth/accountLogin.js +18 -0
- package/build/core/playwright/helpers/auth/checkAuthCookies.js +47 -0
- package/build/core/playwright/helpers/auth/getUrlOrigin.js +13 -0
- package/build/core/playwright/helpers/auth/getUsers.js +72 -0
- package/build/core/playwright/helpers/auth/loginSteps.js +36 -0
- package/build/core/playwright/readConfigFile.js +2 -0
- package/build/lib/post-install.js +1 -1
- package/changelog.md +1 -0
- package/npm-shrinkwrap.json +1 -1
- package/package.json +1 -1
|
@@ -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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
+
};
|
|
@@ -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;
|
|
@@ -16,6 +16,7 @@ var _mergeObjects = require("./helpers/mergeObjects");
|
|
|
16
16
|
|
|
17
17
|
function getDefaultConfig() {
|
|
18
18
|
return {
|
|
19
|
+
uatDirectory: _path.default.join(process.cwd(), 'uat'),
|
|
19
20
|
headless: false,
|
|
20
21
|
browsers: ['Chrome'],
|
|
21
22
|
trace: false,
|
|
@@ -65,6 +66,7 @@ function combineDefaultConfigWithUserConfig(userConfiguration) {
|
|
|
65
66
|
/**
|
|
66
67
|
* Represents the user configuration object.
|
|
67
68
|
* @typedef {Object} UserConfig
|
|
69
|
+
* @property {string} uatDirectory - Directory in which uat configuration is places.
|
|
68
70
|
* @property {string} headless - Headless Browsers mode.
|
|
69
71
|
* @property {number} trace - trace for test cases.
|
|
70
72
|
* @property {boolean} video - video for test cases,
|
|
@@ -5,7 +5,7 @@ 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
|
-
// We are
|
|
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
9
|
if (process.env.NODE_ENV !== 'production' || process.env.SKIP_BROWSER_DOWNLOAD === true) {
|
|
10
10
|
const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
|
|
11
11
|
const command = playwrightPath;
|
package/changelog.md
CHANGED
package/npm-shrinkwrap.json
CHANGED