@bigbinary/neeto-playwright-commons 1.26.23 → 1.26.25
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/index.cjs.js +276 -8
- package/index.cjs.js.map +1 -1
- package/index.d.ts +347 -8
- package/index.js +275 -9
- package/index.js.map +1 -1
- package/package.json +1 -1
package/index.cjs.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var child_process = require('child_process');
|
|
3
4
|
var neetoCist = require('@bigbinary/neeto-cist');
|
|
4
5
|
var faker = require('@faker-js/faker');
|
|
5
6
|
var require$$0$4 = require('fs');
|
|
@@ -9,7 +10,6 @@ var test = require('@playwright/test');
|
|
|
9
10
|
var playwrightI18nextFixture = require('playwright-i18next-fixture');
|
|
10
11
|
var require$$0$3 = require('util');
|
|
11
12
|
var ramda = require('ramda');
|
|
12
|
-
var child_process = require('child_process');
|
|
13
13
|
var dayjs = require('dayjs');
|
|
14
14
|
var require$$0$7 = require('stream');
|
|
15
15
|
var node_module = require('node:module');
|
|
@@ -133,7 +133,7 @@ const NEETO_ROUTES = {
|
|
|
133
133
|
imageUploader: "/neeto_image_uploader_engine",
|
|
134
134
|
};
|
|
135
135
|
const PROFILE_LINKS = {
|
|
136
|
-
neetoStatus: "https://neetostatus.com/",
|
|
136
|
+
neetoStatus: "https://www.neetostatus.com/",
|
|
137
137
|
neetoCommunity: "https://www.launchpass.com/neetohq",
|
|
138
138
|
};
|
|
139
139
|
|
|
@@ -221,6 +221,91 @@ class MemberApis {
|
|
|
221
221
|
}
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
+
class RailsEmailRakeClient {
|
|
225
|
+
constructor() {
|
|
226
|
+
this.convertRawEmail = (rawEmail) => {
|
|
227
|
+
var _a;
|
|
228
|
+
return ({
|
|
229
|
+
from: rawEmail.from,
|
|
230
|
+
to: rawEmail.to,
|
|
231
|
+
cc: rawEmail.cc,
|
|
232
|
+
bcc: rawEmail.bcc,
|
|
233
|
+
replyTo: rawEmail.reply_to,
|
|
234
|
+
subject: rawEmail.subject,
|
|
235
|
+
htmlBody: rawEmail.html_body,
|
|
236
|
+
textBody: rawEmail.text_body,
|
|
237
|
+
receivedAt: rawEmail.received_at,
|
|
238
|
+
attachments: (_a = rawEmail.attachments) === null || _a === void 0 ? void 0 : _a.map(att => ({
|
|
239
|
+
name: att.filename,
|
|
240
|
+
type: att.mime_type,
|
|
241
|
+
content: att.data,
|
|
242
|
+
})),
|
|
243
|
+
});
|
|
244
|
+
};
|
|
245
|
+
this.executeRakeTask = async (taskName, args = []) => {
|
|
246
|
+
var _a, _b;
|
|
247
|
+
const childProcess = child_process.spawn("bundle", ["exec", "rake", taskName, "--", ...args], {
|
|
248
|
+
cwd: this.workingDirectory,
|
|
249
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
250
|
+
});
|
|
251
|
+
let stdout = "";
|
|
252
|
+
let stderr = "";
|
|
253
|
+
(_a = childProcess.stdout) === null || _a === void 0 ? void 0 : _a.on("data", data => {
|
|
254
|
+
stdout += data.toString();
|
|
255
|
+
});
|
|
256
|
+
(_b = childProcess.stderr) === null || _b === void 0 ? void 0 : _b.on("data", data => {
|
|
257
|
+
stderr += data.toString();
|
|
258
|
+
});
|
|
259
|
+
const exitCode = await new Promise((resolve, reject) => {
|
|
260
|
+
childProcess.on("error", reject);
|
|
261
|
+
childProcess.on("close", resolve);
|
|
262
|
+
});
|
|
263
|
+
if (exitCode !== 0) {
|
|
264
|
+
throw new Error(`Rake task ${taskName} failed: ${stderr || stdout || `Exit code ${exitCode}`}`);
|
|
265
|
+
}
|
|
266
|
+
return this.extractJsonFromOutput(stdout);
|
|
267
|
+
};
|
|
268
|
+
this.extractJsonFromOutput = (output) => {
|
|
269
|
+
const delimiterMatch = output.match(/<-- Captured Emails Start-->([\s\S]*?)<-- Captured Emails End-->/);
|
|
270
|
+
return delimiterMatch ? delimiterMatch[1].trim() : output.trim();
|
|
271
|
+
};
|
|
272
|
+
this.listEmails = async (searchParams) => {
|
|
273
|
+
try {
|
|
274
|
+
const args = this.buildSearchArgs(searchParams);
|
|
275
|
+
const output = await this.executeRakeTask("playwright:fetch_captured_emails", args);
|
|
276
|
+
if (!output)
|
|
277
|
+
return [];
|
|
278
|
+
const rawEmails = JSON.parse(output);
|
|
279
|
+
return rawEmails.map(this.convertRawEmail);
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
console.error("Failed to fetch emails:", error);
|
|
283
|
+
return [];
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
this.buildSearchArgs = (searchParams) => Object.entries(neetoCist.keysToSnakeCase(searchParams !== null && searchParams !== void 0 ? searchParams : {}))
|
|
287
|
+
.filter(([, value]) => value != null && value !== "")
|
|
288
|
+
.map(([key, value]) => `--${key}=${value}`);
|
|
289
|
+
this.getLatestEmail = async (searchParams) => {
|
|
290
|
+
const emails = await this.listEmails(searchParams);
|
|
291
|
+
if (emails.length === 0)
|
|
292
|
+
return null;
|
|
293
|
+
return emails.reduce((latest, current) => new Date(current.receivedAt) > new Date(latest.receivedAt)
|
|
294
|
+
? current
|
|
295
|
+
: latest);
|
|
296
|
+
};
|
|
297
|
+
this.clearEmails = async () => {
|
|
298
|
+
try {
|
|
299
|
+
await this.executeRakeTask("playwright:clear_captured_emails");
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
console.error("Failed to clear emails:", error);
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
this.workingDirectory = process.env.RAILS_ROOT || "..";
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
224
309
|
class RoleApis {
|
|
225
310
|
constructor(neetoPlaywrightUtilities) {
|
|
226
311
|
this.neetoPlaywrightUtilities = neetoPlaywrightUtilities;
|
|
@@ -57361,6 +57446,168 @@ const hexToRGB = (hex) => {
|
|
|
57361
57446
|
return `rgb(${Number(r)}, ${Number(g)}, ${Number(b)})`;
|
|
57362
57447
|
};
|
|
57363
57448
|
|
|
57449
|
+
class RailsEmailUtils {
|
|
57450
|
+
constructor(neetoPlaywrightUtilities) {
|
|
57451
|
+
this.neetoPlaywrightUtilities = neetoPlaywrightUtilities;
|
|
57452
|
+
this.convertRailsEmailToFormattedList = (railsEmail) => {
|
|
57453
|
+
var _a;
|
|
57454
|
+
if (!railsEmail)
|
|
57455
|
+
return null;
|
|
57456
|
+
const LINK_REGEX = /(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])/g;
|
|
57457
|
+
const CODE_REGEX = /(?<![#/])\b\d{4,}\b/g;
|
|
57458
|
+
const htmlBody = railsEmail.htmlBody || "";
|
|
57459
|
+
const textBody = railsEmail.textBody || "";
|
|
57460
|
+
const htmlBodyWithStrippedHead = htmlBody.split("</head>").at(-1) || htmlBody;
|
|
57461
|
+
const extractMatches = (text, regex) => text.match(regex) || null;
|
|
57462
|
+
const parseEmailAddress = (address) => {
|
|
57463
|
+
if (!address)
|
|
57464
|
+
return [];
|
|
57465
|
+
const addresses = Array.isArray(address) ? address : [address];
|
|
57466
|
+
return addresses.map(addr => {
|
|
57467
|
+
const match = addr.match(/^(.+?)\s*<(.+?)>$|^(.+)$/);
|
|
57468
|
+
return match
|
|
57469
|
+
? {
|
|
57470
|
+
name: match[1] || match[3] || "",
|
|
57471
|
+
email: match[2] || match[3] || addr,
|
|
57472
|
+
}
|
|
57473
|
+
: { name: "", email: addr };
|
|
57474
|
+
});
|
|
57475
|
+
};
|
|
57476
|
+
return {
|
|
57477
|
+
html: {
|
|
57478
|
+
body: htmlBody,
|
|
57479
|
+
links: extractMatches(htmlBodyWithStrippedHead, LINK_REGEX),
|
|
57480
|
+
codes: extractMatches(htmlBodyWithStrippedHead, CODE_REGEX),
|
|
57481
|
+
},
|
|
57482
|
+
text: {
|
|
57483
|
+
body: textBody,
|
|
57484
|
+
links: extractMatches(textBody, LINK_REGEX),
|
|
57485
|
+
codes: extractMatches(textBody, CODE_REGEX),
|
|
57486
|
+
},
|
|
57487
|
+
id: `${railsEmail.receivedAt}-${Math.random().toString(36).substring(2, 9)}`,
|
|
57488
|
+
from: parseEmailAddress(railsEmail.from),
|
|
57489
|
+
to: parseEmailAddress(railsEmail.to),
|
|
57490
|
+
cc: parseEmailAddress(railsEmail.cc),
|
|
57491
|
+
bcc: parseEmailAddress(railsEmail.bcc),
|
|
57492
|
+
replyTo: parseEmailAddress(railsEmail.replyTo),
|
|
57493
|
+
received: new Date(railsEmail.receivedAt).toISOString(),
|
|
57494
|
+
subject: railsEmail.subject,
|
|
57495
|
+
attachments: ((_a = railsEmail.attachments) === null || _a === void 0 ? void 0 : _a.map(att => ({
|
|
57496
|
+
name: att.name,
|
|
57497
|
+
type: att.type,
|
|
57498
|
+
}))) || [],
|
|
57499
|
+
blobId: "",
|
|
57500
|
+
};
|
|
57501
|
+
};
|
|
57502
|
+
this.clearEmails = () => this.railsEmailRakeClient.clearEmails();
|
|
57503
|
+
this.getLatestEmail = (searchParams) => this.railsEmailRakeClient.getLatestEmail(searchParams);
|
|
57504
|
+
this.listEmails = (searchParams) => this.railsEmailRakeClient.listEmails(searchParams);
|
|
57505
|
+
this.listMessages = async (messageSearchCriteria = {}, { receivedAfter = new Date(new Date().valueOf() - 60 * 60 * 1000), } = {}) => {
|
|
57506
|
+
const emails = await this.railsEmailRakeClient.listEmails({
|
|
57507
|
+
...messageSearchCriteria,
|
|
57508
|
+
receivedAfter: receivedAfter.toISOString(),
|
|
57509
|
+
});
|
|
57510
|
+
return emails
|
|
57511
|
+
.map(email => this.convertRailsEmailToFormattedList(email))
|
|
57512
|
+
.filter((email) => email !== null);
|
|
57513
|
+
};
|
|
57514
|
+
this.findMessage = async (messageSearchCriteria = {}, { timeout = 10000, receivedAfter = new Date(new Date().valueOf() - 60 * 60 * 1000), expectedEmailCount = 1, } = {}, shouldThrowErrorOnTimeout = true) => {
|
|
57515
|
+
const email = (await this.neetoPlaywrightUtilities.executeRecursively({
|
|
57516
|
+
callback: async () => {
|
|
57517
|
+
const railsEmail = await this.railsEmailRakeClient.getLatestEmail({
|
|
57518
|
+
...messageSearchCriteria,
|
|
57519
|
+
receivedAfter: receivedAfter.toISOString(),
|
|
57520
|
+
});
|
|
57521
|
+
if (!railsEmail)
|
|
57522
|
+
return null;
|
|
57523
|
+
return this.convertRailsEmailToFormattedList(railsEmail);
|
|
57524
|
+
},
|
|
57525
|
+
condition: async () => {
|
|
57526
|
+
const emails = await this.railsEmailRakeClient.listEmails({
|
|
57527
|
+
...messageSearchCriteria,
|
|
57528
|
+
receivedAfter: receivedAfter.toISOString(),
|
|
57529
|
+
});
|
|
57530
|
+
return emails.length >= expectedEmailCount;
|
|
57531
|
+
},
|
|
57532
|
+
timeout,
|
|
57533
|
+
}));
|
|
57534
|
+
if (!email) {
|
|
57535
|
+
if (shouldThrowErrorOnTimeout && expectedEmailCount > 0) {
|
|
57536
|
+
throw new Error("Timed out waiting for matching message");
|
|
57537
|
+
}
|
|
57538
|
+
return {};
|
|
57539
|
+
}
|
|
57540
|
+
return email;
|
|
57541
|
+
};
|
|
57542
|
+
this.findOtpFromEmail = async ({ email, subjectSubstring = OTP_EMAIL_PATTERN, timeout = 10000, receivedAfter = new Date(), expectedEmailCount = 1, }) => {
|
|
57543
|
+
const otp = await this.neetoPlaywrightUtilities.executeRecursively({
|
|
57544
|
+
callback: async () => {
|
|
57545
|
+
var _a, _b;
|
|
57546
|
+
const railsEmail = await this.railsEmailRakeClient.getLatestEmail({
|
|
57547
|
+
to: email,
|
|
57548
|
+
subject: subjectSubstring,
|
|
57549
|
+
receivedAfter: receivedAfter.toISOString(),
|
|
57550
|
+
});
|
|
57551
|
+
if (!railsEmail)
|
|
57552
|
+
return null;
|
|
57553
|
+
const formattedEmail = this.convertRailsEmailToFormattedList(railsEmail);
|
|
57554
|
+
if (!formattedEmail)
|
|
57555
|
+
return null;
|
|
57556
|
+
return ((_a = formattedEmail.html.codes) === null || _a === void 0 ? void 0 : _a[0]) || ((_b = formattedEmail.text.codes) === null || _b === void 0 ? void 0 : _b[0]);
|
|
57557
|
+
},
|
|
57558
|
+
condition: async () => {
|
|
57559
|
+
const emails = await this.railsEmailRakeClient.listEmails({
|
|
57560
|
+
to: email,
|
|
57561
|
+
subject: subjectSubstring,
|
|
57562
|
+
receivedAfter: receivedAfter.toISOString(),
|
|
57563
|
+
});
|
|
57564
|
+
return emails.length >= expectedEmailCount;
|
|
57565
|
+
},
|
|
57566
|
+
timeout,
|
|
57567
|
+
});
|
|
57568
|
+
return otp || undefined;
|
|
57569
|
+
};
|
|
57570
|
+
this.getEmailAttachment = async (attachmentName, messageSearchCriteria = {}, { receivedAfter = new Date(new Date().valueOf() - 60 * 60 * 1000), expectedEmailCount = 1, timeout = 10000, } = {}, shouldThrowErrorOnTimeout = true) => {
|
|
57571
|
+
const attachmentDetails = (await this.neetoPlaywrightUtilities.executeRecursively({
|
|
57572
|
+
callback: async () => {
|
|
57573
|
+
var _a;
|
|
57574
|
+
const railsEmail = await this.railsEmailRakeClient.getLatestEmail({
|
|
57575
|
+
...messageSearchCriteria,
|
|
57576
|
+
receivedAfter: receivedAfter.toISOString(),
|
|
57577
|
+
});
|
|
57578
|
+
if (!railsEmail)
|
|
57579
|
+
return null;
|
|
57580
|
+
const attachment = (_a = railsEmail.attachments) === null || _a === void 0 ? void 0 : _a.find(att => att.name.includes(attachmentName));
|
|
57581
|
+
if (!attachment)
|
|
57582
|
+
return null;
|
|
57583
|
+
return {
|
|
57584
|
+
filename: attachment.name,
|
|
57585
|
+
type: attachment.type,
|
|
57586
|
+
content: Buffer.from(attachment.content, "base64"),
|
|
57587
|
+
contentType: attachment.type,
|
|
57588
|
+
};
|
|
57589
|
+
},
|
|
57590
|
+
condition: async () => {
|
|
57591
|
+
const emails = await this.railsEmailRakeClient.listEmails({
|
|
57592
|
+
...messageSearchCriteria,
|
|
57593
|
+
receivedAfter: receivedAfter.toISOString(),
|
|
57594
|
+
});
|
|
57595
|
+
return emails.length >= expectedEmailCount;
|
|
57596
|
+
},
|
|
57597
|
+
timeout,
|
|
57598
|
+
}));
|
|
57599
|
+
if (!attachmentDetails) {
|
|
57600
|
+
if (shouldThrowErrorOnTimeout) {
|
|
57601
|
+
throw new Error("Timed out waiting for matching message or attachment not found");
|
|
57602
|
+
}
|
|
57603
|
+
return undefined;
|
|
57604
|
+
}
|
|
57605
|
+
return attachmentDetails;
|
|
57606
|
+
};
|
|
57607
|
+
this.railsEmailRakeClient = new RailsEmailRakeClient();
|
|
57608
|
+
}
|
|
57609
|
+
}
|
|
57610
|
+
|
|
57364
57611
|
const dateTimeOneHourAgo = () => new Date(new Date().valueOf() - 60 * 60 * 1000);
|
|
57365
57612
|
class MailerUtils {
|
|
57366
57613
|
constructor(neetoPlaywrightUtilities) {
|
|
@@ -57404,8 +57651,10 @@ class MailerUtils {
|
|
|
57404
57651
|
const emailBodyWithStrippedHead = emailBody.split("</head>").at(-1);
|
|
57405
57652
|
const links = emailBodyWithStrippedHead.match(LINK_REGEX);
|
|
57406
57653
|
const codes = emailBodyWithStrippedHead.match(CODE_REGEX);
|
|
57654
|
+
// Remove first and last links as Fastmail adds dot image links
|
|
57655
|
+
const filteredLinks = links && links.length > 2 ? links.slice(1, -1) : links;
|
|
57407
57656
|
const contentRecognitions = {
|
|
57408
|
-
links:
|
|
57657
|
+
links: filteredLinks,
|
|
57409
57658
|
codes: codes && [...codes],
|
|
57410
57659
|
};
|
|
57411
57660
|
const html = { body: emailBody, ...contentRecognitions };
|
|
@@ -57433,6 +57682,9 @@ class MailerUtils {
|
|
|
57433
57682
|
return formattedList;
|
|
57434
57683
|
};
|
|
57435
57684
|
this.listMessages = async (messageSearchCriteria = {}, listMessagesFilterCriteria = {}) => {
|
|
57685
|
+
if (IS_DEV_ENV) {
|
|
57686
|
+
return this.railsEmailUtils.listMessages(messageSearchCriteria, listMessagesFilterCriteria);
|
|
57687
|
+
}
|
|
57436
57688
|
const { ids } = await this.queryEmail(messageSearchCriteria, listMessagesFilterCriteria);
|
|
57437
57689
|
return this.getEmails(ids);
|
|
57438
57690
|
};
|
|
@@ -57460,12 +57712,24 @@ class MailerUtils {
|
|
|
57460
57712
|
return ids;
|
|
57461
57713
|
};
|
|
57462
57714
|
this.findMessage = async (messageSearchCriteria = {}, { timeout = 10000, receivedAfter = dateTimeOneHourAgo(), expectedEmailCount = 1, } = {}, shouldThrowErrorOnTimeout = true) => {
|
|
57715
|
+
if (IS_DEV_ENV) {
|
|
57716
|
+
return this.railsEmailUtils.findMessage(messageSearchCriteria, { receivedAfter, expectedEmailCount, timeout: timeout / 3 }, shouldThrowErrorOnTimeout);
|
|
57717
|
+
}
|
|
57463
57718
|
const ids = await this.getEmailIds(messageSearchCriteria, { expectedEmailCount, receivedAfter, timeout }, shouldThrowErrorOnTimeout);
|
|
57464
57719
|
const emails = await this.getEmails(ids);
|
|
57465
57720
|
const filteredEmails = emails.filter(email => this.matchesCriteria(email, messageSearchCriteria));
|
|
57466
57721
|
return filteredEmails[0] || {};
|
|
57467
57722
|
};
|
|
57468
57723
|
this.findOtpFromEmail = async ({ email, subjectSubstring = OTP_EMAIL_PATTERN, timeout = 2 * 60 * 1000, receivedAfter = new Date(), expectedEmailCount = 1, }) => {
|
|
57724
|
+
if (IS_DEV_ENV) {
|
|
57725
|
+
return this.railsEmailUtils.findOtpFromEmail({
|
|
57726
|
+
email,
|
|
57727
|
+
subjectSubstring,
|
|
57728
|
+
receivedAfter,
|
|
57729
|
+
expectedEmailCount,
|
|
57730
|
+
timeout: timeout / 3,
|
|
57731
|
+
});
|
|
57732
|
+
}
|
|
57469
57733
|
if (!this.accountId) {
|
|
57470
57734
|
await this.fastmailApi.authorizeAndSetAccountId();
|
|
57471
57735
|
}
|
|
@@ -57474,6 +57738,9 @@ class MailerUtils {
|
|
|
57474
57738
|
};
|
|
57475
57739
|
this.generateRandomEmail = () => faker.faker.internet.email({ provider: process.env.FASTMAIL_DOMAIN_NAME });
|
|
57476
57740
|
this.getEmailAttachment = async (attachmentName, messageSearchCriteria = {}, { timeout = 10000, receivedAfter = dateTimeOneHourAgo(), expectedEmailCount = 1, } = {}, shouldThrowErrorOnTimeout = true) => {
|
|
57741
|
+
if (IS_DEV_ENV) {
|
|
57742
|
+
return this.railsEmailUtils.getEmailAttachment(attachmentName, messageSearchCriteria, { receivedAfter, expectedEmailCount, timeout: timeout / 3 }, shouldThrowErrorOnTimeout);
|
|
57743
|
+
}
|
|
57477
57744
|
const { blobId, attachments: attachmentNameAndTypes } = await this.findMessage(messageSearchCriteria, { expectedEmailCount, receivedAfter, timeout }, shouldThrowErrorOnTimeout);
|
|
57478
57745
|
const attachment = attachmentNameAndTypes.find(attachment => attachment.name.includes(attachmentName));
|
|
57479
57746
|
if (!attachment)
|
|
@@ -57485,6 +57752,7 @@ class MailerUtils {
|
|
|
57485
57752
|
return attachments.find(attachment => attachment.filename.includes(attachmentName));
|
|
57486
57753
|
};
|
|
57487
57754
|
this.fastmailApi = new FastmailApi(neetoPlaywrightUtilities);
|
|
57755
|
+
this.railsEmailUtils = new RailsEmailUtils(neetoPlaywrightUtilities);
|
|
57488
57756
|
}
|
|
57489
57757
|
matchesCriteria(email, criteria) {
|
|
57490
57758
|
const { to, from, subject, body } = criteria;
|
|
@@ -114031,7 +114299,7 @@ const GOOGLE_LOGIN_TEXTS = {
|
|
|
114031
114299
|
const ENGAGE_TEXTS = { subscribe: "Subscribe" };
|
|
114032
114300
|
const COMMUNITY_TEXTS = { joinNow: "Join Now" };
|
|
114033
114301
|
const STATUS_TEXTS = {
|
|
114034
|
-
|
|
114302
|
+
appName: (appName) => `Neeto${appName}`,
|
|
114035
114303
|
};
|
|
114036
114304
|
const COMMON_TEXTS = {
|
|
114037
114305
|
skipCleanup: "@SKIP_CLEANUP",
|
|
@@ -114424,9 +114692,7 @@ class HelpAndProfilePage {
|
|
|
114424
114692
|
await statusPage.waitForLoadState();
|
|
114425
114693
|
await Promise.all([
|
|
114426
114694
|
test.expect(statusPage).toHaveURL(PROFILE_LINKS.neetoStatus),
|
|
114427
|
-
test.expect(statusPage.
|
|
114428
|
-
exact: true,
|
|
114429
|
-
})).toBeVisible(),
|
|
114695
|
+
test.expect(statusPage.getByRole("link", { name: STATUS_TEXTS.appName(appName) })).toBeVisible(),
|
|
114430
114696
|
]);
|
|
114431
114697
|
});
|
|
114432
114698
|
};
|
|
@@ -114460,7 +114726,7 @@ class HelpAndProfilePage {
|
|
|
114460
114726
|
return;
|
|
114461
114727
|
const actionName = plan === "Free" ? "Upgrade" : "Downgrade";
|
|
114462
114728
|
const productRow = this.page.getByRole("row", {
|
|
114463
|
-
name:
|
|
114729
|
+
name: STATUS_TEXTS.appName(product),
|
|
114464
114730
|
});
|
|
114465
114731
|
await Promise.all([
|
|
114466
114732
|
test.expect(productRow.getByRole("cell", { name: plan })).toBeVisible(),
|
|
@@ -124972,6 +125238,8 @@ exports.PROFILE_SECTION_SELECTORS = PROFILE_SECTION_SELECTORS;
|
|
|
124972
125238
|
exports.PROJECT_TRANSLATIONS_PATH = PROJECT_TRANSLATIONS_PATH;
|
|
124973
125239
|
exports.ROLES_SELECTORS = ROLES_SELECTORS;
|
|
124974
125240
|
exports.ROUTES = ROUTES;
|
|
125241
|
+
exports.RailsEmailRakeClient = RailsEmailRakeClient;
|
|
125242
|
+
exports.RailsEmailUtils = RailsEmailUtils;
|
|
124975
125243
|
exports.RoleApis = RoleApis;
|
|
124976
125244
|
exports.RolesPage = RolesPage;
|
|
124977
125245
|
exports.SIGNUP_SELECTORS = SIGNUP_SELECTORS;
|