@twilio/flex-plugin-e2e-tests 5.0.0
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/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +16 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/parameters.d.ts +54 -0
- package/dist/core/parameters.js +95 -0
- package/dist/core/parameters.js.map +1 -0
- package/dist/core/runner.d.ts +8 -0
- package/dist/core/runner.js +313 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/suites.d.ts +11 -0
- package/dist/core/suites.js +17 -0
- package/dist/core/suites.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/tests/step001.d.ts +3 -0
- package/dist/tests/step001.js +65 -0
- package/dist/tests/step001.js.map +1 -0
- package/dist/tests/step002.d.ts +3 -0
- package/dist/tests/step002.js +133 -0
- package/dist/tests/step002.js.map +1 -0
- package/dist/tests/step003.d.ts +3 -0
- package/dist/tests/step003.js +63 -0
- package/dist/tests/step003.js.map +1 -0
- package/dist/tests/step004.d.ts +3 -0
- package/dist/tests/step004.js +65 -0
- package/dist/tests/step004.js.map +1 -0
- package/dist/tests/step005.d.ts +3 -0
- package/dist/tests/step005.js +86 -0
- package/dist/tests/step005.js.map +1 -0
- package/dist/tests/step006.d.ts +3 -0
- package/dist/tests/step006.js +122 -0
- package/dist/tests/step006.js.map +1 -0
- package/dist/tests/step007.d.ts +3 -0
- package/dist/tests/step007.js +122 -0
- package/dist/tests/step007.js.map +1 -0
- package/dist/tests/step008.d.ts +3 -0
- package/dist/tests/step008.js +103 -0
- package/dist/tests/step008.js.map +1 -0
- package/dist/tests/step009.d.ts +3 -0
- package/dist/tests/step009.js +119 -0
- package/dist/tests/step009.js.map +1 -0
- package/dist/tests/step010.d.ts +3 -0
- package/dist/tests/step010.js +168 -0
- package/dist/tests/step010.js.map +1 -0
- package/dist/tests/step011.d.ts +3 -0
- package/dist/tests/step011.js +164 -0
- package/dist/tests/step011.js.map +1 -0
- package/dist/tests/step012.d.ts +3 -0
- package/dist/tests/step012.js +177 -0
- package/dist/tests/step012.js.map +1 -0
- package/dist/utils/assertion.d.ts +39 -0
- package/dist/utils/assertion.js +151 -0
- package/dist/utils/assertion.js.map +1 -0
- package/dist/utils/browser.d.ts +20 -0
- package/dist/utils/browser.js +142 -0
- package/dist/utils/browser.js.map +1 -0
- package/dist/utils/console-api.d.ts +43 -0
- package/dist/utils/console-api.js +154 -0
- package/dist/utils/console-api.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.js +35 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/pages/app.d.ts +37 -0
- package/dist/utils/pages/app.js +133 -0
- package/dist/utils/pages/app.js.map +1 -0
- package/dist/utils/pages/index.d.ts +1 -0
- package/dist/utils/pages/index.js +14 -0
- package/dist/utils/pages/index.js.map +1 -0
- package/dist/utils/pages/view/admin-dashboard.d.ts +17 -0
- package/dist/utils/pages/view/admin-dashboard.js +91 -0
- package/dist/utils/pages/view/admin-dashboard.js.map +1 -0
- package/dist/utils/pages/view/agent-desktop.d.ts +17 -0
- package/dist/utils/pages/view/agent-desktop.js +91 -0
- package/dist/utils/pages/view/agent-desktop.js.map +1 -0
- package/dist/utils/pages/view/base.d.ts +29 -0
- package/dist/utils/pages/view/base.js +124 -0
- package/dist/utils/pages/view/base.js.map +1 -0
- package/dist/utils/pages/view/plugins.d.ts +31 -0
- package/dist/utils/pages/view/plugins.js +112 -0
- package/dist/utils/pages/view/plugins.js.map +1 -0
- package/dist/utils/pages/view/twilio-console.d.ts +26 -0
- package/dist/utils/pages/view/twilio-console.js +143 -0
- package/dist/utils/pages/view/twilio-console.js.map +1 -0
- package/dist/utils/plugin-helper.d.ts +6 -0
- package/dist/utils/plugin-helper.js +131 -0
- package/dist/utils/plugin-helper.js.map +1 -0
- package/dist/utils/plugins-api.d.ts +11 -0
- package/dist/utils/plugins-api.js +195 -0
- package/dist/utils/plugins-api.js.map +1 -0
- package/dist/utils/serverless-api.d.ts +7 -0
- package/dist/utils/serverless-api.js +117 -0
- package/dist/utils/serverless-api.js.map +1 -0
- package/dist/utils/spawn.d.ts +26 -0
- package/dist/utils/spawn.js +169 -0
- package/dist/utils/spawn.js.map +1 -0
- package/dist/utils/timers.d.ts +5 -0
- package/dist/utils/timers.js +48 -0
- package/dist/utils/timers.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.Browser = void 0;
|
|
43
|
+
var flex_dev_utils_1 = require("@twilio/flex-dev-utils");
|
|
44
|
+
var puppeteer_1 = require("puppeteer");
|
|
45
|
+
var assertion_1 = __importDefault(require("./assertion"));
|
|
46
|
+
var pages_1 = require("./pages");
|
|
47
|
+
var Browser = /** @class */ (function () {
|
|
48
|
+
function Browser() {
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Initializes browser object
|
|
52
|
+
*/
|
|
53
|
+
Browser.create = function (baseUrls) {
|
|
54
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
55
|
+
var _a, _b;
|
|
56
|
+
return __generator(this, function (_c) {
|
|
57
|
+
switch (_c.label) {
|
|
58
|
+
case 0:
|
|
59
|
+
_a = this;
|
|
60
|
+
return [4 /*yield*/, puppeteer_1.launch({ headless: true, args: ['--use-fake-ui-for-media-stream'] })];
|
|
61
|
+
case 1:
|
|
62
|
+
_a._browser = _c.sent();
|
|
63
|
+
_b = this;
|
|
64
|
+
return [4 /*yield*/, this._browser.newPage()];
|
|
65
|
+
case 2:
|
|
66
|
+
_b._page = _c.sent();
|
|
67
|
+
return [4 /*yield*/, this._page.setRequestInterception(true)];
|
|
68
|
+
case 3:
|
|
69
|
+
_c.sent();
|
|
70
|
+
this._attachLogListener();
|
|
71
|
+
this._attachNetworkInterceptor();
|
|
72
|
+
this.app = new pages_1.App(this._page, baseUrls);
|
|
73
|
+
assertion_1.default.app.init(this.app);
|
|
74
|
+
return [2 /*return*/];
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
Browser.kill = function () {
|
|
80
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
81
|
+
var e_1;
|
|
82
|
+
return __generator(this, function (_a) {
|
|
83
|
+
switch (_a.label) {
|
|
84
|
+
case 0:
|
|
85
|
+
_a.trys.push([0, 2, , 3]);
|
|
86
|
+
this._page.removeAllListeners();
|
|
87
|
+
return [4 /*yield*/, this._browser.close()];
|
|
88
|
+
case 1:
|
|
89
|
+
_a.sent();
|
|
90
|
+
return [3 /*break*/, 3];
|
|
91
|
+
case 2:
|
|
92
|
+
e_1 = _a.sent();
|
|
93
|
+
flex_dev_utils_1.logger.error('Failed to quit browser');
|
|
94
|
+
return [3 /*break*/, 3];
|
|
95
|
+
case 3: return [2 /*return*/];
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Attach browser log listener
|
|
102
|
+
*/
|
|
103
|
+
Browser._attachNetworkInterceptor = function () {
|
|
104
|
+
var _this = this;
|
|
105
|
+
this._page.on('request', function (request) { return __awaiter(_this, void 0, void 0, function () {
|
|
106
|
+
var url, re;
|
|
107
|
+
return __generator(this, function (_a) {
|
|
108
|
+
url = request.url();
|
|
109
|
+
re = new RegExp(this._domainsToInclude.join('|'));
|
|
110
|
+
if (request.resourceType() === 'script' && !re.test(url)) {
|
|
111
|
+
return [2 /*return*/, request.abort()];
|
|
112
|
+
}
|
|
113
|
+
return [2 /*return*/, request.continue()];
|
|
114
|
+
});
|
|
115
|
+
}); });
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Attach network interceptor
|
|
119
|
+
*/
|
|
120
|
+
Browser._attachLogListener = function () {
|
|
121
|
+
var _this = this;
|
|
122
|
+
this._page.on('console', function (msg) {
|
|
123
|
+
var logTypes = ['error'];
|
|
124
|
+
var url = msg.location().url || '';
|
|
125
|
+
var re = new RegExp(_this._domainsToInclude.join('|'));
|
|
126
|
+
if (logTypes.includes(msg.type()) && re.test(url)) {
|
|
127
|
+
flex_dev_utils_1.logger.error({
|
|
128
|
+
msg: msg.text(),
|
|
129
|
+
url: url,
|
|
130
|
+
args: msg.args() || '',
|
|
131
|
+
lineNumber: msg.location().lineNumber,
|
|
132
|
+
colNumber: msg.location().columnNumber,
|
|
133
|
+
stackTrace: msg.stackTrace() || '',
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
Browser._domainsToInclude = ['twilio', 'localhost', 'unpkg'];
|
|
139
|
+
return Browser;
|
|
140
|
+
}());
|
|
141
|
+
exports.Browser = Browser;
|
|
142
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface ConsoleAuthOptions {
|
|
2
|
+
email: string;
|
|
3
|
+
password: string;
|
|
4
|
+
}
|
|
5
|
+
export declare enum Cookie {
|
|
6
|
+
visitor = "tw-visitor",
|
|
7
|
+
sIdentity = "server-identity",
|
|
8
|
+
identity = "identity"
|
|
9
|
+
}
|
|
10
|
+
export interface Cookies {
|
|
11
|
+
[Cookie.identity]: string | undefined;
|
|
12
|
+
[Cookie.sIdentity]: string;
|
|
13
|
+
[Cookie.visitor]: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Defines interactions with Console API
|
|
17
|
+
*/
|
|
18
|
+
export declare class ConsoleAPI {
|
|
19
|
+
private readonly baseUrl;
|
|
20
|
+
private readonly consoleAuthOptions;
|
|
21
|
+
/**
|
|
22
|
+
* Initialises console base url and verifies console credentials
|
|
23
|
+
* @param consoleBaseUrl base url of Twilio console
|
|
24
|
+
* @param auth the {@link ConsoleAuthOptions}
|
|
25
|
+
*/
|
|
26
|
+
constructor(consoleBaseUrl: string, auth: ConsoleAuthOptions);
|
|
27
|
+
/**
|
|
28
|
+
* Extracts value from response header using regex
|
|
29
|
+
* @param regex regex to apply
|
|
30
|
+
* @param response response to be searched
|
|
31
|
+
* @param matchName name of the entity being looked for
|
|
32
|
+
*/
|
|
33
|
+
private static getValueFromResponse;
|
|
34
|
+
/**
|
|
35
|
+
* Fetch response from the Twilio console endpoint
|
|
36
|
+
* @param config request config to send
|
|
37
|
+
*/
|
|
38
|
+
private static getResponse;
|
|
39
|
+
/**
|
|
40
|
+
* Get required cookies (tw-visitor, identity, server-identity) to authenticate
|
|
41
|
+
*/
|
|
42
|
+
getCookies(): Promise<Cookies>;
|
|
43
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.ConsoleAPI = exports.Cookie = void 0;
|
|
43
|
+
var querystring_1 = require("querystring");
|
|
44
|
+
var axios_1 = __importDefault(require("axios"));
|
|
45
|
+
var flex_dev_utils_1 = require("@twilio/flex-dev-utils");
|
|
46
|
+
var csrfTokenRegex = new RegExp(/name="CSRF"\svalue="(.*?)"/m);
|
|
47
|
+
var twVisitorCookieRegex = new RegExp(/tw-visitor=(.*?);/m);
|
|
48
|
+
var identityCookieRegex = new RegExp(/identity=(.*?);/m);
|
|
49
|
+
var serverIdentityCookieRegex = new RegExp(/server-identity=(.*?);/m);
|
|
50
|
+
var SET_COOKIE = 'set-cookie';
|
|
51
|
+
var Cookie;
|
|
52
|
+
(function (Cookie) {
|
|
53
|
+
Cookie["visitor"] = "tw-visitor";
|
|
54
|
+
Cookie["sIdentity"] = "server-identity";
|
|
55
|
+
Cookie["identity"] = "identity";
|
|
56
|
+
})(Cookie = exports.Cookie || (exports.Cookie = {}));
|
|
57
|
+
/**
|
|
58
|
+
* Defines interactions with Console API
|
|
59
|
+
*/
|
|
60
|
+
var ConsoleAPI = /** @class */ (function () {
|
|
61
|
+
/**
|
|
62
|
+
* Initialises console base url and verifies console credentials
|
|
63
|
+
* @param consoleBaseUrl base url of Twilio console
|
|
64
|
+
* @param auth the {@link ConsoleAuthOptions}
|
|
65
|
+
*/
|
|
66
|
+
function ConsoleAPI(consoleBaseUrl, auth) {
|
|
67
|
+
this.baseUrl = consoleBaseUrl;
|
|
68
|
+
this.consoleAuthOptions = auth;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extracts value from response header using regex
|
|
72
|
+
* @param regex regex to apply
|
|
73
|
+
* @param response response to be searched
|
|
74
|
+
* @param matchName name of the entity being looked for
|
|
75
|
+
*/
|
|
76
|
+
ConsoleAPI.getValueFromResponse = function (regex, response, matchName) {
|
|
77
|
+
var match = response.match(regex);
|
|
78
|
+
if (!match || !match[1]) {
|
|
79
|
+
flex_dev_utils_1.logger.error(response);
|
|
80
|
+
throw new Error("Response does not contain " + matchName);
|
|
81
|
+
}
|
|
82
|
+
return match[1];
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Fetch response from the Twilio console endpoint
|
|
86
|
+
* @param config request config to send
|
|
87
|
+
*/
|
|
88
|
+
ConsoleAPI.getResponse = function (config) {
|
|
89
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
90
|
+
return __generator(this, function (_a) {
|
|
91
|
+
try {
|
|
92
|
+
return [2 /*return*/, axios_1.default(config)];
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
flex_dev_utils_1.logger.error(config.method + ": " + config.url + " returned code " + e.status + ".");
|
|
96
|
+
throw new Error(e);
|
|
97
|
+
}
|
|
98
|
+
return [2 /*return*/];
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Get required cookies (tw-visitor, identity, server-identity) to authenticate
|
|
104
|
+
*/
|
|
105
|
+
ConsoleAPI.prototype.getCookies = function () {
|
|
106
|
+
var _a, _b, _c, _d;
|
|
107
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
108
|
+
var loginResponse, csrfToken, twVisitorCookie, loginPasswordResponse, loginPasswordCookies, serverIdentityCookie, identityCookie;
|
|
109
|
+
var _e;
|
|
110
|
+
return __generator(this, function (_f) {
|
|
111
|
+
switch (_f.label) {
|
|
112
|
+
case 0: return [4 /*yield*/, ConsoleAPI.getResponse({ method: 'GET', url: this.baseUrl + "/login" })];
|
|
113
|
+
case 1:
|
|
114
|
+
loginResponse = _f.sent();
|
|
115
|
+
csrfToken = ConsoleAPI.getValueFromResponse(new RegExp(csrfTokenRegex), loginResponse.data, 'CSRF Token');
|
|
116
|
+
twVisitorCookie = ConsoleAPI.getValueFromResponse(new RegExp(twVisitorCookieRegex), ((_b = (_a = loginResponse.headers) === null || _a === void 0 ? void 0 : _a[SET_COOKIE]) === null || _b === void 0 ? void 0 : _b.join()) || '', Cookie.visitor + " cookie");
|
|
117
|
+
return [4 /*yield*/, ConsoleAPI.getResponse({
|
|
118
|
+
method: 'POST',
|
|
119
|
+
url: this.baseUrl + "/login/password",
|
|
120
|
+
withCredentials: true,
|
|
121
|
+
maxRedirects: 0,
|
|
122
|
+
headers: {
|
|
123
|
+
cookie: Cookie.visitor + "=" + twVisitorCookie,
|
|
124
|
+
},
|
|
125
|
+
validateStatus: function (status) { return status === 302; },
|
|
126
|
+
data: querystring_1.stringify({
|
|
127
|
+
CSRF: csrfToken,
|
|
128
|
+
email: this.consoleAuthOptions.email,
|
|
129
|
+
password: this.consoleAuthOptions.password,
|
|
130
|
+
}),
|
|
131
|
+
})];
|
|
132
|
+
case 2:
|
|
133
|
+
loginPasswordResponse = _f.sent();
|
|
134
|
+
loginPasswordCookies = ((_d = (_c = loginPasswordResponse.headers) === null || _c === void 0 ? void 0 : _c[SET_COOKIE]) === null || _d === void 0 ? void 0 : _d.join()) || '';
|
|
135
|
+
serverIdentityCookie = ConsoleAPI.getValueFromResponse(new RegExp(serverIdentityCookieRegex), loginPasswordCookies, Cookie.sIdentity + " cookie");
|
|
136
|
+
try {
|
|
137
|
+
identityCookie = ConsoleAPI.getValueFromResponse(new RegExp(identityCookieRegex), loginPasswordCookies, Cookie.identity + " cookie");
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
identityCookie = undefined;
|
|
141
|
+
}
|
|
142
|
+
return [2 /*return*/, (_e = {},
|
|
143
|
+
_e[Cookie.identity] = identityCookie,
|
|
144
|
+
_e[Cookie.sIdentity] = serverIdentityCookie,
|
|
145
|
+
_e[Cookie.visitor] = twVisitorCookie,
|
|
146
|
+
_e)];
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
return ConsoleAPI;
|
|
152
|
+
}());
|
|
153
|
+
exports.ConsoleAPI = ConsoleAPI;
|
|
154
|
+
//# sourceMappingURL=console-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-api.js","sourceRoot":"","sources":["../../src/utils/console-api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAwC;AAExC,gDAAiE;AACjE,yDAAgD;AAEhD,IAAM,cAAc,GAAG,IAAI,MAAM,CAAC,6BAA6B,CAAC,CAAC;AACjE,IAAM,oBAAoB,GAAG,IAAI,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAC9D,IAAM,mBAAmB,GAAG,IAAI,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC3D,IAAM,yBAAyB,GAAG,IAAI,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAOxE,IAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,IAAY,MAIX;AAJD,WAAY,MAAM;IAChB,gCAAsB,CAAA;IACtB,uCAA6B,CAAA;IAC7B,+BAAqB,CAAA;AACvB,CAAC,EAJW,MAAM,GAAN,cAAM,KAAN,cAAM,QAIjB;AAQD;;GAEG;AACH;IAKE;;;;OAIG;IACH,oBAAY,cAAsB,EAAE,IAAwB;QAC1D,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC;QAC9B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACY,+BAAoB,GAAnC,UAAoC,KAAa,EAAE,QAAgB,EAAE,SAAiB;QACpF,IAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEpC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACvB,uBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,+BAA6B,SAAW,CAAC,CAAC;SAC3D;QAED,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED;;;OAGG;IACkB,sBAAW,GAAhC,UAAiC,MAA0B;;;gBACzD,IAAI;oBACF,sBAAO,eAAK,CAAC,MAAM,CAAC,EAAC;iBACtB;gBAAC,OAAO,CAAC,EAAE;oBACV,uBAAM,CAAC,KAAK,CAAI,MAAM,CAAC,MAAM,UAAK,MAAM,CAAC,GAAG,uBAAkB,CAAC,CAAC,MAAM,MAAG,CAAC,CAAC;oBAC3E,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;iBACpB;;;;KACF;IAED;;OAEG;IACG,+BAAU,GAAhB;;;;;;;4BACwB,qBAAM,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAK,IAAI,CAAC,OAAO,WAAQ,EAAE,CAAC,EAAA;;wBAA7F,aAAa,GAAG,SAA6E;wBAE7F,SAAS,GAAG,UAAU,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;wBAE1G,eAAe,GAAG,UAAU,CAAC,oBAAoB,CACrD,IAAI,MAAM,CAAC,oBAAoB,CAAC,EAChC,CAAA,MAAA,MAAA,aAAa,CAAC,OAAO,0CAAG,UAAU,CAAC,0CAAE,IAAI,EAAE,KAAI,EAAE,EAC9C,MAAM,CAAC,OAAO,YAAS,CAC3B,CAAC;wBAE4B,qBAAM,UAAU,CAAC,WAAW,CAAC;gCACzD,MAAM,EAAE,MAAM;gCACd,GAAG,EAAK,IAAI,CAAC,OAAO,oBAAiB;gCACrC,eAAe,EAAE,IAAI;gCACrB,YAAY,EAAE,CAAC;gCACf,OAAO,EAAE;oCACP,MAAM,EAAK,MAAM,CAAC,OAAO,SAAI,eAAiB;iCAC/C;gCACD,cAAc,EAAE,UAAC,MAAc,IAAc,OAAA,MAAM,KAAK,GAAG,EAAd,CAAc;gCAC3D,IAAI,EAAE,uBAAS,CAAC;oCACd,IAAI,EAAE,SAAS;oCACf,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK;oCACpC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ;iCAC3C,CAAC;6BACH,CAAC,EAAA;;wBAdI,qBAAqB,GAAG,SAc5B;wBAEI,oBAAoB,GAAG,CAAA,MAAA,MAAA,qBAAqB,CAAC,OAAO,0CAAG,UAAU,CAAC,0CAAE,IAAI,EAAE,KAAI,EAAE,CAAC;wBAEjF,oBAAoB,GAAG,UAAU,CAAC,oBAAoB,CAC1D,IAAI,MAAM,CAAC,yBAAyB,CAAC,EACrC,oBAAoB,EACjB,MAAM,CAAC,SAAS,YAAS,CAC7B,CAAC;wBAIF,IAAI;4BACF,cAAc,GAAG,UAAU,CAAC,oBAAoB,CAC9C,IAAI,MAAM,CAAC,mBAAmB,CAAC,EAC/B,oBAAoB,EACjB,MAAM,CAAC,QAAQ,YAAS,CAC5B,CAAC;yBACH;wBAAC,OAAO,CAAC,EAAE;4BACV,cAAc,GAAG,SAAS,CAAC;yBAC5B;wBAED;gCACE,GAAC,MAAM,CAAC,QAAQ,IAAG,cAAc;gCACjC,GAAC,MAAM,CAAC,SAAS,IAAG,oBAAoB;gCACxC,GAAC,MAAM,CAAC,OAAO,IAAG,eAAe;qCACjC;;;;KACH;IACH,iBAAC;AAAD,CAAC,AArGD,IAqGC;AArGY,gCAAU"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { promisifiedSpawn as spawn, logResult, killChildProcess } from './spawn';
|
|
2
|
+
export { default as assertion } from './assertion';
|
|
3
|
+
export { writeFileSync } from 'fs';
|
|
4
|
+
export { default as api } from './plugins-api';
|
|
5
|
+
export { default as pluginHelper } from './plugin-helper';
|
|
6
|
+
export * from './console-api';
|
|
7
|
+
export * from './browser';
|
|
8
|
+
export * from './timers';
|
|
9
|
+
export { join as joinPath } from 'path';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable import/no-unused-modules */
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
6
|
+
}) : (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
o[k2] = m[k];
|
|
9
|
+
}));
|
|
10
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
11
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.joinPath = exports.pluginHelper = exports.api = exports.writeFileSync = exports.assertion = exports.killChildProcess = exports.logResult = exports.spawn = void 0;
|
|
18
|
+
var spawn_1 = require("./spawn");
|
|
19
|
+
Object.defineProperty(exports, "spawn", { enumerable: true, get: function () { return spawn_1.promisifiedSpawn; } });
|
|
20
|
+
Object.defineProperty(exports, "logResult", { enumerable: true, get: function () { return spawn_1.logResult; } });
|
|
21
|
+
Object.defineProperty(exports, "killChildProcess", { enumerable: true, get: function () { return spawn_1.killChildProcess; } });
|
|
22
|
+
var assertion_1 = require("./assertion");
|
|
23
|
+
Object.defineProperty(exports, "assertion", { enumerable: true, get: function () { return __importDefault(assertion_1).default; } });
|
|
24
|
+
var fs_1 = require("fs");
|
|
25
|
+
Object.defineProperty(exports, "writeFileSync", { enumerable: true, get: function () { return fs_1.writeFileSync; } });
|
|
26
|
+
var plugins_api_1 = require("./plugins-api");
|
|
27
|
+
Object.defineProperty(exports, "api", { enumerable: true, get: function () { return __importDefault(plugins_api_1).default; } });
|
|
28
|
+
var plugin_helper_1 = require("./plugin-helper");
|
|
29
|
+
Object.defineProperty(exports, "pluginHelper", { enumerable: true, get: function () { return __importDefault(plugin_helper_1).default; } });
|
|
30
|
+
__exportStar(require("./console-api"), exports);
|
|
31
|
+
__exportStar(require("./browser"), exports);
|
|
32
|
+
__exportStar(require("./timers"), exports);
|
|
33
|
+
var path_1 = require("path");
|
|
34
|
+
Object.defineProperty(exports, "joinPath", { enumerable: true, get: function () { return path_1.join; } });
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";AAAA,6CAA6C;;;;;;;;;;;;;;;;AAE7C,iCAAiF;AAAxE,8FAAA,gBAAgB,OAAS;AAAE,kGAAA,SAAS,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAC/D,yCAAmD;AAA1C,uHAAA,OAAO,OAAa;AAC7B,yBAAmC;AAA1B,mGAAA,aAAa,OAAA;AACtB,6CAA+C;AAAtC,mHAAA,OAAO,OAAO;AACvB,iDAA0D;AAAjD,8HAAA,OAAO,OAAgB;AAChC,gDAA8B;AAC9B,4CAA0B;AAC1B,2CAAyB;AACzB,6BAAwC;AAA/B,gGAAA,IAAI,OAAY"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Page } from 'puppeteer';
|
|
2
|
+
import { AdminDashboard } from './view/admin-dashboard';
|
|
3
|
+
import { AgentDesktop } from './view/agent-desktop';
|
|
4
|
+
import { Plugins } from './view/plugins';
|
|
5
|
+
import { TwilioConsole } from './view/twilio-console';
|
|
6
|
+
export interface BaseUrl {
|
|
7
|
+
flex: string;
|
|
8
|
+
twilioConsole: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class App {
|
|
11
|
+
assert: {
|
|
12
|
+
agentDesktop: InstanceType<typeof AgentDesktop>['assert'];
|
|
13
|
+
adminDashboard: InstanceType<typeof AdminDashboard>['assert'];
|
|
14
|
+
twilioConsole: InstanceType<typeof TwilioConsole>['assert'];
|
|
15
|
+
plugins: InstanceType<typeof Plugins>['assert'];
|
|
16
|
+
};
|
|
17
|
+
private readonly _agentDesktop;
|
|
18
|
+
private readonly _adminDashboard;
|
|
19
|
+
private readonly _twilioConsole;
|
|
20
|
+
private readonly _plugins;
|
|
21
|
+
private readonly _page;
|
|
22
|
+
constructor(page: Page, { flex, twilioConsole }: BaseUrl);
|
|
23
|
+
get agentDesktop(): Omit<AgentDesktop, 'assert'>;
|
|
24
|
+
get adminDashboard(): Omit<AdminDashboard, 'assert'>;
|
|
25
|
+
get plugins(): Omit<Plugins, 'assert'>;
|
|
26
|
+
get twilioConsole(): Omit<TwilioConsole, 'assert'>;
|
|
27
|
+
/**
|
|
28
|
+
* Gets account sid from browser's console
|
|
29
|
+
*/
|
|
30
|
+
getFlexAccountSid(): Promise<string>;
|
|
31
|
+
/**
|
|
32
|
+
* Takes screenshot of the current page
|
|
33
|
+
* @param rootDir
|
|
34
|
+
* @param screenshotName
|
|
35
|
+
*/
|
|
36
|
+
takeScreenshot(rootDir: string, screenshotName?: string): Promise<void>;
|
|
37
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.App = void 0;
|
|
40
|
+
var fs_1 = require("fs");
|
|
41
|
+
var __1 = require("..");
|
|
42
|
+
var admin_dashboard_1 = require("./view/admin-dashboard");
|
|
43
|
+
var agent_desktop_1 = require("./view/agent-desktop");
|
|
44
|
+
var plugins_1 = require("./view/plugins");
|
|
45
|
+
var twilio_console_1 = require("./view/twilio-console");
|
|
46
|
+
var screenshotExtension = '.png';
|
|
47
|
+
var App = /** @class */ (function () {
|
|
48
|
+
function App(page, _a) {
|
|
49
|
+
var flex = _a.flex, twilioConsole = _a.twilioConsole;
|
|
50
|
+
this._page = page;
|
|
51
|
+
this._agentDesktop = new agent_desktop_1.AgentDesktop(page, flex);
|
|
52
|
+
this._adminDashboard = new admin_dashboard_1.AdminDashboard(page, flex);
|
|
53
|
+
this._twilioConsole = new twilio_console_1.TwilioConsole(page, { twilioConsole: twilioConsole, flex: flex });
|
|
54
|
+
this._plugins = new plugins_1.Plugins(page, flex);
|
|
55
|
+
this.assert = {
|
|
56
|
+
agentDesktop: this._agentDesktop.assert,
|
|
57
|
+
adminDashboard: this._adminDashboard.assert,
|
|
58
|
+
twilioConsole: this._twilioConsole.assert,
|
|
59
|
+
plugins: this._plugins.assert,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
Object.defineProperty(App.prototype, "agentDesktop", {
|
|
63
|
+
get: function () {
|
|
64
|
+
return this._agentDesktop;
|
|
65
|
+
},
|
|
66
|
+
enumerable: false,
|
|
67
|
+
configurable: true
|
|
68
|
+
});
|
|
69
|
+
Object.defineProperty(App.prototype, "adminDashboard", {
|
|
70
|
+
get: function () {
|
|
71
|
+
return this._adminDashboard;
|
|
72
|
+
},
|
|
73
|
+
enumerable: false,
|
|
74
|
+
configurable: true
|
|
75
|
+
});
|
|
76
|
+
Object.defineProperty(App.prototype, "plugins", {
|
|
77
|
+
get: function () {
|
|
78
|
+
return this._plugins;
|
|
79
|
+
},
|
|
80
|
+
enumerable: false,
|
|
81
|
+
configurable: true
|
|
82
|
+
});
|
|
83
|
+
Object.defineProperty(App.prototype, "twilioConsole", {
|
|
84
|
+
get: function () {
|
|
85
|
+
return this._twilioConsole;
|
|
86
|
+
},
|
|
87
|
+
enumerable: false,
|
|
88
|
+
configurable: true
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* Gets account sid from browser's console
|
|
92
|
+
*/
|
|
93
|
+
App.prototype.getFlexAccountSid = function () {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
95
|
+
var Twilio;
|
|
96
|
+
return __generator(this, function (_a) {
|
|
97
|
+
return [2 /*return*/, this._page.evaluate(function () {
|
|
98
|
+
return Twilio.Flex.Manager.getInstance().serviceConfiguration.account_sid;
|
|
99
|
+
})];
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Takes screenshot of the current page
|
|
105
|
+
* @param rootDir
|
|
106
|
+
* @param screenshotName
|
|
107
|
+
*/
|
|
108
|
+
App.prototype.takeScreenshot = function (rootDir, screenshotName) {
|
|
109
|
+
if (screenshotName === void 0) { screenshotName = "on_failure." + screenshotExtension; }
|
|
110
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
111
|
+
var screenshotDir;
|
|
112
|
+
return __generator(this, function (_a) {
|
|
113
|
+
switch (_a.label) {
|
|
114
|
+
case 0:
|
|
115
|
+
screenshotDir = __1.joinPath(rootDir, 'screenshots');
|
|
116
|
+
if (!screenshotName.endsWith(screenshotExtension)) {
|
|
117
|
+
screenshotName += screenshotExtension;
|
|
118
|
+
}
|
|
119
|
+
if (!fs_1.existsSync(screenshotDir)) {
|
|
120
|
+
fs_1.mkdirSync(screenshotDir);
|
|
121
|
+
}
|
|
122
|
+
return [4 /*yield*/, this._page.screenshot({ path: __1.joinPath(screenshotDir, screenshotName) })];
|
|
123
|
+
case 1:
|
|
124
|
+
_a.sent();
|
|
125
|
+
return [2 /*return*/];
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
return App;
|
|
131
|
+
}());
|
|
132
|
+
exports.App = App;
|
|
133
|
+
//# sourceMappingURL=app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/utils/pages/app.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yBAA2C;AAI3C,wBAA8B;AAC9B,0DAAwD;AACxD,sDAAoD;AACpD,0CAAyC;AACzC,wDAAsD;AAEtD,IAAM,mBAAmB,GAAG,MAAM,CAAC;AAOnC;IAkBE,aAAY,IAAU,EAAE,EAAgC;YAA9B,IAAI,UAAA,EAAE,aAAa,mBAAA;QAC3C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,aAAa,GAAG,IAAI,4BAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,eAAe,GAAG,IAAI,gCAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,cAAc,GAAG,IAAI,8BAAa,CAAC,IAAI,EAAE,EAAE,aAAa,eAAA,EAAE,IAAI,MAAA,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG;YACZ,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM;YACvC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM;YAC3C,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM;YACzC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;SAC9B,CAAC;IACJ,CAAC;IAED,sBAAI,6BAAY;aAAhB;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;;;OAAA;IAED,sBAAI,+BAAc;aAAlB;YACE,OAAO,IAAI,CAAC,eAAe,CAAC;QAC9B,CAAC;;;OAAA;IAED,sBAAI,wBAAO;aAAX;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;;;OAAA;IAED,sBAAI,8BAAa;aAAjB;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;;;OAAA;IAED;;OAEG;IACG,+BAAiB,GAAvB;;;;gBAIE,sBAAwB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;wBAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,oBAAoB,CAAC,WAAW,CAAC;oBAC5E,CAAC,CAAC,EAAC;;;KACJ;IAED;;;;OAIG;IACG,4BAAc,GAApB,UAAqB,OAAe,EAAE,cAAoD;QAApD,+BAAA,EAAA,iCAA+B,mBAAqB;;;;;;wBAClF,aAAa,GAAG,YAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;wBAEvD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;4BACjD,cAAc,IAAI,mBAAmB,CAAC;yBACvC;wBAED,IAAI,CAAC,eAAU,CAAC,aAAa,CAAC,EAAE;4BAC9B,cAAS,CAAC,aAAa,CAAC,CAAC;yBAC1B;wBAED,qBAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,YAAQ,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE,CAAC,EAAA;;wBAA9E,SAA8E,CAAC;;;;;KAChF;IACH,UAAC;AAAD,CAAC,AA9ED,IA8EC;AA9EY,kBAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './app';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./app"), exports);
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/pages/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAsB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ElementHandle, Page } from 'puppeteer';
|
|
2
|
+
import { Base } from './base';
|
|
3
|
+
export declare class AdminDashboard extends Base {
|
|
4
|
+
private static readonly _welcomeBanner;
|
|
5
|
+
assert: {
|
|
6
|
+
/**
|
|
7
|
+
* Checks whether Welcome Banner is visible on Admin Dashboard
|
|
8
|
+
*/
|
|
9
|
+
isVisible: () => Promise<ElementHandle<Element>>;
|
|
10
|
+
};
|
|
11
|
+
private readonly _baseUrl;
|
|
12
|
+
constructor(page: Page, baseUrl: string);
|
|
13
|
+
/**
|
|
14
|
+
* Navigates to Admin Dashboard
|
|
15
|
+
*/
|
|
16
|
+
open(): Promise<void>;
|
|
17
|
+
}
|