@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.
@@ -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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"}
@@ -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';
@@ -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");
@@ -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, csrfToken, loginURL;
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.page.evaluate(function () {
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
- csrfToken = _a.sent();
99
- if (!csrfToken) return [3 /*break*/, 7];
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
- // Log in Flex via service login
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*/, timers_1.sleep(30000)];
101
+ return [4 /*yield*/, this.click(TwilioConsole._loginBtn)];
129
102
  case 6:
130
103
  _a.sent();
131
- return [3 /*break*/, 8];
132
- case 7: throw new Error('Unable to fetch CSRF token to login to Twilio Console');
133
- case 8: return [2 /*return*/];
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":"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"}
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.202404301214",
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.202404301214",
38
- "@twilio/flex-plugins-api-client": "6.3.4-alpha.202404301214",
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": "^21.3.7",
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": "76e46527c1762c97ca5043ca63892b2720072364"
56
+ "gitHead": "af9cafc0bcbe5f4b18e33ace6cc5029555088d3d"
57
57
  }
@@ -1,3 +0,0 @@
1
- import { TestSuite } from '../core';
2
- declare const testSuite: TestSuite;
3
- export default testSuite;
@@ -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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"}