@twilio/flex-plugin-e2e-tests 6.3.4-alpha.202404301214 → 6.3.4-alpha.202405081240
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/dist/core/parameters.d.ts +1 -4
- package/dist/core/parameters.js.map +1 -1
- package/dist/tests/step006.js +1 -4
- package/dist/tests/step006.js.map +1 -1
- package/dist/tests/step007.d.ts +0 -3
- package/dist/tests/step007.js +39 -33
- package/dist/tests/step007.js.map +1 -1
- package/dist/tests/step008.js +25 -130
- package/dist/tests/step008.js.map +1 -1
- package/dist/tests/step009.js +59 -47
- package/dist/tests/step009.js.map +1 -1
- package/dist/tests/step010.js +88 -36
- package/dist/tests/step010.js.map +1 -1
- package/dist/tests/step011.js +50 -55
- package/dist/tests/step011.js.map +1 -1
- package/dist/tests/step012.js +52 -38
- package/dist/tests/step012.js.map +1 -1
- package/dist/utils/console-api.d.ts +43 -0
- package/dist/utils/console-api.js +155 -0
- package/dist/utils/console-api.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/pages/view/twilio-console.d.ts +3 -1
- package/dist/utils/pages/view/twilio-console.js +18 -37
- package/dist/utils/pages/view/twilio-console.js.map +1 -1
- package/package.json +6 -6
- package/dist/tests/step013.d.ts +0 -3
- package/dist/tests/step013.js +0 -175
- package/dist/tests/step013.js.map +0 -1
|
@@ -0,0 +1,155 @@
|
|
|
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 axios_1 = __importDefault(require("axios"));
|
|
44
|
+
var flex_dev_utils_1 = require("@twilio/flex-dev-utils");
|
|
45
|
+
var csrfTokenRegex = new RegExp(/name="csrfToken"\scontent="(.*?)"/m);
|
|
46
|
+
var twVisitorCookieRegex = new RegExp(/tw-visitor=(.*?);/m);
|
|
47
|
+
var identityCookieRegex = new RegExp(/identity=(.*?);/m);
|
|
48
|
+
var serverIdentityCookieRegex = new RegExp(/server-identity=(.*?);/m);
|
|
49
|
+
var SET_COOKIE = 'set-cookie';
|
|
50
|
+
var Cookie;
|
|
51
|
+
(function (Cookie) {
|
|
52
|
+
Cookie["visitor"] = "tw-visitor";
|
|
53
|
+
Cookie["sIdentity"] = "server-identity";
|
|
54
|
+
Cookie["identity"] = "identity";
|
|
55
|
+
})(Cookie = exports.Cookie || (exports.Cookie = {}));
|
|
56
|
+
/**
|
|
57
|
+
* Defines interactions with Console API
|
|
58
|
+
*/
|
|
59
|
+
var ConsoleAPI = /** @class */ (function () {
|
|
60
|
+
/**
|
|
61
|
+
* Initialises console base url and verifies console credentials
|
|
62
|
+
* @param consoleBaseUrl base url of Twilio console
|
|
63
|
+
* @param auth the {@link ConsoleAuthOptions}
|
|
64
|
+
*/
|
|
65
|
+
function ConsoleAPI(consoleBaseUrl, auth) {
|
|
66
|
+
this.baseUrl = consoleBaseUrl;
|
|
67
|
+
this.consoleAuthOptions = auth;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Extracts value from response header using regex
|
|
71
|
+
* @param regex regex to apply
|
|
72
|
+
* @param response response to be searched
|
|
73
|
+
* @param matchName name of the entity being looked for
|
|
74
|
+
*/
|
|
75
|
+
ConsoleAPI.getValueFromResponse = function (regex, response, matchName) {
|
|
76
|
+
var match = response.match(regex);
|
|
77
|
+
if (!match || !match[1]) {
|
|
78
|
+
flex_dev_utils_1.logger.error(response);
|
|
79
|
+
throw new Error("Response does not contain " + matchName);
|
|
80
|
+
}
|
|
81
|
+
return match[1];
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Fetch response from the Twilio console endpoint
|
|
85
|
+
* @param config request config to send
|
|
86
|
+
*/
|
|
87
|
+
ConsoleAPI.getResponse = function (config) {
|
|
88
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
89
|
+
return __generator(this, function (_a) {
|
|
90
|
+
try {
|
|
91
|
+
return [2 /*return*/, axios_1.default(config)];
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
flex_dev_utils_1.logger.error(config.method + ": " + config.url + " returned code " + e.status + ".");
|
|
95
|
+
throw new Error(e.message);
|
|
96
|
+
}
|
|
97
|
+
return [2 /*return*/];
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Get required cookies (tw-visitor, identity, server-identity) to authenticate
|
|
103
|
+
*/
|
|
104
|
+
ConsoleAPI.prototype.getCookies = function () {
|
|
105
|
+
var _a, _b, _c, _d;
|
|
106
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
107
|
+
var loginResponse, csrfToken, twVisitorCookie, loginPasswordResponse, loginPasswordCookies, serverIdentityCookie, identityCookie;
|
|
108
|
+
var _e;
|
|
109
|
+
return __generator(this, function (_f) {
|
|
110
|
+
switch (_f.label) {
|
|
111
|
+
case 0: return [4 /*yield*/, ConsoleAPI.getResponse({ method: 'GET', url: this.baseUrl + "/login" })];
|
|
112
|
+
case 1:
|
|
113
|
+
loginResponse = _f.sent();
|
|
114
|
+
csrfToken = ConsoleAPI.getValueFromResponse(new RegExp(csrfTokenRegex), loginResponse.data, 'CSRF Token');
|
|
115
|
+
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");
|
|
116
|
+
return [4 /*yield*/, ConsoleAPI.getResponse({
|
|
117
|
+
method: 'POST',
|
|
118
|
+
url: this.baseUrl + "/userauth/submitLoginPassword",
|
|
119
|
+
withCredentials: true,
|
|
120
|
+
maxRedirects: 0,
|
|
121
|
+
headers: {
|
|
122
|
+
'x-twilio-csrf': csrfToken,
|
|
123
|
+
cookie: "tw-visitor=" + twVisitorCookie,
|
|
124
|
+
'Content-Type': 'application/json',
|
|
125
|
+
Accept: 'application/json',
|
|
126
|
+
},
|
|
127
|
+
validateStatus: function (status) { return status === 200; },
|
|
128
|
+
data: JSON.stringify({
|
|
129
|
+
email: this.consoleAuthOptions.email,
|
|
130
|
+
password: this.consoleAuthOptions.password,
|
|
131
|
+
}),
|
|
132
|
+
})];
|
|
133
|
+
case 2:
|
|
134
|
+
loginPasswordResponse = _f.sent();
|
|
135
|
+
loginPasswordCookies = ((_d = (_c = loginPasswordResponse.headers) === null || _c === void 0 ? void 0 : _c[SET_COOKIE]) === null || _d === void 0 ? void 0 : _d.join()) || '';
|
|
136
|
+
serverIdentityCookie = ConsoleAPI.getValueFromResponse(new RegExp(serverIdentityCookieRegex), loginPasswordCookies, Cookie.sIdentity + " cookie");
|
|
137
|
+
try {
|
|
138
|
+
identityCookie = ConsoleAPI.getValueFromResponse(new RegExp(identityCookieRegex), loginPasswordCookies, Cookie.identity + " cookie");
|
|
139
|
+
}
|
|
140
|
+
catch (e) {
|
|
141
|
+
identityCookie = undefined;
|
|
142
|
+
}
|
|
143
|
+
return [2 /*return*/, (_e = {},
|
|
144
|
+
_e[Cookie.identity] = identityCookie,
|
|
145
|
+
_e[Cookie.sIdentity] = serverIdentityCookie,
|
|
146
|
+
_e[Cookie.visitor] = twVisitorCookie,
|
|
147
|
+
_e)];
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
return ConsoleAPI;
|
|
153
|
+
}());
|
|
154
|
+
exports.ConsoleAPI = ConsoleAPI;
|
|
155
|
+
//# sourceMappingURL=console-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-api.js","sourceRoot":"","sources":["../../src/utils/console-api.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { default as assertion } from './assertion';
|
|
|
3
3
|
export { writeFileSync } from 'fs';
|
|
4
4
|
export { default as api } from './plugins-api';
|
|
5
5
|
export { default as pluginHelper } from './plugin-helper';
|
|
6
|
+
export * from './console-api';
|
|
6
7
|
export * from './browser';
|
|
7
8
|
export * from './timers';
|
|
8
9
|
export { join as joinPath } from 'path';
|
package/dist/utils/index.js
CHANGED
|
@@ -27,6 +27,7 @@ var plugins_api_1 = require("./plugins-api");
|
|
|
27
27
|
Object.defineProperty(exports, "api", { enumerable: true, get: function () { return __importDefault(plugins_api_1).default; } });
|
|
28
28
|
var plugin_helper_1 = require("./plugin-helper");
|
|
29
29
|
Object.defineProperty(exports, "pluginHelper", { enumerable: true, get: function () { return __importDefault(plugin_helper_1).default; } });
|
|
30
|
+
__exportStar(require("./console-api"), exports);
|
|
30
31
|
__exportStar(require("./browser"), exports);
|
|
31
32
|
__exportStar(require("./timers"), exports);
|
|
32
33
|
var path_1 = require("path");
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +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,4CAA0B;AAC1B,2CAAyB;AACzB,6BAAwC;AAA/B,gGAAA,IAAI,OAAY"}
|
|
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"}
|
|
@@ -2,6 +2,9 @@ import { Page } from 'puppeteer';
|
|
|
2
2
|
import { Base } from './base';
|
|
3
3
|
export declare class TwilioConsole extends Base {
|
|
4
4
|
private static _loginForm;
|
|
5
|
+
private static _password;
|
|
6
|
+
private static _nextBtn;
|
|
7
|
+
private static _loginBtn;
|
|
5
8
|
assert: {};
|
|
6
9
|
private readonly _baseUrl;
|
|
7
10
|
private readonly _flexBaseUrl;
|
|
@@ -16,7 +19,6 @@ export declare class TwilioConsole extends Base {
|
|
|
16
19
|
private static _createLocalhostUrl;
|
|
17
20
|
/**
|
|
18
21
|
* Logs user in through service-login
|
|
19
|
-
* @param cookies
|
|
20
22
|
* @param flexBaseUrl
|
|
21
23
|
* @param flexPath
|
|
22
24
|
* @param accountSid
|
|
@@ -52,8 +52,8 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
52
52
|
};
|
|
53
53
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
54
|
exports.TwilioConsole = void 0;
|
|
55
|
-
var core_1 = require("../../../core");
|
|
56
55
|
var base_1 = require("./base");
|
|
56
|
+
var core_1 = require("../../../core");
|
|
57
57
|
var timers_1 = require("../../timers");
|
|
58
58
|
var TwilioConsole = /** @class */ (function (_super) {
|
|
59
59
|
__extends(TwilioConsole, _super);
|
|
@@ -67,7 +67,6 @@ var TwilioConsole = /** @class */ (function (_super) {
|
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
69
|
* Logs user in through service-login
|
|
70
|
-
* @param cookies
|
|
71
70
|
* @param flexBaseUrl
|
|
72
71
|
* @param flexPath
|
|
73
72
|
* @param accountSid
|
|
@@ -75,7 +74,7 @@ var TwilioConsole = /** @class */ (function (_super) {
|
|
|
75
74
|
TwilioConsole.prototype.login = function (flexPath, accountSid, localhostPort, firstLoad) {
|
|
76
75
|
if (firstLoad === void 0) { firstLoad = true; }
|
|
77
76
|
return __awaiter(this, void 0, void 0, function () {
|
|
78
|
-
var redirectUrl, path
|
|
77
|
+
var redirectUrl, path;
|
|
79
78
|
return __generator(this, function (_a) {
|
|
80
79
|
switch (_a.label) {
|
|
81
80
|
case 0:
|
|
@@ -90,52 +89,34 @@ var TwilioConsole = /** @class */ (function (_super) {
|
|
|
90
89
|
return [4 /*yield*/, this.elementVisible(TwilioConsole._loginForm, "Twilio Console's Login form")];
|
|
91
90
|
case 2:
|
|
92
91
|
_a.sent();
|
|
93
|
-
return [4 /*yield*/, this.
|
|
94
|
-
var _a;
|
|
95
|
-
return (_a = document.head.querySelector('meta[name="csrfToken"]')) === null || _a === void 0 ? void 0 : _a.getAttribute('content');
|
|
96
|
-
})];
|
|
92
|
+
return [4 /*yield*/, this.inputText(TwilioConsole._loginForm, core_1.testParams.secrets.console.email)];
|
|
97
93
|
case 3:
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
loginURL = this._baseUrl + "/userauth/submitLoginPassword";
|
|
101
|
-
return [4 /*yield*/, this.page.evaluate(
|
|
102
|
-
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
103
|
-
function (data) {
|
|
104
|
-
return fetch(data.url, {
|
|
105
|
-
headers: {
|
|
106
|
-
'x-twilio-csrf': data.csrfToken,
|
|
107
|
-
'Content-Type': 'application/json',
|
|
108
|
-
},
|
|
109
|
-
body: JSON.stringify({
|
|
110
|
-
email: data.email,
|
|
111
|
-
password: data.password,
|
|
112
|
-
}),
|
|
113
|
-
method: 'POST',
|
|
114
|
-
});
|
|
115
|
-
}, {
|
|
116
|
-
url: loginURL,
|
|
117
|
-
email: core_1.testParams.secrets.console.email,
|
|
118
|
-
password: core_1.testParams.secrets.console.password,
|
|
119
|
-
csrfToken: csrfToken,
|
|
120
|
-
})];
|
|
94
|
+
_a.sent();
|
|
95
|
+
return [4 /*yield*/, this.click(TwilioConsole._nextBtn)];
|
|
121
96
|
case 4:
|
|
122
97
|
_a.sent();
|
|
123
|
-
|
|
124
|
-
return [4 /*yield*/, this.goto({ baseUrl: this._baseUrl, path: path })];
|
|
98
|
+
return [4 /*yield*/, this.inputText(TwilioConsole._password, core_1.testParams.secrets.console.password)];
|
|
125
99
|
case 5:
|
|
126
|
-
// Log in Flex via service login
|
|
127
100
|
_a.sent();
|
|
128
|
-
return [4 /*yield*/,
|
|
101
|
+
return [4 /*yield*/, this.click(TwilioConsole._loginBtn)];
|
|
129
102
|
case 6:
|
|
130
103
|
_a.sent();
|
|
131
|
-
return [
|
|
132
|
-
case 7:
|
|
133
|
-
|
|
104
|
+
return [4 /*yield*/, this.page.waitForNavigation()];
|
|
105
|
+
case 7:
|
|
106
|
+
_a.sent();
|
|
107
|
+
_a.label = 8;
|
|
108
|
+
case 8: return [4 /*yield*/, timers_1.sleep(30000)];
|
|
109
|
+
case 9:
|
|
110
|
+
_a.sent();
|
|
111
|
+
return [2 /*return*/];
|
|
134
112
|
}
|
|
135
113
|
});
|
|
136
114
|
});
|
|
137
115
|
};
|
|
138
116
|
TwilioConsole._loginForm = '#email';
|
|
117
|
+
TwilioConsole._password = '#password';
|
|
118
|
+
TwilioConsole._nextBtn = '#email-next';
|
|
119
|
+
TwilioConsole._loginBtn = 'button[type=submit]';
|
|
139
120
|
/**
|
|
140
121
|
* Creates a localhost url
|
|
141
122
|
* @param port
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twilio-console.js","sourceRoot":"","sources":["../../../../src/utils/pages/view/twilio-console.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA
|
|
1
|
+
{"version":3,"file":"twilio-console.js","sourceRoot":"","sources":["../../../../src/utils/pages/view/twilio-console.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,+BAA8B;AAC9B,sCAA2C;AAC3C,uCAAqC;AAErC;IAAmC,iCAAI;IAerC,uBAAY,IAAU,EAAE,EAAgE;YAA9D,IAAI,UAAA,EAAE,aAAa,mBAAA;QAA7C,YACE,kBAAM,IAAI,CAAC,SAGZ;QAVD,YAAM,GAAG,EAAE,CAAC;QAQV,KAAI,CAAC,QAAQ,GAAG,aAAa,CAAC;QAC9B,KAAI,CAAC,YAAY,GAAG,IAAI,CAAC;;IAC3B,CAAC;IAQD;;;;;OAKG;IACG,6BAAK,GAAX,UAAY,QAAgB,EAAE,UAAkB,EAAE,aAAqB,EAAE,SAAyB;QAAzB,0BAAA,EAAA,gBAAyB;;;;;;wBAC1F,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;4BACzD,CAAC,CAAC,aAAa,CAAC,mBAAmB,CAAC,aAAa,CAAC;4BAClD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;wBAChB,IAAI,GAAG,gCAA8B,UAAU,gBAAW,QAAQ,iBAAY,WAAa,CAAC;wBAElG,qBAAM,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,MAAA,EAAE,CAAC,EAAA;;wBAAjD,SAAiD,CAAC;6BAE9C,SAAS,EAAT,wBAAS;wBACX,qBAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,UAAU,EAAE,6BAA6B,CAAC,EAAA;;wBAAlF,SAAkF,CAAC;wBACnF,qBAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,iBAAU,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAA;;wBAAhF,SAAgF,CAAC;wBACjF,qBAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAA;;wBAAxC,SAAwC,CAAC;wBACzC,qBAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE,iBAAU,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAA;;wBAAlF,SAAkF,CAAC;wBACnF,qBAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,EAAA;;wBAAzC,SAAyC,CAAC;wBAC1C,qBAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAA;;wBAAnC,SAAmC,CAAC;;4BAGtC,qBAAM,cAAK,CAAC,KAAK,CAAC,EAAA;;wBAAlB,SAAkB,CAAC;;;;;KACpB;IAlDc,wBAAU,GAAG,QAAQ,CAAC;IAEtB,uBAAS,GAAG,WAAW,CAAC;IAExB,sBAAQ,GAAG,aAAa,CAAC;IAEzB,uBAAS,GAAG,qBAAqB,CAAC;IAcjD;;;OAGG;IACY,iCAAmB,GAAG,UAAC,IAAY,IAAK,OAAA,sBAAoB,IAAI,mBAAc,IAAM,EAA5C,CAA4C,CAAC;IA2BtG,oBAAC;CAAA,AApDD,CAAmC,WAAI,GAoDtC;AApDY,sCAAa"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twilio/flex-plugin-e2e-tests",
|
|
3
|
-
"version": "6.3.4-alpha.
|
|
3
|
+
"version": "6.3.4-alpha.202405081240",
|
|
4
4
|
"description": "Flex Plugin E2E Tests framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"flex",
|
|
@@ -34,12 +34,12 @@
|
|
|
34
34
|
"test": "exit 0"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@twilio/flex-dev-utils": "6.3.4-alpha.
|
|
38
|
-
"@twilio/flex-plugins-api-client": "6.3.4-alpha.
|
|
37
|
+
"@twilio/flex-dev-utils": "6.3.4-alpha.202405081240",
|
|
38
|
+
"@twilio/flex-plugins-api-client": "6.3.4-alpha.202405081240",
|
|
39
39
|
"axios": "^0.24.0",
|
|
40
40
|
"lodash": "4.17.21",
|
|
41
41
|
"package-json": "^7.0.0",
|
|
42
|
-
"puppeteer": "^
|
|
42
|
+
"puppeteer": "^19.2.2",
|
|
43
43
|
"replace-in-file": "^6.3.2",
|
|
44
44
|
"semver": "^7.3.5"
|
|
45
45
|
},
|
|
@@ -48,10 +48,10 @@
|
|
|
48
48
|
"@types/semver": "^7.3.9"
|
|
49
49
|
},
|
|
50
50
|
"engines": {
|
|
51
|
-
"node": "^16 || ^18 || ^20"
|
|
51
|
+
"node": "^14 || ^16 || ^18 || ^20"
|
|
52
52
|
},
|
|
53
53
|
"publishConfig": {
|
|
54
54
|
"access": "public"
|
|
55
55
|
},
|
|
56
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "af9cafc0bcbe5f4b18e33ace6cc5029555088d3d"
|
|
57
57
|
}
|
package/dist/tests/step013.d.ts
DELETED
package/dist/tests/step013.js
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
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 __read = (this && this.__read) || function (o, n) {
|
|
39
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
40
|
-
if (!m) return o;
|
|
41
|
-
var i = m.call(o), r, ar = [], e;
|
|
42
|
-
try {
|
|
43
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
44
|
-
}
|
|
45
|
-
catch (error) { e = { error: error }; }
|
|
46
|
-
finally {
|
|
47
|
-
try {
|
|
48
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
49
|
-
}
|
|
50
|
-
finally { if (e) throw e.error; }
|
|
51
|
-
}
|
|
52
|
-
return ar;
|
|
53
|
-
};
|
|
54
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
55
|
-
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
|
|
56
|
-
to[j] = from[i];
|
|
57
|
-
return to;
|
|
58
|
-
};
|
|
59
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
60
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
61
|
-
};
|
|
62
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
63
|
-
/* eslint-disable import/no-unused-modules */
|
|
64
|
-
var replace_in_file_1 = require("replace-in-file");
|
|
65
|
-
var semver_1 = __importDefault(require("semver"));
|
|
66
|
-
var core_1 = require("../core");
|
|
67
|
-
var utils_1 = require("../utils");
|
|
68
|
-
var testSuite = function (_a) {
|
|
69
|
-
var scenario = _a.scenario, config = _a.config, secrets = _a.secrets, environment = _a.environment;
|
|
70
|
-
return __awaiter(void 0, void 0, void 0, function () {
|
|
71
|
-
var ext, tmpComponentText, startPlugin, plugin1, plugin2, plugin3, resource, oldVersion, flags, twilioCliResult, e_1;
|
|
72
|
-
return __generator(this, function (_b) {
|
|
73
|
-
switch (_b.label) {
|
|
74
|
-
case 0:
|
|
75
|
-
ext = scenario.isTS ? 'tsx' : 'jsx';
|
|
76
|
-
tmpComponentText = 'This is the new text for the next version!';
|
|
77
|
-
startPlugin = function (url) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
78
|
-
return [2 /*return*/, utils_1.pluginHelper.waitForPluginToStart(url, core_1.testParams.config.start.timeout, core_1.testParams.config.start.pollInterval)];
|
|
79
|
-
}); }); };
|
|
80
|
-
plugin1 = scenario.plugins[0];
|
|
81
|
-
plugin2 = scenario.plugins[1];
|
|
82
|
-
plugin3 = scenario.plugins[2];
|
|
83
|
-
utils_1.assertion.not.isNull(plugin1);
|
|
84
|
-
utils_1.assertion.not.isNull(plugin2);
|
|
85
|
-
utils_1.assertion.not.isNull(plugin3);
|
|
86
|
-
utils_1.assertion.not.isNull(plugin1.newlineValue, 'scenario.plugins[0].newlineValue does not have a valid value');
|
|
87
|
-
// Edit remote plugin to have different text
|
|
88
|
-
return [4 /*yield*/, replace_in_file_1.replaceInFile({
|
|
89
|
-
files: utils_1.joinPath(plugin1.dir, 'src', 'components', 'CustomTaskList', "CustomTaskList." + ext),
|
|
90
|
-
from: plugin1.componentText,
|
|
91
|
-
to: tmpComponentText,
|
|
92
|
-
})];
|
|
93
|
-
case 1:
|
|
94
|
-
// Edit remote plugin to have different text
|
|
95
|
-
_b.sent();
|
|
96
|
-
return [4 /*yield*/, utils_1.api.getLatestPluginVersion(plugin1.name)];
|
|
97
|
-
case 2:
|
|
98
|
-
resource = _b.sent();
|
|
99
|
-
oldVersion = (resource === null || resource === void 0 ? void 0 : resource.version) || '0.0.0';
|
|
100
|
-
plugin1.version = semver_1.default.inc(oldVersion, 'patch');
|
|
101
|
-
return [4 /*yield*/, utils_1.spawn('twilio', __spreadArray(['flex:plugins:deploy', '--changelog', "\"" + plugin1.changelog + "\"", '--patch', '-l', 'debug'], __read(config.regionFlag)), {
|
|
102
|
-
cwd: plugin1.dir,
|
|
103
|
-
})];
|
|
104
|
-
case 3:
|
|
105
|
-
_b.sent();
|
|
106
|
-
// Release the edited plugin
|
|
107
|
-
return [4 /*yield*/, utils_1.spawn('twilio', __spreadArray([
|
|
108
|
-
'flex:plugins:release',
|
|
109
|
-
'--plugin',
|
|
110
|
-
'-l',
|
|
111
|
-
'debug',
|
|
112
|
-
plugin1.name + "@" + plugin1.version
|
|
113
|
-
], __read(config.regionFlag)))];
|
|
114
|
-
case 4:
|
|
115
|
-
// Release the edited plugin
|
|
116
|
-
_b.sent();
|
|
117
|
-
flags = ['--name', plugin1.name + "@" + oldVersion, '--name', plugin2.name];
|
|
118
|
-
return [4 /*yield*/, utils_1.spawn('twilio', __spreadArray(['flex:plugins:start', '-l', 'debug'], __read(flags)), {
|
|
119
|
-
detached: true,
|
|
120
|
-
cwd: plugin3.dir,
|
|
121
|
-
})];
|
|
122
|
-
case 5:
|
|
123
|
-
twilioCliResult = _b.sent();
|
|
124
|
-
return [4 /*yield*/, Promise.all([startPlugin(plugin2.localhostUrl), startPlugin(plugin3.localhostUrl)])];
|
|
125
|
-
case 6:
|
|
126
|
-
_b.sent();
|
|
127
|
-
_b.label = 7;
|
|
128
|
-
case 7:
|
|
129
|
-
_b.trys.push([7, 14, 16, 19]);
|
|
130
|
-
// Load local plugin
|
|
131
|
-
return [4 /*yield*/, utils_1.Browser.create({ flex: plugin3.localhostUrl, twilioConsole: config.consoleBaseUrl })];
|
|
132
|
-
case 8:
|
|
133
|
-
// Load local plugin
|
|
134
|
-
_b.sent();
|
|
135
|
-
return [4 /*yield*/, utils_1.Browser.app.twilioConsole.login('admin', secrets.api.accountSid, config.localhostPort)];
|
|
136
|
-
case 9:
|
|
137
|
-
_b.sent();
|
|
138
|
-
// Check if local plugin loaded okay
|
|
139
|
-
return [4 /*yield*/, utils_1.assertion.app.view.agentDesktop.isVisible()];
|
|
140
|
-
case 10:
|
|
141
|
-
// Check if local plugin loaded okay
|
|
142
|
-
_b.sent();
|
|
143
|
-
// @ts-ignore
|
|
144
|
-
return [4 /*yield*/, utils_1.assertion.app.view.plugins.plugin.isVisible(plugin1.newlineValue)];
|
|
145
|
-
case 11:
|
|
146
|
-
// @ts-ignore
|
|
147
|
-
_b.sent();
|
|
148
|
-
return [4 /*yield*/, utils_1.assertion.app.view.plugins.plugin.isVisible(plugin2.componentText)];
|
|
149
|
-
case 12:
|
|
150
|
-
_b.sent();
|
|
151
|
-
return [4 /*yield*/, utils_1.assertion.app.view.plugins.plugin.isVisible(plugin3.componentText)];
|
|
152
|
-
case 13:
|
|
153
|
-
_b.sent();
|
|
154
|
-
return [3 /*break*/, 19];
|
|
155
|
-
case 14:
|
|
156
|
-
e_1 = _b.sent();
|
|
157
|
-
return [4 /*yield*/, utils_1.Browser.app.takeScreenshot(environment.cwd)];
|
|
158
|
-
case 15:
|
|
159
|
-
_b.sent();
|
|
160
|
-
throw e_1;
|
|
161
|
-
case 16: return [4 /*yield*/, utils_1.Browser.kill()];
|
|
162
|
-
case 17:
|
|
163
|
-
_b.sent();
|
|
164
|
-
return [4 /*yield*/, utils_1.killChildProcess(twilioCliResult.child, environment.operatingSystem)];
|
|
165
|
-
case 18:
|
|
166
|
-
_b.sent();
|
|
167
|
-
return [7 /*endfinally*/];
|
|
168
|
-
case 19: return [2 /*return*/];
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
};
|
|
173
|
-
testSuite.description = 'Running {{twilio flex:plugins:start}} with multiple plugins: 2 local and 1 versioned';
|
|
174
|
-
exports.default = testSuite;
|
|
175
|
-
//# sourceMappingURL=step013.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"step013.js","sourceRoot":"","sources":["../../src/tests/step013.ts"],"names":[],"mappings":"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"}
|