@bigbinary/neeto-playwright-commons 1.20.5 → 1.21.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/index.js CHANGED
@@ -225,6 +225,7 @@ const CREDENTIALS = {
225
225
  };
226
226
  const OTP_EMAIL_PATTERN = "is your login code";
227
227
  const SLACK_DEFAULT_CHANNEL = "general";
228
+ const CUSTOM_DOMAIN_SUFFIX = "aceinvoice.com";
228
229
  const ZAPIER_TEST_EMAIL = (product) => `neeto-${product}-zapier-test@${process.env.FASTMAIL_DOMAIN_NAME}`;
229
230
  // constants for translation
230
231
  const SINGULAR = { count: 1 };
@@ -321,6 +322,11 @@ const skipTest = {
321
322
  },
322
323
  };
323
324
  const shouldSkipSetupAndTeardown = () => { var _a; return ((_a = getGlobalUserState()) === null || _a === void 0 ? void 0 : _a.isLoggedIn) && process.env.SKIP_SETUP === "true"; };
325
+ const shouldSkipCustomDomainSetup = () => process.env.SETUP_CUSTOM_DOMAIN !== "true" || !IS_STAGING_ENV;
326
+ const baseURLGenerator = (product, customSubdomain) => {
327
+ const { subdomainName } = getGlobalUserState();
328
+ return `https://${customSubdomain !== null && customSubdomain !== void 0 ? customSubdomain : subdomainName}.neeto${product.toLowerCase()}.net`;
329
+ };
324
330
  // trims and replaces multiple whitespace characters in a string with a single space
325
331
  const squish = (text) => text.trim().replace(/\s+/g, " ");
326
332
  const toCamelCase = (string) => string.toLowerCase().replace(/( \w)/g, letter => letter[1].toUpperCase());
@@ -340,6 +346,20 @@ const getListCount = async ({ page, countSelector, }) => {
340
346
  };
341
347
  const getGlobalUserProps = async (page) => (await page.evaluate(() => window.globalProps.user));
342
348
  const getClipboardContent = (page) => page.evaluate(() => navigator.clipboard.readText());
349
+ const globalShortcuts = (t) => [
350
+ {
351
+ description: t("neetoMolecules.keyboardShortcuts.global.openKeyboardShortcutsPane"),
352
+ sequence: "shift+/",
353
+ },
354
+ {
355
+ description: t("neetoMolecules.keyboardShortcuts.global.close"),
356
+ sequence: "esc",
357
+ },
358
+ {
359
+ description: t("neetoMolecules.keyboardShortcuts.global.submitForm"),
360
+ sequence: "ctrl+enter",
361
+ },
362
+ ];
343
363
 
344
364
  const optionSelector = (option) => `neeto-editor-fixed-menu-${option}-option`;
345
365
  const fixedMenuSelector = (selector) => `neeto-editor-fixed-menu-${selector}`;
@@ -807,6 +827,7 @@ const CUSTOM_DOMAIN_SELECTORS = {
807
827
  editCustomDomainButton: "edit-custom-domain-button",
808
828
  deleteCustomDomainButton: "delete-custom-domain-button",
809
829
  dropdownButton: "custom-domains-more-dropdown-button",
830
+ activeTagContainer: "active-tag-container",
810
831
  };
811
832
  const API_KEYS_SELECTORS = {
812
833
  editApiKeyButton: "api-key-edit-button",
@@ -188515,12 +188536,12 @@ class ThankYouPage {
188515
188536
  class EmbedBase {
188516
188537
  constructor({ context, page, neetoPlaywrightUtilities, appName, }) {
188517
188538
  /**
188518
- * @deprecated This method is deprecated. Use initializeEmbedPageV2 instead.
188539
+ * @deprecated This method is deprecated. Use initializeEmbedPage instead.
188519
188540
  */
188520
- this.initializeEmbedPage = async ({ embedType, embedCode, customElementText = "Click here", }) => {
188541
+ this.initializeEmbedPageV2 = async ({ embedType, embedCode, customElementText = "Click here", }) => {
188521
188542
  this.embedTestPage = await this.context.newPage();
188522
188543
  this.embedTestPageType = embedType;
188523
- const fileContent = basicHTMLContent(this.embedTestPageType === "elementClick"
188544
+ const fileContent = basicHTMLContent(this.embedTestPageType === "elementPopup"
188524
188545
  ? `${embedCode}<a href='#' id='open-popup-button'>${customElementText}</a>`
188525
188546
  : embedCode);
188526
188547
  this.filePath = `tmp/${faker.word.noun()}.html`;
@@ -188534,7 +188555,7 @@ class EmbedBase {
188534
188555
  : EMBED_SELECTORS.iframe(this.appName));
188535
188556
  return this.embedTestPage;
188536
188557
  };
188537
- this.initializeEmbedPageV2 = async ({ embedType, embedCode, customElementText = "Click here", }) => {
188558
+ this.initializeEmbedPage = async ({ embedType, embedCode, customElementText = "Click here", }) => {
188538
188559
  this.embedTestPage = await this.context.newPage();
188539
188560
  this.embedTestPageType = embedType;
188540
188561
  const fileContent = basicHTMLContent(this.embedTestPageType === "elementPopup"
@@ -188576,33 +188597,29 @@ class EmbedBase {
188576
188597
  }).toPass({ timeout: 2 * 60 * 1000 });
188577
188598
  };
188578
188599
  /**
188579
- * @deprecated This method is deprecated. Use copyEmbedScriptV2 instead.
188600
+ * @deprecated This method is deprecated. Use copyEmbedScript instead.
188580
188601
  */
188581
- this.copyEmbedScript = async ({ embedLabel }) => {
188582
- await this.page
188583
- .getByTestId(COMMON_SELECTORS.radioLabel(embedLabel))
188584
- .check();
188602
+ this.copyEmbedScriptV2 = async (embedType) => {
188603
+ await this.selectEmbedType(embedType);
188585
188604
  await this.page.getByTestId(COMMON_SELECTORS.copyButton).click();
188586
188605
  return await this.page.evaluate(() => navigator.clipboard.readText());
188587
188606
  };
188588
- this.copyEmbedScriptV2 = async (embedType) => {
188589
- await this.selectEmbedTypeV2(embedType);
188607
+ this.copyEmbedScript = async (embedType) => {
188608
+ await this.selectEmbedType(embedType);
188590
188609
  await this.page.getByTestId(COMMON_SELECTORS.copyButton).click();
188591
188610
  return await this.page.evaluate(() => navigator.clipboard.readText());
188592
188611
  };
188593
188612
  /**
188594
- * @deprecated This method is deprecated. Use selectEmbedTypeV2 instead.
188613
+ * @deprecated This method is deprecated. Use selectEmbedType instead.
188595
188614
  */
188596
- this.selectEmbedType = async (embedLabel) => {
188597
- await this.page.getByTestId(EMBED_SELECTORS.htmlTab).click();
188598
- await this.page
188599
- .getByTestId(COMMON_SELECTORS.radioLabel(embedLabel))
188600
- .check();
188601
- };
188602
188615
  this.selectEmbedTypeV2 = async (embedType) => {
188603
188616
  await this.page.locator(EMBED_SELECTORS.embedSelector(embedType)).click();
188604
188617
  await this.neetoPlaywrightUtilities.waitForPageLoad();
188605
188618
  };
188619
+ this.selectEmbedType = async (embedType) => {
188620
+ await this.page.locator(EMBED_SELECTORS.embedSelector(embedType)).click();
188621
+ await this.neetoPlaywrightUtilities.waitForPageLoad();
188622
+ };
188606
188623
  this.verifyInlineCustomization = async ({ headingTestId,
188607
188624
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
188608
188625
  inlineEmbedInterceptParams, customizationOptions, }) => {
@@ -188712,10 +188729,7 @@ class EmbedBase {
188712
188729
  .fill(customizationOptions.customId);
188713
188730
  await expect(this.codeBlock).toContainText(`elementSelector: "#${customizationOptions.customId}"`);
188714
188731
  (await this.previewTab.isVisible()) && (await this.previewTab.click());
188715
- await Promise.all([
188716
- expect(this.page.getByTestId(EMBED_SELECTORS.previewElementPopupButton)).toBeVisible(),
188717
- await expect(this.page.locator(`#${customizationOptions.customId}`)).toBeVisible(),
188718
- ]);
188732
+ await expect(this.page.getByTestId(EMBED_SELECTORS.previewElementPopupButton)).toBeVisible();
188719
188733
  await this.backToEmbedSelection();
188720
188734
  };
188721
188735
  this.expectMultipleTextsInCodeblock = async (containTextOptions) => {
@@ -188760,6 +188774,14 @@ const ROUTES = {
188760
188774
  attachment: `/neeto_editor${BASE_URL}/direct_uploads/attach`,
188761
188775
  dashboard: "/dashboard",
188762
188776
  neetoThankYou: "/neeto_thank_you_engine",
188777
+ adminPanel: {
188778
+ roles: "/admin/admin-panel/roles",
188779
+ index: "/admin/admin-panel",
188780
+ auditLogs: "/admin/admin-panel/audit-logs",
188781
+ apiKeys: "/admin/admin-panel/apiKeys",
188782
+ customDomain: "/admin/admin-panel/custom-domain",
188783
+ ipRestriction: "/admin/admin-panel/ip-restriction",
188784
+ },
188763
188785
  };
188764
188786
  const API_ROUTES = {
188765
188787
  teamMembers: {
@@ -188856,7 +188878,6 @@ const ZAPIER_WEB_TEXTS = {
188856
188878
  welcomeText: (zapierLoginEmail) => `Welcome back ${zapierLoginEmail}`,
188857
188879
  connectStagingApp: (appName) => `Connect ${appName} Staging`,
188858
188880
  zapierWorkflowTriggered: "Zapier Workflow Triggered",
188859
- confirmPublishing: "Confirm Publishing",
188860
188881
  startFreeWithEmail: "Start free with email",
188861
188882
  appsByTitle: "Apps by title",
188862
188883
  logIn: "Log in",
@@ -188913,6 +188934,9 @@ const ORGANIZATION_TEXTS = {
188913
188934
  class HelpAndProfilePage {
188914
188935
  constructor({ page, neetoPlaywrightUtilities, chatApiBaseURL, kbDocsBaseURL, changelogBaseURL, }) {
188915
188936
  this.hoverOnBody = () => this.page.locator("body").hover();
188937
+ /**
188938
+ * @deprecated This method is deprecated. Use openHelpCenter instead.
188939
+ */
188916
188940
  this.openHelpCenterV2 = async () => {
188917
188941
  await expect(async () => {
188918
188942
  await this.hoverOnBody();
@@ -188922,9 +188946,18 @@ class HelpAndProfilePage {
188922
188946
  await expect(this.page.getByTestId(HELP_CENTER_SELECTORS.chatButton)).toBeVisible();
188923
188947
  }).toPass({ timeout: 15000 });
188924
188948
  };
188949
+ this.openHelpCenter = async () => {
188950
+ await expect(async () => {
188951
+ await this.hoverOnBody();
188952
+ const floatingActionMenuButton = this.page.getByTestId(COMMON_SELECTORS.floatingActionMenuButton);
188953
+ await floatingActionMenuButton.scrollIntoViewIfNeeded();
188954
+ await floatingActionMenuButton.hover();
188955
+ await expect(this.page.getByTestId(HELP_CENTER_SELECTORS.chatButton)).toBeVisible();
188956
+ }).toPass({ timeout: 15000 });
188957
+ };
188925
188958
  this.openLiveChatAndVerify = async (widgetVisibilityTimeout = 10000) => {
188926
188959
  await expect(async () => {
188927
- await this.openHelpCenterV2();
188960
+ await this.openHelpCenter();
188928
188961
  await this.page.getByTestId(HELP_CENTER_SELECTORS.chatButton).click();
188929
188962
  await expect(this.neetoChatWidget).toBeVisible({
188930
188963
  timeout: widgetVisibilityTimeout,
@@ -188935,6 +188968,9 @@ class HelpAndProfilePage {
188935
188968
  });
188936
188969
  }).toPass({ timeout: 35000 + widgetVisibilityTimeout * 2 });
188937
188970
  };
188971
+ /**
188972
+ * @deprecated This method is deprecated. Use openAndVerifyChatWidget instead.
188973
+ */
188938
188974
  this.openAndVerifyChatWidgetV2 = async () => {
188939
188975
  await this.page.reload();
188940
188976
  await this.neetoPlaywrightUtilities.waitForPageLoad();
@@ -188948,6 +188984,22 @@ class HelpAndProfilePage {
188948
188984
  })).toBeVisible({ timeout: 35000 });
188949
188985
  });
188950
188986
  };
188987
+ this.openAndVerifyChatWidget = async () => {
188988
+ await this.page.reload();
188989
+ await this.neetoPlaywrightUtilities.waitForPageLoad();
188990
+ await test$2.step("Step 1: Open live chat and verify iframe", () => this.openLiveChatAndVerify());
188991
+ await test$2.step("Step 2: Close and reopen live chat frame", async () => {
188992
+ await this.page.getByTestId(CHAT_WIDGET_SELECTORS.closeChat).click();
188993
+ await expect(this.neetoChatWidget).toBeHidden({ timeout: 35000 });
188994
+ await this.openLiveChatAndVerify();
188995
+ await expect(this.neetoChatFrame.getByRole("button", {
188996
+ name: CHAT_WIDGET_TEXTS.newConversation,
188997
+ })).toBeVisible({ timeout: 35000 });
188998
+ });
188999
+ };
189000
+ /**
189001
+ * @deprecated This method is deprecated. Use openAndVerifyHelpArticles instead.
189002
+ */
188951
189003
  this.openAndVerifyHelpArticlesV2 = async () => {
188952
189004
  await test$2.step("Step 1: Open Help Center links", this.openHelpCenterV2);
188953
189005
  await test$2.step("Step 2: Open and verify help articles link", async () => {
@@ -188961,21 +189013,36 @@ class HelpAndProfilePage {
188961
189013
  await helpArticlesPage.close();
188962
189014
  });
188963
189015
  };
188964
- this.openChangelogPaneV2 = async () => {
189016
+ this.openAndVerifyHelpArticles = async () => {
189017
+ await test$2.step("Step 1: Open Help Center links", this.openHelpCenter);
189018
+ await test$2.step("Step 2: Open and verify help articles link", async () => {
189019
+ const helpArticlesPromise = this.page.waitForEvent("popup");
189020
+ await this.page
189021
+ .getByTestId(HELP_CENTER_SELECTORS.documentationButton)
189022
+ .click();
189023
+ const helpArticlesPage = await helpArticlesPromise;
189024
+ await helpArticlesPage.waitForLoadState();
189025
+ await expect(helpArticlesPage).toHaveURL(this.kbDocsBaseURL);
189026
+ });
189027
+ };
189028
+ this.openChangelogPane = async () => {
188965
189029
  await expect(async () => {
188966
- await this.openHelpCenterV2();
189030
+ await this.openHelpCenter();
188967
189031
  await this.page.getByTestId(HELP_CENTER_SELECTORS.whatsNewButton).click();
188968
189032
  await expect(this.page.locator(CHANGELOG_WIDGET_SELECTORS.changelogWrapper)).toBeVisible();
188969
189033
  }).toPass({ timeout: 45000 });
188970
189034
  };
189035
+ /**
189036
+ * @deprecated This method is deprecated. Use openAndVerifyChangelog instead.
189037
+ */
188971
189038
  this.openAndVerifyChangelogV2 = async () => {
188972
- await test$2.step("Step 1: Open Help Center links and changelog", this.openChangelogPaneV2);
189039
+ await test$2.step("Step 1: Open Help Center links and changelog", this.openChangelogPane);
188973
189040
  await test$2.step("Step 2: Close and reopen changelog pane", async () => {
188974
189041
  await this.page
188975
189042
  .getByTestId(CHANGELOG_WIDGET_SELECTORS.closeButton)
188976
189043
  .click();
188977
189044
  await expect(this.page.locator(CHANGELOG_WIDGET_SELECTORS.changelogWrapper)).toBeHidden();
188978
- await this.openChangelogPaneV2();
189045
+ await this.openChangelogPane();
188979
189046
  });
188980
189047
  await test$2.step("Step 3: Open and verify public URL", async () => {
188981
189048
  const changelogPagePromise = this.page.waitForEvent("popup");
@@ -188988,6 +189055,25 @@ class HelpAndProfilePage {
188988
189055
  await changelogPage.close();
188989
189056
  });
188990
189057
  };
189058
+ this.openAndVerifyChangelog = async () => {
189059
+ await test$2.step("Step 1: Open Help Center links and changelog", this.openChangelogPane);
189060
+ await test$2.step("Step 2: Close and reopen changelog pane", async () => {
189061
+ await this.page
189062
+ .getByTestId(CHANGELOG_WIDGET_SELECTORS.closeButton)
189063
+ .click();
189064
+ await expect(this.page.locator(CHANGELOG_WIDGET_SELECTORS.changelogWrapper)).toBeHidden();
189065
+ await this.openChangelogPane();
189066
+ });
189067
+ await test$2.step("Step 3: Open and verify public URL", async () => {
189068
+ const changelogPagePromise = this.page.waitForEvent("popup");
189069
+ await this.page
189070
+ .getByTestId(CHANGELOG_WIDGET_SELECTORS.publicUrlLink)
189071
+ .click();
189072
+ const changelogPage = await changelogPagePromise;
189073
+ await expect(changelogPage.getByRole("button", { name: ENGAGE_TEXTS.subscribe })).toBeVisible();
189074
+ await expect(changelogPage).toHaveURL(this.changelogBaseURL);
189075
+ });
189076
+ };
188991
189077
  this.formatKeyboardShortcut = (shortcut, osPlatform = "windows") => {
188992
189078
  const formattedShortcut = shortcut
188993
189079
  .replaceAll(" ", "then")
@@ -188996,6 +189082,9 @@ class HelpAndProfilePage {
188996
189082
  ? formattedShortcut.replace(/ctrl/g, "⌘").replace(/alt/g, "opt")
188997
189083
  : formattedShortcut;
188998
189084
  };
189085
+ /**
189086
+ * @deprecated This method is deprecated. Use openAndVerifyKeyboardShortcutsPane instead.
189087
+ */
188999
189088
  this.openAndVerifyKeyboardShortcutsPaneV2 = async (productShortcuts, osPlatform = "windows") => {
189000
189089
  const globalShortcuts = [
189001
189090
  {
@@ -189041,6 +189130,40 @@ class HelpAndProfilePage {
189041
189130
  .locator("div")).toHaveText(formattedSequences);
189042
189131
  });
189043
189132
  };
189133
+ this.openAndVerifyKeyboardShortcutsPane = async (productShortcuts, osPlatform = "windows") => {
189134
+ const shortcuts = [...globalShortcuts(this.t), ...productShortcuts];
189135
+ await test$2.step("Step 1: Open Help Center", this.openHelpCenter);
189136
+ await test$2.step("Step 2: Open and close keyboard shortcuts from UI", async () => {
189137
+ await this.page
189138
+ .getByTestId(HELP_CENTER_SELECTORS.keyboardShortcutButton)
189139
+ .click();
189140
+ await expect(this.page.getByTestId(KEYBOARD_SHORTCUTS_SELECTORS.keyboardShortcutsPane)).not.toHaveCSS("width", "1px");
189141
+ await this.page
189142
+ .getByTestId(KEYBOARD_SHORTCUTS_SELECTORS.closePaneButton)
189143
+ .click();
189144
+ await expect(this.page.getByTestId(KEYBOARD_SHORTCUTS_SELECTORS.keyboardShortcutsPane)).toHaveCSS("width", "1px");
189145
+ });
189146
+ await test$2.step("Step 3: Open and close keyboard shortcuts through shortcut", async () => {
189147
+ await this.page.keyboard.press("Shift+/");
189148
+ await expect(this.page.getByTestId(KEYBOARD_SHORTCUTS_SELECTORS.keyboardShortcutsPane)).not.toHaveCSS("width", "1px");
189149
+ await this.page.keyboard.press("Escape");
189150
+ await expect(this.page.getByTestId(KEYBOARD_SHORTCUTS_SELECTORS.keyboardShortcutsPane)).toHaveCSS("width", "1px");
189151
+ });
189152
+ await test$2.step("Step 4: Verify all displayed keyboard shortcuts", async () => {
189153
+ await this.page.keyboard.press("Shift+/");
189154
+ await expect(this.page.getByTestId(KEYBOARD_SHORTCUTS_SELECTORS.keyboardShortcutsPane)).not.toHaveCSS("width", "1px");
189155
+ await expect(this.page
189156
+ .getByTestId(KEYBOARD_SHORTCUTS_SELECTORS.hotKeyItem)
189157
+ .locator("p")).toHaveText(shortcuts.map(shortcut => shortcut.description));
189158
+ const formattedSequences = shortcuts.map(shortcut => this.formatKeyboardShortcut(shortcut.sequence, osPlatform));
189159
+ await expect(this.page
189160
+ .getByTestId(KEYBOARD_SHORTCUTS_SELECTORS.hotKeyItem)
189161
+ .locator("div")).toHaveText(formattedSequences);
189162
+ });
189163
+ };
189164
+ /**
189165
+ * @deprecated This method is deprecated. Use openAppSwitcherAndVerify instead.
189166
+ */
189044
189167
  this.openAppSwitcherAndVerifyV2 = async () => {
189045
189168
  const productName = "Playdash";
189046
189169
  const searchQueryPartial = productName.slice(0, 4).toLowerCase();
@@ -189069,45 +189192,58 @@ class HelpAndProfilePage {
189069
189192
  ]);
189070
189193
  });
189071
189194
  };
189072
- this.openAuthLinkAndVerify = async ({ linkSelector, redirectLink, }) => {
189073
- var _a, _b;
189074
- const profilePagePromise = this.page.waitForEvent("popup");
189075
- await this.page.getByTestId(linkSelector).click();
189076
- const profilePage = await profilePagePromise;
189077
- await profilePage.waitForLoadState();
189078
- await expect(profilePage).toHaveURL(new RegExp(NEETO_AUTH_BASE_URL((_b = (_a = readFileSyncIfExists()) === null || _a === void 0 ? void 0 : _a.user) === null || _b === void 0 ? void 0 : _b.subdomainName)));
189079
- await expect(profilePage).toHaveURL(new RegExp(redirectLink));
189080
- await profilePage.close();
189195
+ this.openAppSwitcherAndVerify = async () => {
189196
+ const productName = "Playdash";
189197
+ const searchQueryPartial = productName.slice(0, 4).toLowerCase();
189198
+ const searchQueryFull = productName.toLowerCase();
189199
+ await test$2.step("Step 1: Verify hovering over app switcher opens the app switcher drawer", () => expect(async () => {
189200
+ await this.openHelpCenter();
189201
+ await this.page.getByTestId(COMMON_SELECTORS.appSwitcherButton).hover();
189202
+ await expect(this.page.getByTestId(COMMON_SELECTORS.appSwitcherWrapper)).toBeVisible();
189203
+ }).toPass({ timeout: 45000 }));
189204
+ await test$2.step("Step 2: Verify search functionality", async () => {
189205
+ const playdashAppLink = this.page.getByTestId(COMMON_SELECTORS.appLink(productName));
189206
+ const replayAppLink = this.page.getByTestId(COMMON_SELECTORS.appLink("Replay"));
189207
+ const searchInput = this.page.getByTestId(COMMON_SELECTORS.productSwitcherSearchInput);
189208
+ await searchInput.fill(faker.word.words(3));
189209
+ //TODO: Use data-cy label when this https://github.com/bigbinary/neeto-molecules/issues/2114 is resolved
189210
+ await expect(this.page.getByText(this.t("neetoMolecules.productSwitcher.noApps"))).toBeVisible();
189211
+ await searchInput.fill(searchQueryPartial);
189212
+ await Promise.all([
189213
+ expect(playdashAppLink).toBeVisible(),
189214
+ expect(replayAppLink).toBeVisible(),
189215
+ ]);
189216
+ await searchInput.fill(searchQueryFull);
189217
+ await Promise.all([
189218
+ expect(playdashAppLink).toBeVisible(),
189219
+ expect(replayAppLink).toBeHidden(),
189220
+ ]);
189221
+ });
189081
189222
  };
189082
- this.verifyProfileAndOrganizationLinksV2 = async () => {
189223
+ /**
189224
+ * @deprecated This method is deprecated. Use verifyLogout instead.
189225
+ */
189226
+ this.verifyLogoutV2 = async () => {
189227
+ if (shouldSkipSetupAndTeardown())
189228
+ return;
189083
189229
  await test$2.step("Step 1: Open Help center and verify", this.openHelpCenterV2);
189084
- await test$2.step("Step 2: Open My profile link and verify", async () => {
189230
+ await test$2.step("Step 2: Click logout and verify", async () => {
189085
189231
  await this.page
189086
- .getByTestId(PROFILE_SECTION_SELECTORS.myProfileButton)
189087
- .click();
189088
- const profileSidebarHeader = this.page.getByTestId(COMMON_SELECTORS.paneHeader);
189089
- await expect(profileSidebarHeader).toContainText(this.t("neetoTeamMembers.profile.common.myProfile"));
189090
- await this.openAuthLinkAndVerify({
189091
- linkSelector: PROFILE_SECTION_SELECTORS.neetoAuthLink,
189092
- redirectLink: ROUTES.myProfile,
189232
+ .getByTestId(PROFILE_SECTION_SELECTORS.logoutButton)
189233
+ .click({ timeout: 35000 });
189234
+ process.env.TEST_ENV === ENVIRONMENT.staging &&
189235
+ (await expect(this.page).toHaveURL(new RegExp(NEETO_AUTH_BASE_URL()), {
189236
+ timeout: 15000,
189237
+ }));
189238
+ await expect(this.page).toHaveURL(new RegExp(ROUTES.loginLink), {
189239
+ timeout: 15000,
189093
189240
  });
189094
- await this.page
189095
- .getByTestId(PROFILE_SECTION_SELECTORS.profileSidebarCancelButton)
189096
- .click();
189097
- await expect(profileSidebarHeader).toBeHidden();
189098
- });
189099
- await test$2.step("Step 3: Open Help center and verify", this.openHelpCenterV2);
189100
- await test$2.step("Step 4: Open My organization link and verify", async () => {
189101
- await this.page
189102
- .getByTestId(PROFILE_SECTION_SELECTORS.profileOrganizationSettingsButton)
189103
- .click();
189104
- await expect(this.page).toHaveURL(new RegExp(ROUTES.dashboard));
189105
189241
  });
189106
189242
  };
189107
- this.verifyLogoutV2 = async () => {
189243
+ this.verifyLogout = async () => {
189108
189244
  if (shouldSkipSetupAndTeardown())
189109
189245
  return;
189110
- await test$2.step("Step 1: Open Help center and verify", this.openHelpCenterV2);
189246
+ await test$2.step("Step 1: Open Help center and verify", this.openHelpCenter);
189111
189247
  await test$2.step("Step 2: Click logout and verify", async () => {
189112
189248
  await this.page
189113
189249
  .getByTestId(PROFILE_SECTION_SELECTORS.logoutButton)
@@ -189121,7 +189257,7 @@ class HelpAndProfilePage {
189121
189257
  });
189122
189258
  });
189123
189259
  };
189124
- this.openAuthLinkAndVerifyV1 = async ({ linkName, redirectLink, }) => {
189260
+ this.openAuthLinkAndVerify = async ({ linkName, redirectLink, }) => {
189125
189261
  var _a, _b;
189126
189262
  await this.page
189127
189263
  .getByTestId(COMMON_SELECTORS.pane)
@@ -189135,15 +189271,18 @@ class HelpAndProfilePage {
189135
189271
  await expect(this.page).toHaveURL(new RegExp(redirectLink));
189136
189272
  await this.page.goBack();
189137
189273
  };
189274
+ /**
189275
+ * @deprecated This method is deprecated. Use verifyProfileAndOrganizationLinks instead.
189276
+ */
189138
189277
  this.verifyProfileAndOrganizationLinksV3 = async () => {
189139
- await test$2.step("Step 1: Open Help center and verify", this.openHelpCenterV2);
189278
+ await test$2.step("Step 1: Open Help center and verify", this.openHelpCenter);
189140
189279
  await test$2.step("Step 2: Open My profile link and verify", async () => {
189141
189280
  const profileSidebarHeader = this.page.getByTestId(COMMON_SELECTORS.paneHeader);
189142
189281
  await this.page
189143
189282
  .getByTestId(PROFILE_SECTION_SELECTORS.myProfileButton)
189144
189283
  .click();
189145
189284
  await expect(profileSidebarHeader).toContainText(this.t("neetoTeamMembers.profile.common.myProfile"));
189146
- await this.openAuthLinkAndVerifyV1({
189285
+ await this.openAuthLinkAndVerify({
189147
189286
  redirectLink: ROUTES.myProfile,
189148
189287
  linkName: this.t("neetoTeamMembers.buttons.manageBillingAndSubscriptions"),
189149
189288
  });
@@ -189156,8 +189295,29 @@ class HelpAndProfilePage {
189156
189295
  await expect(this.page).toHaveURL(new RegExp(ROUTES.dashboard));
189157
189296
  });
189158
189297
  };
189298
+ this.verifyProfileAndOrganizationLinks = async () => {
189299
+ await test$2.step("Step 1: Open Help center and verify", this.openHelpCenter);
189300
+ await test$2.step("Step 2: Open My profile link and verify", async () => {
189301
+ const profileSidebarHeader = this.page.getByTestId(COMMON_SELECTORS.paneHeader);
189302
+ await this.page
189303
+ .getByTestId(PROFILE_SECTION_SELECTORS.myProfileButton)
189304
+ .click();
189305
+ await expect(profileSidebarHeader).toContainText(this.t("neetoTeamMembers.profile.common.myProfile"));
189306
+ await this.openAuthLinkAndVerify({
189307
+ redirectLink: ROUTES.myProfile,
189308
+ linkName: this.t("neetoTeamMembers.buttons.manageBillingAndSubscriptions"),
189309
+ });
189310
+ });
189311
+ await test$2.step("Step 3: Open Help center and verify", this.openHelpCenter);
189312
+ await test$2.step("Step 4: Open My organization link and verify", async () => {
189313
+ await this.page
189314
+ .getByTestId(PROFILE_SECTION_SELECTORS.profileOrganizationSettingsButton)
189315
+ .click();
189316
+ await expect(this.page).toHaveURL(new RegExp(ROUTES.dashboard));
189317
+ });
189318
+ };
189159
189319
  this.openAndVerifyStatus = async (appName) => {
189160
- await test$2.step("Step 1: Open Help Center links", this.openHelpCenterV2);
189320
+ await test$2.step("Step 1: Open Help Center links", this.openHelpCenter);
189161
189321
  await test$2.step("Step 2: Open and verify status page", async () => {
189162
189322
  const statusPagePromise = this.page.waitForEvent("popup");
189163
189323
  await this.page.getByTestId(HELP_CENTER_SELECTORS.statusButton).click();
@@ -189172,7 +189332,7 @@ class HelpAndProfilePage {
189172
189332
  });
189173
189333
  };
189174
189334
  this.openAndVerifyCommunity = async () => {
189175
- await test$2.step("Step 1: Open Help Center links", this.openHelpCenterV2);
189335
+ await test$2.step("Step 1: Open Help Center links", this.openHelpCenter);
189176
189336
  await test$2.step("Step 2: Open and verify community", async () => {
189177
189337
  const communityPagePromise = this.page.waitForEvent("popup");
189178
189338
  await this.page
@@ -191537,6 +191697,9 @@ class ZapierPage extends IntegrationBase {
191537
191697
  const testTriggerButton = this.zapierWebPage.getByRole("button", {
191538
191698
  name: ZAPIER_WEB_TEXTS.testTrigger,
191539
191699
  });
191700
+ await expect(this.zapierWebPage.locator(ZAPIER_SELECTORS.spinner)).toBeHidden({
191701
+ timeout: 25000,
191702
+ });
191540
191703
  (await testTriggerButton.isVisible()) && (await testTriggerButton.click());
191541
191704
  await expect(this.zapierWebPage.getByText(ZAPIER_WEB_TEXTS.testCurrentlyInQueue)).toBeHidden({ timeout: 20000 });
191542
191705
  await expect(this.zapierWebPage.getByLabel(ZAPIER_WEB_TEXTS.statusLabel, {
@@ -191557,14 +191720,8 @@ class ZapierPage extends IntegrationBase {
191557
191720
  .getByRole("button", { name: ZAPIER_WEB_TEXTS.publish }))
191558
191721
  .click({ timeout: 20000 });
191559
191722
  await this.zapierWebPage
191560
- .getByRole("button", { name: ZAPIER_WEB_TEXTS.confirmPublishing })
191561
- .or(this.zapierWebPage
191562
191723
  .getByRole("dialog")
191563
- .getByLabel(ZAPIER_WEB_TEXTS.publish)
191564
- .or(this.zapierWebPage.getByRole("dialog").getByRole("button", {
191565
- name: ZAPIER_WEB_TEXTS.publish,
191566
- exact: true,
191567
- })))
191724
+ .getByLabel(new RegExp(ZAPIER_WEB_TEXTS.publish, "i"))
191568
191725
  .click();
191569
191726
  await this.zapierWebPage
191570
191727
  .getByLabel(ZAPIER_WEB_TEXTS.publishingZapHeading)
@@ -192892,7 +193049,8 @@ class AuditLogsPage {
192892
193049
  }
192893
193050
 
192894
193051
  class CustomDomainPage {
192895
- constructor(page, neetoPlaywrightUtilities) {
193052
+ constructor(page, neetoPlaywrightUtilities, browser // Made optional to avoid breaking changes during the compliance release
193053
+ ) {
192896
193054
  this.addCustomDomainViaUI = async (domainName) => {
192897
193055
  const addCustomDomainButton = this.page.getByTestId(CUSTOM_DOMAIN_SELECTORS.addCustomDomainButton);
192898
193056
  await expect(addCustomDomainButton).toBeVisible();
@@ -192929,6 +193087,109 @@ class CustomDomainPage {
192929
193087
  await this.neetoPlaywrightUtilities.verifyToast();
192930
193088
  await expect(this.page.getByTestId(COMMON_SELECTORS.noDataTitle)).toBeVisible();
192931
193089
  };
193090
+ this.getCustomDomain = (newSubdomain) => {
193091
+ const { subdomainName } = getGlobalUserState();
193092
+ this.subdomain = newSubdomain !== null && newSubdomain !== void 0 ? newSubdomain : subdomainName;
193093
+ return `${this.subdomain}.${CUSTOM_DOMAIN_SUFFIX}`;
193094
+ };
193095
+ this.addCustomDomain = async (domain) => {
193096
+ await this.page
193097
+ .getByTestId(CUSTOM_DOMAIN_SELECTORS.addCustomDomainButton)
193098
+ .click();
193099
+ await this.page
193100
+ .getByTestId(CUSTOM_DOMAIN_SELECTORS.customDomainInputField)
193101
+ .fill(domain);
193102
+ await this.page
193103
+ .getByTestId(CUSTOM_DOMAIN_SELECTORS.submitCustomDomainButton)
193104
+ .click();
193105
+ };
193106
+ this.validateCustomDomain = async (domain) => {
193107
+ const validateButton = this.page.getByTestId(CUSTOM_DOMAIN_SELECTORS.customDomainValidateButton);
193108
+ await Promise.all([
193109
+ expect(validateButton).toBeVisible(),
193110
+ expect(this.page.getByTestId(COMMON_SELECTORS.paneBody).getByText(domain)).toBeVisible(),
193111
+ ]);
193112
+ await expect(async () => {
193113
+ await validateButton.click();
193114
+ await this.neetoPlaywrightUtilities.verifyToast({
193115
+ message: this.t("neetoCustomDomains.validation.successMessage"),
193116
+ });
193117
+ }).toPass({ timeout: 60000 });
193118
+ await this.neetoPlaywrightUtilities.waitForPageLoad();
193119
+ await expect(this.page.getByTestId(CUSTOM_DOMAIN_SELECTORS.activeTagContainer)).toBeVisible();
193120
+ };
193121
+ this.loginToCustomDomain = async () => {
193122
+ void this.page.close();
193123
+ const loginPage = this.loginPage;
193124
+ const { email } = getGlobalUserState();
193125
+ const loginUrl = `${this.baseURL}${ROUTES.admin}`;
193126
+ const playwrightUtils = new CustomCommands(loginPage, loginPage.request);
193127
+ const organizationPage = new OrganizationPage(loginPage, playwrightUtils);
193128
+ await loginPage.goto(loginUrl);
193129
+ await organizationPage.loginViaSSO(email);
193130
+ await expect(loginPage).toHaveURL(RegExp(loginUrl), { timeout: 15000 });
193131
+ await playwrightUtils.waitForPageLoad();
193132
+ };
193133
+ this.waitForTrustedSSL = () => expect
193134
+ .poll(() => new Promise(resolve => {
193135
+ https$1
193136
+ .get(this.baseURL, { rejectUnauthorized: true }, res => {
193137
+ res.resume();
193138
+ resolve(true);
193139
+ })
193140
+ .on("error", () => {
193141
+ resolve(false);
193142
+ });
193143
+ }), { timeout: 25000, intervals: [3000] })
193144
+ .toBe(true);
193145
+ this.saveCustomDomainState = async () => {
193146
+ const { user } = readFileSyncIfExists();
193147
+ await this.loginPage.context().storageState({ path: STORAGE_STATE });
193148
+ const mergedCredentials = mergeAll([readFileSyncIfExists(), { user }]);
193149
+ writeDataToFile(JSON.stringify(mergedCredentials, null, 2));
193150
+ updateCredentials({ key: "baseUrl", value: this.baseURL });
193151
+ updateCredentials({ key: "domain", value: CUSTOM_DOMAIN_SUFFIX });
193152
+ };
193153
+ this.setupCustomDomain = async (product) => {
193154
+ if (shouldSkipCustomDomainSetup())
193155
+ return;
193156
+ await this.connectCustomDomain(product);
193157
+ const context = await this.browser.newContext(EMPTY_STORAGE_STATE);
193158
+ this.loginPage = await context.newPage();
193159
+ await this.loginToCustomDomain();
193160
+ await this.saveCustomDomainState();
193161
+ };
193162
+ this.connectCustomDomain = async (product, subdomain) => {
193163
+ if (shouldSkipCustomDomainSetup())
193164
+ return;
193165
+ const baseURL = baseURLGenerator(product, subdomain);
193166
+ const domain = this.getCustomDomain(subdomain);
193167
+ this.baseURL = `https://${domain}`;
193168
+ await this.page.goto(`${baseURL}${ROUTES.adminPanel.customDomain}`);
193169
+ await this.neetoPlaywrightUtilities.waitForPageLoad();
193170
+ await this.addCustomDomain(domain);
193171
+ await this.validateCustomDomain(domain);
193172
+ process.env.BASE_URL = this.baseURL;
193173
+ await this.waitForTrustedSSL();
193174
+ };
193175
+ this.disconnectCustomDomain = async (product, subdomain) => {
193176
+ if (shouldSkipCustomDomainSetup())
193177
+ return;
193178
+ const baseURL = baseURLGenerator(product, subdomain);
193179
+ await this.page.goto(`${baseURL}${ROUTES.adminPanel.customDomain}`);
193180
+ await this.neetoPlaywrightUtilities.waitForPageLoad();
193181
+ await this.page.getByTestId(CUSTOM_DOMAIN_SELECTORS.dropdownButton).click();
193182
+ await this.page
193183
+ .getByTestId(CUSTOM_DOMAIN_SELECTORS.deleteCustomDomainButton)
193184
+ .click();
193185
+ await expect(this.page.getByTestId(COMMON_SELECTORS.alertTitle)).toHaveText(this.t("neetoCustomDomains.delete"));
193186
+ await this.page
193187
+ .getByTestId(COMMON_SELECTORS.alertModalSubmitButton)
193188
+ .click();
193189
+ await this.neetoPlaywrightUtilities.verifyToast();
193190
+ await expect(this.page.getByTestId(COMMON_SELECTORS.noDataTitle)).toBeVisible();
193191
+ };
193192
+ this.browser = browser;
192932
193193
  this.page = page;
192933
193194
  this.neetoPlaywrightUtilities = neetoPlaywrightUtilities;
192934
193195
  this.t = getI18nInstance().t;
@@ -195141,5 +195402,5 @@ const definePlaywrightConfig = (overrides) => {
195141
195402
  });
195142
195403
  };
195143
195404
 
195144
- export { ADMIN_PANEL_SELECTORS, API_KEYS_SELECTORS, API_ROUTES, AUDIT_LOGS_TEXTS, AdminPanelPage, ApiKeysPage, AuditLogsPage, BASE_URL, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CUSTOM_DOMAIN_SELECTORS, CustomCommands, CustomDomainPage as CustomDomainsPage, DATE_PICKER_SELECTORS, DATE_TEXTS, DESCRIPTION_EDITOR_TEXTS, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXPANDED_FONT_SIZE, EditorPage, EmbedBase, FONT_SIZE_SELECTORS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GooglePage, HELP_CENTER_SELECTORS, HelpAndProfilePage, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IS_STAGING_ENV, ImageUploader, IntegrationBase, KEYBOARD_SHORTCUTS_SELECTORS, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MailerUtils, Member, MemberApis$1 as MemberApis, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_TEXT_MODIFIER_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PLURAL, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RolesPage, SELECT_COUNTRY, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SidebarSection, SlackPage, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THIRD_PARTY_ROUTES, TOASTR_MESSAGES, TagsPage, TeamMembers, ThankYouPage, USER_AGENTS, WEBHOOK_SELECTORS, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_WEB_TEXTS, ZapierPage, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, currencyUtils, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, filterUtils, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getListCount, headerUtils, hexToRGB, hexToRGBA, hyphenize, i18nFixture, initializeCredentials, initializeTotp, isGithubIssueOpen, joinHyphenCase, joinString, login, loginWithoutSSO, networkConditions, networkThrottlingUsingCDP, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, stealth as stealthTest, tableUtils, toCamelCase, updateCredentials, writeDataToFile };
195405
+ export { ADMIN_PANEL_SELECTORS, API_KEYS_SELECTORS, API_ROUTES, AUDIT_LOGS_TEXTS, AdminPanelPage, ApiKeysPage, AuditLogsPage, BASE_URL, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CUSTOM_DOMAIN_SELECTORS, CUSTOM_DOMAIN_SUFFIX, CustomCommands, CustomDomainPage as CustomDomainsPage, DATE_PICKER_SELECTORS, DATE_TEXTS, DESCRIPTION_EDITOR_TEXTS, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXPANDED_FONT_SIZE, EditorPage, EmbedBase, FONT_SIZE_SELECTORS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GooglePage, HELP_CENTER_SELECTORS, HelpAndProfilePage, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IS_STAGING_ENV, ImageUploader, IntegrationBase, KEYBOARD_SHORTCUTS_SELECTORS, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MailerUtils, Member, MemberApis$1 as MemberApis, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_TEXT_MODIFIER_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PLURAL, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RolesPage, SELECT_COUNTRY, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SidebarSection, SlackPage, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THIRD_PARTY_ROUTES, TOASTR_MESSAGES, TagsPage, TeamMembers, ThankYouPage, USER_AGENTS, WEBHOOK_SELECTORS, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_WEB_TEXTS, ZapierPage, baseURLGenerator, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, currencyUtils, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, filterUtils, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getListCount, globalShortcuts, headerUtils, hexToRGB, hexToRGBA, hyphenize, i18nFixture, initializeCredentials, initializeTotp, isGithubIssueOpen, joinHyphenCase, joinString, login, loginWithoutSSO, networkConditions, networkThrottlingUsingCDP, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipCustomDomainSetup, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, stealth as stealthTest, tableUtils, toCamelCase, updateCredentials, writeDataToFile };
195145
195406
  //# sourceMappingURL=index.js.map