@bigbinary/neeto-playwright-commons 4.5.1 → 4.6.1

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.
Files changed (3) hide show
  1. package/index.d.ts +211 -4
  2. package/index.js +201 -36
  3. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -387,6 +387,20 @@ declare class CustomCommands {
387
387
  page,
388
388
  options
389
389
  }: SelectOptionFromDropdownParams) => Promise<void>;
390
+ selectOptionFromDropdownV1: ({
391
+ label,
392
+ value,
393
+ page,
394
+ options
395
+ }: SelectOptionFromDropdownParams) => Promise<void>;
396
+ waitForSheetOpen: () => Promise<void>;
397
+ waitForSheetClose: () => Promise<void>;
398
+ selectOptionFromDropdownV2: ({
399
+ label,
400
+ value,
401
+ page,
402
+ options
403
+ }: SelectOptionFromDropdownParams) => Promise<void>;
390
404
  /**
391
405
  *
392
406
  * Command to verify the value of a field. It can take either a single object or an array of objects, each representing a field and its expected value.
@@ -4379,6 +4393,7 @@ declare const DEFAULT_WEBHOOKS_RESPONSE_TEXT: string;
4379
4393
  *
4380
4394
  */
4381
4395
  declare const STORAGE_STATE = "./e2e/auth/user.json";
4396
+ declare const DEFAULT_TIMEZONE_ID = "Asia/Calcutta";
4382
4397
  /**
4383
4398
  *
4384
4399
  * Pattern for global translations file path.
@@ -4434,6 +4449,7 @@ declare const ZAPIER_TEST_EMAIL: (product: string) => string;
4434
4449
  declare const MAILPIT_BASE_URL = "https://mailpit.neetodeployapp.com";
4435
4450
  declare const MAILPIT_DOMAIN_NAME = "mail.aceinvoice.com";
4436
4451
  declare const IS_MAILPIT_ENABLED: boolean;
4452
+ declare const IS_SHADCN_UI: boolean;
4437
4453
  declare const mailpitDomainName: () => string;
4438
4454
  declare const ZAPIER_TEST_EMAIL_V2: (product: string) => string;
4439
4455
  declare const SINGULAR: {
@@ -5012,6 +5028,30 @@ declare class TeamMembers {
5012
5028
  }
5013
5029
  declare class TeamMembersV2 extends TeamMembers {
5014
5030
  fillMemberForm: (emails: string[], role?: string) => Promise<void>;
5031
+ openMemberPane: () => Promise<void>;
5032
+ /**
5033
+ *
5034
+ * Used to add a member using the add button in the header. It takes the following parameters:
5035
+ *
5036
+ * emails (optional): The emails of the members to be added. Default is an example email.
5037
+ *
5038
+ * role (optional): The role of the new members. Default is standard.
5039
+ *
5040
+ * @example
5041
+ *
5042
+ * await teamMembers.addMemberViaUI({
5043
+ * emails: ["sam@example.com", "tom@example.com"],
5044
+ * role: "admin",
5045
+ * });
5046
+ * @endexample
5047
+ */
5048
+ addMemberViaUI: ({
5049
+ emails,
5050
+ role
5051
+ }?: {
5052
+ emails?: string[];
5053
+ role?: string;
5054
+ }) => Promise<void>;
5015
5055
  submit: () => Promise<void>;
5016
5056
  /**
5017
5057
  *
@@ -5141,6 +5181,72 @@ declare class TeamMembersV2 extends TeamMembers {
5141
5181
  * @endexample
5142
5182
  */
5143
5183
  verifyNoDataTitle: (email: string) => Promise<void>;
5184
+ protected applyFilter: () => Promise<void>;
5185
+ /**
5186
+ *
5187
+ * Used to perform an action on a column header in the team members table. It takes the following parameters:
5188
+ *
5189
+ * columnName (optional): The name of the column to perform the action on. Default is Name.
5190
+ *
5191
+ * actionButtonText (optional): The text of the action button to be clicked. Default is Ascending.
5192
+ *
5193
+ * @example
5194
+ *
5195
+ * await teamMembers.performColumnAction({
5196
+ * columnName: "Role",
5197
+ * actionButtonText: "Hide column",
5198
+ * });
5199
+ * @endexample
5200
+ * @example
5201
+ *
5202
+ * await teamMembers.performColumnAction();
5203
+ *
5204
+ * // This will sort the `name` column in ascending order.
5205
+ * @endexample
5206
+ */
5207
+ performColumnAction: ({
5208
+ columnName,
5209
+ actionButtonText
5210
+ }?: {
5211
+ columnName?: string;
5212
+ actionButtonText?: "Ascending" | "Descending" | "Hide column";
5213
+ }) => Promise<void>;
5214
+ /**
5215
+ *
5216
+ * Used to take action on members by selecting the members and clicking on the take action button in the subheader. It takes the following parameters:
5217
+ *
5218
+ * names (optional): The names of the members to take action on. If not provided, all members will be selected.
5219
+ *
5220
+ * state (optional): The state to change the members to.
5221
+ *
5222
+ * action (optional): An object with actionButtonText and valueButtonText as keys to take action on the members. actionButtonText and valueButtonText are the text of the action button to be clicked and the value of the action to be changed to, respectively.
5223
+ *
5224
+ * @example
5225
+ *
5226
+ * await teamMembers.takeActionOnMembers({
5227
+ * names: ["Sam", "Tom"],
5228
+ * state: "Deactivate",
5229
+ * });
5230
+ * @endexample
5231
+ * @example
5232
+ *
5233
+ * await teamMembers.takeActionOnMembers({
5234
+ * action: { actionButtonText: "Change role", valueButtonText: "Admin" },
5235
+ * });
5236
+ * @endexample
5237
+ */
5238
+ takeActionOnMembers: ({
5239
+ names,
5240
+ state,
5241
+ action
5242
+ }: {
5243
+ names?: string[];
5244
+ state?: "activate" | "deactivate" | undefined;
5245
+ action?: {
5246
+ actionButtonText: string;
5247
+ valueButtonText: string;
5248
+ } | undefined;
5249
+ }) => Promise<void>;
5144
5250
  }
5145
5251
  interface BasicUserInfo {
5146
5252
  firstName: string;
@@ -5152,6 +5258,7 @@ interface CreateOrganizationProps$1 extends BasicUserInfo {
5152
5258
  businessName: string;
5153
5259
  subdomainName: string;
5154
5260
  appName: string;
5261
+ shouldSignupViaApi?: boolean;
5155
5262
  }
5156
5263
  interface LoginAndOnboardParams extends BasicUserInfo {
5157
5264
  handleOnboarding: () => Promise<void>;
@@ -5239,7 +5346,8 @@ declare class OrganizationPage {
5239
5346
  subdomainName,
5240
5347
  firstName,
5241
5348
  lastName,
5242
- appName
5349
+ appName,
5350
+ shouldSignupViaApi
5243
5351
  }: CreateOrganizationProps$1) => Promise<void>;
5244
5352
  /**
5245
5353
  *
@@ -5252,7 +5360,11 @@ declare class OrganizationPage {
5252
5360
  * await organizationPage.setupOrganization("Chat")
5253
5361
  * @endexample
5254
5362
  */
5255
- setupOrganization: (product: string) => Promise<void>;
5363
+ setupOrganization: (product: string, {
5364
+ shouldSignupViaApi
5365
+ }?: {
5366
+ shouldSignupViaApi?: boolean;
5367
+ }) => Promise<void>;
5256
5368
  /**
5257
5369
  *
5258
5370
  * Used to update already existing subdomain name. It takes the following parameters:
@@ -5395,11 +5507,13 @@ declare class OrganizationPage {
5395
5507
  signUp: ({
5396
5508
  credentials,
5397
5509
  fetchOtpFromEmail,
5398
- appName
5510
+ appName,
5511
+ shouldSignupViaApi
5399
5512
  }: {
5400
5513
  credentials: Credentials;
5401
5514
  fetchOtpFromEmail?: FetchOtpFromEmail;
5402
5515
  appName: string;
5516
+ shouldSignupViaApi?: boolean;
5403
5517
  }) => Promise<{
5404
5518
  STORAGE_STATE: {
5405
5519
  cookies: Array<{
@@ -7212,6 +7326,7 @@ declare const COMMON_SELECTORS: {
7212
7326
  toastBody: string;
7213
7327
  paneModalCrossIcon: string;
7214
7328
  sheetHeader: string;
7329
+ sheetWrapper: string;
7215
7330
  sheetBody: string;
7216
7331
  sheetCloseButton: string;
7217
7332
  dialogHeader: string;
@@ -7949,6 +8064,7 @@ declare const MEMBER_SELECTORS: {
7949
8064
  exportCancelBtn: string;
7950
8065
  downloadButton: string;
7951
8066
  manageAppListChk: string;
8067
+ takeActionDropdown: string;
7952
8068
  menubarSubLink: (sublink: string) => string;
7953
8069
  takeActionStateOption: (option?: string) => string;
7954
8070
  checkboxLabel: (label: string) => string;
@@ -9415,6 +9531,97 @@ declare const createOrganizationViaRake: ({
9415
9531
  lastName,
9416
9532
  subdomainName
9417
9533
  }: CreateOrganizationProps) => Promise<string>;
9534
+ interface CreateOrganizationViaApiProps extends CreateOrganizationProps {
9535
+ page: Page;
9536
+ businessName: string;
9537
+ redirectUri?: string;
9538
+ timeZone?: string;
9539
+ }
9540
+ /**
9541
+ *
9542
+ * Creates a fully signed-up organization (org + owner + product sync) in a single
9543
+ *
9544
+ * request to neeto-auth-web's non-production POST /api/v1/internal/quick_setups
9545
+ *
9546
+ * endpoint, then navigates the page to the returned one-time-token login URL so
9547
+ *
9548
+ * the session cookie is set. Staging-only replacement for the multi-step UI
9549
+ *
9550
+ * signup flow. The request is authenticated with process.env.OTP_BYPASS_KEY
9551
+ *
9552
+ * and the email must follow the cypress bypass convention
9553
+ *
9554
+ * (cpt<key>...@bigbinary.com).
9555
+ *
9556
+ * page: A page object.
9557
+ *
9558
+ * email: The email address for the organization owner.
9559
+ *
9560
+ * firstName: The first name of the organization owner.
9561
+ *
9562
+ * lastName: The last name of the organization owner.
9563
+ *
9564
+ * businessName: The organization name.
9565
+ *
9566
+ * subdomainName: The subdomain name for the organization.
9567
+ *
9568
+ * redirectUri (optional): Bare host+path the login should land on, e.g.
9569
+ *
9570
+ * neetocal.net/admin. Omit for neetoAuth itself.
9571
+ *
9572
+ * timeZone (optional): Time zone applied to the owner's neetoAuth profile,
9573
+ *
9574
+ * mirroring what the signup form auto-detects from the browser. Defaults to
9575
+ *
9576
+ * Asia/Calcutta — the timezoneId the Playwright browsers run with.
9577
+ *
9578
+ * Staging signups performed by OrganizationPage.createOrganization,
9579
+ *
9580
+ * OrganizationPage.setupOrganization, and OrganizationPage.signUp use this
9581
+ *
9582
+ * API by default (shouldSignupViaApi defaults to true). Pass
9583
+ *
9584
+ * shouldSignupViaApi: false to fall back to the full UI signup flow (signup
9585
+ *
9586
+ * page → OTP → organization form → profile form) — useful when the signup UI
9587
+ *
9588
+ * itself is under test:
9589
+ *
9590
+ * @example
9591
+ *
9592
+ * await organizationPage.setupOrganization(PRODUCT, { shouldSignupViaApi: false });
9593
+ *
9594
+ * await organizationPage.signUp({ credentials, appName, shouldSignupViaApi: false });
9595
+ * @endexample
9596
+ * Signups with fetchOtpFromEmail always use the UI flow regardless of the
9597
+ *
9598
+ * mode, since real-mailbox emails cannot use the cypress OTP bypass.
9599
+ *
9600
+ * @example
9601
+ *
9602
+ * import { createOrganizationViaApi } from "@neetoplaywright";
9603
+ *
9604
+ * await createOrganizationViaApi({
9605
+ * page,
9606
+ * email: "cptkey+cal@bigbinary.com",
9607
+ * firstName: "John",
9608
+ * lastName: "Doe",
9609
+ * businessName: "myorganization",
9610
+ * subdomainName: "myorganization",
9611
+ * redirectUri: "neetocal.net/admin",
9612
+ * });
9613
+ * @endexample
9614
+ */
9615
+ declare const createOrganizationViaApi: ({
9616
+ page,
9617
+ email,
9618
+ firstName,
9619
+ lastName,
9620
+ businessName,
9621
+ subdomainName,
9622
+ redirectUri,
9623
+ timeZone
9624
+ }: CreateOrganizationViaApiProps) => Promise<void>;
9418
9625
  interface AssertColumnHeaderVisibilityProps {
9419
9626
  page: Page;
9420
9627
  columnName: string;
@@ -10118,5 +10325,5 @@ declare class InboundEmailApis {
10118
10325
  reply: (emailParams: ReplyInboundEmailParams) => Promise<playwright_core.APIResponse | undefined>;
10119
10326
  private deliverSource;
10120
10327
  }
10121
- export { ACTIONS, ADMIN_PANEL_SELECTORS, ALL_RESOURCES, ANALYTICS_RESOURCES, API_KEYS_SELECTORS, API_ROUTES, APP_RESOURCES, AUDIT_LOGS_SELECTORS, ApiKeysApi, ApiKeysPage, ApiKeysPageV2, AuditLogsPage, BASE_URL, CALENDAR_LABELS, CERTIFICATE_LIMIT_EXCEEDED_MESSAGE, CERTIFICATE_LIMIT_EXCEEDED_REGEXP, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CURRENT_TIME_RANGES, CUSTOM_DOMAIN_SELECTORS, CUSTOM_DOMAIN_SUFFIX, ColorPickerUtils, CustomCommands, CustomCommandsV2, CustomDomainApi, CustomDomainPage, DATE_FORMATS, DATE_PICKER_SELECTORS, DATE_RANGES, DATE_TEXTS, DEFAULT_WEBHOOKS_RESPONSE_TEXT, DESCRIPTION_EDITOR_TEXTS, EDITOR_VERIFY_TEXT_COLOR, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXAMPLE_URL, EXPANDED_FONT_SIZE, EXPORT_FILE_TYPES, EditorPage, EmailDeliveryUtils, EmbedBase, FILE_FORMATS, FONTS_RESOURCES, FONT_SIZE_SELECTORS, FROM_EMAIL_ENV_KEYS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_ANALYTICS_SELECTORS, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GOOGLE_SHEETS_SELECTORS, GooglePage, HELP_CENTER_ROUTES, HELP_CENTER_SELECTORS, HelpAndProfilePage, HelpAndProfilePageV2, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_CI, IS_DEV_ENV, IS_MAILPIT_ENABLED, IS_STAGING_ENV, ImageUploader, InboundEmailApis, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, KEYBOARD_SHORTCUT_TEST_CASES, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MAILPIT_BASE_URL, MAILPIT_DOMAIN_NAME, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MICROSOFT_LOGIN_SELECTORS, MICROSOFT_LOGIN_TEXTS, MailerUtils, MailpitApi, Member, MemberApis, MicrosoftPage, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_SEO_SELECTORS, NEETO_TEXT_MODIFIER_SELECTORS, NeetoAuthServer, NeetoChatWidget, NeetoEmailDeliveryApi, NeetoTowerApi, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PRODUCT_ROLES_ROUTE_MAP, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_NAMES, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RailsEmailApiClient, RailsEmailUtils, RoleApis, RolesPage, RolesPageV2, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SecurityApi, SidebarSection, SlackApi, SlackPage, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEAM_MEMBER_TEXTS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THEMES_TEXTS, THIRD_PARTY_RESOURCES, THIRD_PARTY_ROUTES, TIME_RANGES, TOASTR_MESSAGES, TWILIO_SELECTORS, TagsApi, TagsPage, TeamMembers, TeamMembersV2, ThankYouApi, ThankYouPage, TwilioApi, USER_AGENTS, WEBHOOK_SELECTORS, WebhookSiteApi, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_TEST_EMAIL_V2, ZAPIER_WEB_TEXTS, ZapierPage, authenticateUser, baseURLGenerator, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, createOrganizationViaRake, currencyUtils, dataQa, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, filterUtils, fixedMenuSelector, generatePhoneNumber, generatePhoneNumberDetails, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getDirname, getFormattedPhoneNumber, getFullUrl, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getIsoCodeFromPhoneCode, getListCount, globalShortcuts, grantClipboardPermissions, hexToRGB, hexToRGBA, i18nFixture, imageRegex, initializeCredentials, initializeTestData, initializeTotp, isGithubIssueOpen, isStagingOrganizationExpired, joinHyphenCase, joinString, login, mailpitDomainName, networkConditions, networkThrottlingUsingCDP, optionSelector, readFileAsBrowserFile, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipCustomDomainSetup, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, _default as stealthTest, tableUtils, toCamelCase, updateCredentials, warmup, withCookieCache, writeDataToFile };
10328
+ export { ACTIONS, ADMIN_PANEL_SELECTORS, ALL_RESOURCES, ANALYTICS_RESOURCES, API_KEYS_SELECTORS, API_ROUTES, APP_RESOURCES, AUDIT_LOGS_SELECTORS, ApiKeysApi, ApiKeysPage, ApiKeysPageV2, AuditLogsPage, BASE_URL, CALENDAR_LABELS, CERTIFICATE_LIMIT_EXCEEDED_MESSAGE, CERTIFICATE_LIMIT_EXCEEDED_REGEXP, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CURRENT_TIME_RANGES, CUSTOM_DOMAIN_SELECTORS, CUSTOM_DOMAIN_SUFFIX, ColorPickerUtils, CustomCommands, CustomCommandsV2, CustomDomainApi, CustomDomainPage, DATE_FORMATS, DATE_PICKER_SELECTORS, DATE_RANGES, DATE_TEXTS, DEFAULT_TIMEZONE_ID, DEFAULT_WEBHOOKS_RESPONSE_TEXT, DESCRIPTION_EDITOR_TEXTS, EDITOR_VERIFY_TEXT_COLOR, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXAMPLE_URL, EXPANDED_FONT_SIZE, EXPORT_FILE_TYPES, EditorPage, EmailDeliveryUtils, EmbedBase, FILE_FORMATS, FONTS_RESOURCES, FONT_SIZE_SELECTORS, FROM_EMAIL_ENV_KEYS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_ANALYTICS_SELECTORS, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GOOGLE_SHEETS_SELECTORS, GooglePage, HELP_CENTER_ROUTES, HELP_CENTER_SELECTORS, HelpAndProfilePage, HelpAndProfilePageV2, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_CI, IS_DEV_ENV, IS_MAILPIT_ENABLED, IS_SHADCN_UI, IS_STAGING_ENV, ImageUploader, InboundEmailApis, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, KEYBOARD_SHORTCUT_TEST_CASES, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MAILPIT_BASE_URL, MAILPIT_DOMAIN_NAME, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MICROSOFT_LOGIN_SELECTORS, MICROSOFT_LOGIN_TEXTS, MailerUtils, MailpitApi, Member, MemberApis, MicrosoftPage, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_SEO_SELECTORS, NEETO_TEXT_MODIFIER_SELECTORS, NeetoAuthServer, NeetoChatWidget, NeetoEmailDeliveryApi, NeetoTowerApi, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PRODUCT_ROLES_ROUTE_MAP, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_NAMES, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RailsEmailApiClient, RailsEmailUtils, RoleApis, RolesPage, RolesPageV2, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SecurityApi, SidebarSection, SlackApi, SlackPage, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEAM_MEMBER_TEXTS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THEMES_TEXTS, THIRD_PARTY_RESOURCES, THIRD_PARTY_ROUTES, TIME_RANGES, TOASTR_MESSAGES, TWILIO_SELECTORS, TagsApi, TagsPage, TeamMembers, TeamMembersV2, ThankYouApi, ThankYouPage, TwilioApi, USER_AGENTS, WEBHOOK_SELECTORS, WebhookSiteApi, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_TEST_EMAIL_V2, ZAPIER_WEB_TEXTS, ZapierPage, authenticateUser, baseURLGenerator, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, createOrganizationViaApi, createOrganizationViaRake, currencyUtils, dataQa, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, filterUtils, fixedMenuSelector, generatePhoneNumber, generatePhoneNumberDetails, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getDirname, getFormattedPhoneNumber, getFullUrl, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getIsoCodeFromPhoneCode, getListCount, globalShortcuts, grantClipboardPermissions, hexToRGB, hexToRGBA, i18nFixture, imageRegex, initializeCredentials, initializeTestData, initializeTotp, isGithubIssueOpen, isStagingOrganizationExpired, joinHyphenCase, joinString, login, mailpitDomainName, networkConditions, networkThrottlingUsingCDP, optionSelector, readFileAsBrowserFile, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipCustomDomainSetup, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, _default as stealthTest, tableUtils, toCamelCase, updateCredentials, warmup, withCookieCache, writeDataToFile };
10122
10329
  export type { BaseThemeStyle, BaseThemeStyleType, ColumnMenuAction, CountryProps, CustomFixture, EmailDeliveryConnectParams, EmailDeliveryProvider, EmailDeliveryVerifiedEmail, EmailDeliveryVerifyEmailParams, EmailDeliveryVerifyEmailResponse, EmailMatchCriteria, InboundEmailParams, IntroPageThemeStyle, IntroPageThemeStyleType, OAuthEmailDeliveryProvider, ProjectName, ReplyInboundEmailParams, ThemeCategory, ValueOf };
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { isPresent, keysToSnakeCase, hyphenate, isNotPresent, noop as noop$2, humanize, findBy, dynamicArray, truncate, isNotEmpty, isNotEqualDeep, randomPick } from '@bigbinary/neeto-cist';
1
+ import { isPresent, keysToSnakeCase, hyphenate, humanize, isNotPresent, noop as noop$2, findBy, dynamicArray, truncate, isNotEmpty, isNotEqualDeep, randomPick } from '@bigbinary/neeto-cist';
2
2
  import { faker } from '@faker-js/faker';
3
3
  import * as fs from 'fs';
4
4
  import fs__default, { readFileSync, promises, existsSync, writeFileSync, unlinkSync, mkdirSync, rmSync, createWriteStream } from 'fs';
@@ -310,6 +310,7 @@ const IS_DEV_ENV = process.env.TEST_ENV === ENVIRONMENT.development;
310
310
  const IS_CI = isPresent(process.env.NEETO_CI_JOB_ID);
311
311
  const DEFAULT_WEBHOOKS_RESPONSE_TEXT = JSON.stringify({ success: true });
312
312
  const STORAGE_STATE = "./e2e/auth/user.json";
313
+ const DEFAULT_TIMEZONE_ID = "Asia/Calcutta";
313
314
  const GLOBAL_TRANSLATIONS_PATTERN = "../node_modules/@bigbinary/**/translations/en.json";
314
315
  const PROJECT_TRANSLATIONS_PATH = "../app/javascript/src/translations/en.json";
315
316
  const CREDENTIALS = {
@@ -327,6 +328,7 @@ const ZAPIER_TEST_EMAIL = (product) => `neeto-${product}-zapier-test@${process.e
327
328
  const MAILPIT_BASE_URL = "https://mailpit.neetodeployapp.com";
328
329
  const MAILPIT_DOMAIN_NAME = "mail.aceinvoice.com";
329
330
  const IS_MAILPIT_ENABLED = isPresent(process.env.MAILPIT_DOMAIN_NAME);
331
+ const IS_SHADCN_UI = isPresent(process.env.IS_SHADCN_UI);
330
332
  const mailpitDomainName = () => process.env.MAILPIT_DOMAIN_NAME || MAILPIT_DOMAIN_NAME;
331
333
  const ZAPIER_TEST_EMAIL_V2 = (product) => `neeto-${product}-zapier-test@${mailpitDomainName()}`;
332
334
  // constants for translation
@@ -1008,6 +1010,7 @@ const COMMON_SELECTORS = {
1008
1010
  toastBody: ".Toastify__toast-body",
1009
1011
  paneModalCrossIcon: "pane-close-button",
1010
1012
  sheetHeader: "sheet-header",
1013
+ sheetWrapper: "sheet-wrapper",
1011
1014
  sheetBody: "sheet-body",
1012
1015
  sheetCloseButton: "sheet-close-button",
1013
1016
  dialogHeader: "dialog-header",
@@ -1641,6 +1644,7 @@ const MEMBER_SELECTORS = {
1641
1644
  exportCancelBtn: "export-cancel-button",
1642
1645
  downloadButton: "download-button",
1643
1646
  manageAppListChk: "ntm-manage-members-app-list-checkbox",
1647
+ takeActionDropdown: "ntm-members-take-action-dropdown-button",
1644
1648
  menubarSubLink: (sublink) => `members-${sublink}-block-sub-link`,
1645
1649
  takeActionStateOption: (option = "") => `ntm-${hyphenate(option)}-members-button`,
1646
1650
  checkboxLabel: (label) => `${hyphenate(label)}-checkbox-label`,
@@ -2243,6 +2247,11 @@ class CustomCommands {
2243
2247
  return await this.request[method](formattedUrl, requestOptions);
2244
2248
  };
2245
2249
  selectOptionFromDropdown = async ({ label = "nui", value, page = this.page, options = {}, }) => {
2250
+ IS_SHADCN_UI
2251
+ ? await this.selectOptionFromDropdownV2({ label, value, page, options })
2252
+ : await this.selectOptionFromDropdownV1({ label, value, page, options });
2253
+ };
2254
+ selectOptionFromDropdownV1 = async ({ label = "nui", value, page = this.page, options = {}, }) => {
2246
2255
  Object.assign({
2247
2256
  visibilityTimeout: 2_000,
2248
2257
  textAssertionTimeout: 1_000,
@@ -2262,6 +2271,29 @@ class CustomCommands {
2262
2271
  });
2263
2272
  }).toPass({ timeout: options.retryTimeout });
2264
2273
  };
2274
+ waitForSheetOpen = () => expect(this.page.getByTestId(COMMON_SELECTORS.sheetHeader)).toBeInViewport({
2275
+ timeout: 10_000,
2276
+ ratio: 1,
2277
+ });
2278
+ waitForSheetClose = () => expect(this.page.getByTestId(COMMON_SELECTORS.sheetWrapper)).toHaveCount(0, { timeout: 10_000 });
2279
+ selectOptionFromDropdownV2 = async ({ label = "nui", value, page = this.page, options = {}, }) => {
2280
+ Object.assign({
2281
+ visibilityTimeout: 2_000,
2282
+ textAssertionTimeout: 1_000,
2283
+ retryTimeout: 20_000,
2284
+ }, options);
2285
+ const menu = page.getByTestId(COMMON_SELECTORS.customDropDownMenu(label));
2286
+ const container = page.getByTestId(COMMON_SELECTORS.customSelectContainer(label));
2287
+ await expect(async () => {
2288
+ await container.click();
2289
+ await expect(menu).toBeVisible({ timeout: options.visibilityTimeout });
2290
+ await page.keyboard.type(value);
2291
+ await menu.getByRole("option", { name: value, exact: true }).click();
2292
+ await expect(container).toContainText(value, {
2293
+ timeout: options.textAssertionTimeout,
2294
+ });
2295
+ }).toPass({ timeout: options.retryTimeout });
2296
+ };
2265
2297
  verifyFieldValue = values => {
2266
2298
  const verifyEachFieldValue = ({ field, value, }) => expect(this.page.getByTestId(field)).toHaveValue(value);
2267
2299
  return Array.isArray(values)
@@ -2796,6 +2828,34 @@ const createOrganizationViaRake = async ({ email, firstName, lastName, subdomain
2796
2828
  }
2797
2829
  return stdout.trim();
2798
2830
  };
2831
+ const createOrganizationViaApi = async ({ page, email, firstName, lastName, businessName, subdomainName, redirectUri, timeZone = DEFAULT_TIMEZONE_ID, }) => {
2832
+ if (!process.env.OTP_BYPASS_KEY) {
2833
+ throw new Error("OTP_BYPASS_KEY environment variable is required to create organizations via the quick setups API.");
2834
+ }
2835
+ const response = await page.request.post(`${NEETO_AUTH_BASE_URL()}/api/v1/internal/quick_setups`, {
2836
+ headers: {
2837
+ Authorization: `Token token="${process.env.OTP_BYPASS_KEY}"`,
2838
+ },
2839
+ data: {
2840
+ setup: {
2841
+ email,
2842
+ first_name: firstName,
2843
+ last_name: lastName,
2844
+ organization_name: humanize(businessName),
2845
+ subdomain: subdomainName,
2846
+ redirect_uri: redirectUri,
2847
+ time_zone: timeZone,
2848
+ },
2849
+ },
2850
+ timeout: 120_000,
2851
+ });
2852
+ if (!response.ok()) {
2853
+ throw new Error(`Quick organization setup failed with status ${response.status()}: ${await response.text()}`);
2854
+ }
2855
+ // The OTT in the login URL expires in 150 seconds; navigate immediately.
2856
+ const { login_url: loginUrl } = await response.json();
2857
+ await page.goto(loginUrl, { timeout: 30_000 });
2858
+ };
2799
2859
 
2800
2860
  //! otpauth 9.5.0 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth
2801
2861
  //! noble-hashes 2.0.1 | (c) Paul Miller | MIT | https://github.com/paulmillr/noble-hashes
@@ -18028,7 +18088,7 @@ class OrganizationPage {
18028
18088
  const maybeLaterButton = this.page.getByTestId(LOGIN_SELECTORS.authenticatorAppLaterButton);
18029
18089
  (await maybeLaterButton.isVisible()) && (await maybeLaterButton.click());
18030
18090
  };
18031
- createOrganization = async ({ email, businessName, subdomainName, firstName, lastName, appName, }) => {
18091
+ createOrganization = async ({ email, businessName, subdomainName, firstName, lastName, appName, shouldSignupViaApi = true, }) => {
18032
18092
  if (shouldSkipSetupAndTeardown())
18033
18093
  return;
18034
18094
  if (IS_DEV_ENV) {
@@ -18042,28 +18102,43 @@ class OrganizationPage {
18042
18102
  }
18043
18103
  const appNameInLowerCase = appName.toLowerCase();
18044
18104
  const isNeetoAuth = appNameInLowerCase === "neetoauth";
18045
- isNeetoAuth
18046
- ? await this.page.goto(ROUTES.neetoAuthSignup, { timeout: 20_000 })
18047
- : await this.page.goto(`${ROUTES.neetoAuthSignup}?redirect_uri=${appNameInLowerCase}.net/admin`, { timeout: 20_000 });
18048
- await this.submitEmail(email);
18049
- await this.fillOTP();
18050
- await this.fillOrganizationDetails({
18051
- credentials: {
18105
+ if (!shouldSignupViaApi) {
18106
+ isNeetoAuth
18107
+ ? await this.page.goto(ROUTES.neetoAuthSignup, { timeout: 20_000 })
18108
+ : await this.page.goto(`${ROUTES.neetoAuthSignup}?redirect_uri=${appNameInLowerCase}.net/admin`, { timeout: 20_000 });
18109
+ await this.submitEmail(email);
18110
+ await this.fillOTP();
18111
+ await this.fillOrganizationDetails({
18112
+ credentials: {
18113
+ firstName,
18114
+ lastName,
18115
+ email,
18116
+ currentUserName: email,
18117
+ businessName,
18118
+ subdomainName,
18119
+ domain: appNameInLowerCase,
18120
+ },
18121
+ appName: appNameInLowerCase,
18122
+ });
18123
+ }
18124
+ else {
18125
+ await createOrganizationViaApi({
18126
+ page: this.page,
18127
+ email,
18052
18128
  firstName,
18053
18129
  lastName,
18054
- email,
18055
- currentUserName: email,
18056
18130
  businessName,
18057
18131
  subdomainName,
18058
- domain: appNameInLowerCase,
18059
- },
18060
- appName: appNameInLowerCase,
18061
- });
18132
+ redirectUri: isNeetoAuth
18133
+ ? undefined
18134
+ : `${appNameInLowerCase}.net/admin`,
18135
+ });
18136
+ }
18062
18137
  await this.page.waitForURL(new RegExp(getGlobalUserState().domain), {
18063
18138
  waitUntil: "load",
18064
18139
  });
18065
18140
  };
18066
- setupOrganization = async (product) => {
18141
+ setupOrganization = async (product, { shouldSignupViaApi } = {}) => {
18067
18142
  if (!IS_STAGING_ENV || shouldSkipSetupAndTeardown())
18068
18143
  return;
18069
18144
  const { user } = readFileSyncIfExists();
@@ -18074,6 +18149,7 @@ class OrganizationPage {
18074
18149
  lastName: user.lastName,
18075
18150
  subdomainName: user.subdomainName,
18076
18151
  appName: `neeto${product}`,
18152
+ shouldSignupViaApi,
18077
18153
  });
18078
18154
  await this.neetoPlaywrightUtilities.waitForPageLoad({
18079
18155
  customPageContext: this.page,
@@ -18218,7 +18294,7 @@ class OrganizationPage {
18218
18294
  }
18219
18295
  await handleOnboarding();
18220
18296
  };
18221
- signUp = async ({ credentials, fetchOtpFromEmail, appName, }) => {
18297
+ signUp = async ({ credentials, fetchOtpFromEmail, appName, shouldSignupViaApi = true, }) => {
18222
18298
  if (IS_DEV_ENV) {
18223
18299
  await createOrganizationViaRake({
18224
18300
  email: credentials.email,
@@ -18232,7 +18308,7 @@ class OrganizationPage {
18232
18308
  loginPath: `${baseURLGenerator(appName, credentials.subdomainName)}${ROUTES.admin}`,
18233
18309
  });
18234
18310
  }
18235
- else {
18311
+ else if (fetchOtpFromEmail !== undefined || !shouldSignupViaApi) {
18236
18312
  let otp = "123456";
18237
18313
  await this.page.goto(`${ROUTES.neetoAuthSignup}?redirect_uri=${credentials.domain}`, { timeout: 20_000 });
18238
18314
  await this.submitEmail(credentials.email);
@@ -18249,6 +18325,18 @@ class OrganizationPage {
18249
18325
  });
18250
18326
  await this.page.waitForURL(new RegExp(credentials.domain));
18251
18327
  }
18328
+ else {
18329
+ await createOrganizationViaApi({
18330
+ page: this.page,
18331
+ email: credentials.email,
18332
+ firstName: credentials.firstName,
18333
+ lastName: credentials.lastName,
18334
+ businessName: credentials.businessName,
18335
+ subdomainName: credentials.subdomainName,
18336
+ redirectUri: credentials.domain,
18337
+ });
18338
+ await this.page.waitForURL(new RegExp(credentials.domain));
18339
+ }
18252
18340
  const STORAGE_STATE = await this.page.context().storageState();
18253
18341
  return { STORAGE_STATE, baseURL: process.env.BASE_URL };
18254
18342
  };
@@ -70357,8 +70445,10 @@ class MailerUtils {
70357
70445
  };
70358
70446
  generateRandomEmailV2 = () => {
70359
70447
  const domain = mailpitDomainName();
70360
- const [localPart] = faker.internet.email({ provider: domain }).split("@");
70361
- return `${localPart}.${faker.string.alphanumeric(8).toLowerCase()}@${domain}`;
70448
+ const [localPart] = faker.internet
70449
+ .email({ provider: domain, allowSpecialCharacters: false })
70450
+ .split("@");
70451
+ return `${localPart}.${faker.string.alpha(8).toLowerCase()}@${domain}`;
70362
70452
  };
70363
70453
  getLatestMessageIdV2 = async (subject, { timeout = 10_000, receivedAfter = dateTimeOneHourAgo(), } = {}) => {
70364
70454
  if (IS_DEV_ENV) {
@@ -119891,7 +119981,15 @@ class ZapierPage extends IntegrationBase {
119891
119981
  .getByRole("button", { name: ZAPIER_WEB_TEXTS.editThisZap })
119892
119982
  .click();
119893
119983
  await this.zapierWebPage.waitForLoadState();
119894
- await expect(this.navbar.getByTestId(ZAPIER_SELECTORS.publishButton)).toBeVisible({ timeout: 25_000 });
119984
+ const publishBtn = this.navbar.getByTestId(ZAPIER_SELECTORS.publishButton);
119985
+ const editBtn = this.zapierWebPage.getByRole("button", {
119986
+ name: ZAPIER_WEB_TEXTS.editExistingDraft,
119987
+ });
119988
+ await expect(publishBtn.or(editBtn)).toBeVisible({ timeout: 25_000 });
119989
+ if (await editBtn.isHidden())
119990
+ return;
119991
+ await editBtn.click();
119992
+ await expect(publishBtn).toBeVisible({ timeout: 25_000 });
119895
119993
  };
119896
119994
  openMoreOptions = async () => {
119897
119995
  await this.firstStepBlock.waitFor({ timeout: 25_000 });
@@ -119907,6 +120005,9 @@ class ZapierPage extends IntegrationBase {
119907
120005
  await this.zapToggle.click();
119908
120006
  await expect(this.zapToggle.getByTestId(ZAPIER_SELECTORS.spinner)).toBeHidden({ timeout: 30_000 });
119909
120007
  await expect(checkbox).toBeChecked({ timeout: 15_000 });
120008
+ await expect(this.zapierWebPage.getByRole("dialog")).toBeVisible({
120009
+ timeout: 15_000,
120010
+ });
119910
120011
  };
119911
120012
  reconnectAccount = async (zapierApiKey) => {
119912
120013
  this.stepBlock = this.zapierWebPage.getByTestId(ZAPIER_SELECTORS.stepBlock);
@@ -120007,7 +120108,9 @@ class ZapierPage extends IntegrationBase {
120007
120108
  });
120008
120109
  await this.zapierWebPage.close();
120009
120110
  };
120010
- verifyZapIsTriggered = ({ productName, submittedEmail, zapTriggeredAfter, timeout = 2 * 60_000, }) => this.mailerUtils.findMessage({ to: ZAPIER_TEST_EMAIL(productName), body: submittedEmail }, { timeout, receivedAfter: zapTriggeredAfter });
120111
+ verifyZapIsTriggered = ({ productName, submittedEmail, zapTriggeredAfter, timeout = 2 * 60_000, }) => IS_MAILPIT_ENABLED
120112
+ ? this.mailerUtils.findMessageV2({ to: ZAPIER_TEST_EMAIL(productName), body: submittedEmail }, { timeout, receivedAfter: zapTriggeredAfter })
120113
+ : this.mailerUtils.findMessage({ to: ZAPIER_TEST_EMAIL(productName), body: submittedEmail }, { timeout, receivedAfter: zapTriggeredAfter });
120011
120114
  skipIfTaskLimitIsExhausted = async () => {
120012
120115
  // Zapier provides 100 free task limit for free account; skip test if it's exhausted
120013
120116
  const universalSidebar = this.zapierWebPage.locator(ZAPIER_SELECTORS.universalSidebar);
@@ -120132,7 +120235,7 @@ class Member {
120132
120235
  generateRandomTeamMembers = ({ count = 1, role = "standard" }) => dynamicArray(count, () => ({
120133
120236
  firstName: faker.person.firstName(),
120134
120237
  lastName: faker.person.lastName(),
120135
- email: faker.internet.exampleEmail(),
120238
+ email: faker.internet.exampleEmail({ allowSpecialCharacters: false }),
120136
120239
  role,
120137
120240
  }));
120138
120241
  getUserIdViaAPI = async (email) => {
@@ -121166,7 +121269,7 @@ class TeamMembers {
121166
121269
  .click();
121167
121270
  await continueBtn.click();
121168
121271
  };
121169
- addMemberViaUI = async ({ emails = [faker.internet.exampleEmail()], role = "standard", } = {}) => {
121272
+ addMemberViaUI = async ({ emails = [faker.internet.exampleEmail({ allowSpecialCharacters: false })], role = "standard", } = {}) => {
121170
121273
  await this.openMemberPane();
121171
121274
  await this.fillMemberForm(emails, role);
121172
121275
  await this.submit();
@@ -121382,24 +121485,35 @@ class TeamMembers {
121382
121485
  class TeamMembersV2 extends TeamMembers {
121383
121486
  fillMemberForm = async (emails, role) => {
121384
121487
  await this.page
121385
- .getByTestId(COMMON_SELECTORS.emailInputWrapper)
121386
- .getByRole("textbox")
121387
- .fill(emails.join(", "));
121488
+ .getByTestId(MEMBER_FORM_SELECTORS.emailTextField)
121489
+ .pressSequentially(emails.join(", "));
121490
+ const continueBtn = this.page.getByTestId(MEMBER_SELECTORS.continueButton);
121388
121491
  await this.page.keyboard.press("Enter");
121492
+ await expect(continueBtn).toBeEnabled();
121389
121493
  role &&
121390
121494
  (await this.neetoPlaywrightUtilities.toggleElement({
121391
121495
  locator: this.page.getByRole("radio", { name: role, exact: true }),
121392
121496
  }));
121393
- const continueBtn = this.page.getByTestId(MEMBER_SELECTORS.continueButton);
121394
121497
  await continueBtn.click();
121395
121498
  if (IS_DEV_ENV)
121396
121499
  return;
121397
- await this.page
121398
- .getByTestId(COMMON_SELECTORS.paneBody)
121399
- .getByTestId(COMMON_SELECTORS.checkboxLabel)
121400
- .click();
121500
+ await this.page.getByTestId(MEMBER_SELECTORS.manageAppListChk).click();
121401
121501
  await continueBtn.click();
121402
121502
  };
121503
+ openMemberPane = async () => {
121504
+ await this.page.getByTestId(MEMBER_SELECTORS.newButton).click();
121505
+ await this.neetoPlaywrightUtilities.waitForPageLoad();
121506
+ const continueButton = this.page.getByTestId(MEMBER_SELECTORS.continueButton);
121507
+ await expect(continueButton).toBeVisible();
121508
+ await this.neetoPlaywrightUtilities.waitForSheetOpen();
121509
+ await expect(continueButton.getByTestId(COMMON_SELECTORS.uiSpinner)).toBeHidden({ timeout: 35_000 });
121510
+ };
121511
+ addMemberViaUI = async ({ emails = [faker.internet.exampleEmail({ allowSpecialCharacters: false })], role = "standard", } = {}) => {
121512
+ await this.openMemberPane();
121513
+ await this.fillMemberForm(emails, role);
121514
+ await this.submit();
121515
+ await this.neetoPlaywrightUtilities.waitForPageLoad();
121516
+ };
121403
121517
  submit = async () => {
121404
121518
  const pane = this.page.getByRole("dialog");
121405
121519
  const submitBtn = this.page.getByTestId(MEMBER_SELECTORS.submitButton);
@@ -121424,6 +121538,7 @@ class TeamMembersV2 extends TeamMembers {
121424
121538
  await expect(this.page
121425
121539
  .getByTestId(MEMBER_SELECTORS.submitButton)
121426
121540
  .getByTestId(COMMON_SELECTORS.uiSpinner)).toHaveCount(0, { timeout: 35_000 });
121541
+ await this.neetoPlaywrightUtilities.waitForSheetOpen();
121427
121542
  isPresent(email) &&
121428
121543
  (await this.page
121429
121544
  .getByTestId(MEMBER_FORM_SELECTORS.emailInput)
@@ -121492,6 +121607,57 @@ class TeamMembersV2 extends TeamMembers {
121492
121607
  await expect(this.page.getByTestId(COMMON_SELECTORS.noDataTitleV2)).toBeVisible({ timeout: 10_000 });
121493
121608
  await filterUtils.clearFiltersFromActionBlock(this.page);
121494
121609
  };
121610
+ applyFilter = async () => {
121611
+ await expect(this.page.getByTestId(NEETO_FILTERS_SELECTORS.neetoFiltersBarClearButton)).toBeVisible();
121612
+ await this.neetoPlaywrightUtilities.waitForPageLoad();
121613
+ await expect(this.page.locator(COMMON_SELECTORS.tableSpinner)).toBeHidden({
121614
+ timeout: 30_000,
121615
+ });
121616
+ await this.page
121617
+ .getByTestId(NEETO_FILTERS_SELECTORS.filterDoneButton)
121618
+ .click();
121619
+ await this.neetoPlaywrightUtilities.waitForSheetClose();
121620
+ };
121621
+ performColumnAction = async ({ columnName = "Name", actionButtonText = "Ascending", } = {}) => {
121622
+ await this.page
121623
+ .getByTestId(TABLE_SELECTORS.columnHeaderTitle(hyphenate(columnName)))
121624
+ .getByTestId(TABLE_SELECTORS.columnMenuButton)
121625
+ .click();
121626
+ await this.page.getByRole("menuitem", { name: actionButtonText }).click();
121627
+ await this.neetoPlaywrightUtilities.waitForPageLoad();
121628
+ await expect(this.page.locator(COMMON_SELECTORS.tableSpinner)).toBeHidden();
121629
+ };
121630
+ takeActionOnMembers = async ({ names = [], state, action, }) => {
121631
+ if (isPresent(names)) {
121632
+ for (const name of names) {
121633
+ await this.getMemberRowByName(name).getByRole("checkbox").click();
121634
+ }
121635
+ }
121636
+ else {
121637
+ await this.page
121638
+ .getByRole("columnheader", { name: MEMBER_TEXTS.selectAll })
121639
+ .click();
121640
+ }
121641
+ await this.page.getByTestId(MEMBER_SELECTORS.takeActionDropdown).click();
121642
+ if (isPresent(state)) {
121643
+ await this.page
121644
+ .getByTestId(MEMBER_SELECTORS.takeActionStateOption(state))
121645
+ .click();
121646
+ }
121647
+ else {
121648
+ await this.page
121649
+ .getByRole("menuitem", { name: action?.actionButtonText })
121650
+ .click();
121651
+ await this.page
121652
+ .getByRole("menuitem", { name: action?.valueButtonText })
121653
+ .click();
121654
+ }
121655
+ await this.page
121656
+ .getByTestId(COMMON_SELECTORS.alertModalSubmitButton)
121657
+ .click();
121658
+ await this.neetoPlaywrightUtilities.verifyToast();
121659
+ await this.neetoPlaywrightUtilities.waitForPageLoad();
121660
+ };
121495
121661
  }
121496
121662
 
121497
121663
  dayjs.extend(customParseFormat);
@@ -121590,7 +121756,6 @@ class ApiKeysPageV2 extends ApiKeysPage {
121590
121756
  fillApiKeyDetails = async ({ label, expiryDate }) => {
121591
121757
  const dialog = this.page.getByRole("dialog");
121592
121758
  await this.page
121593
- .getByTestId(COMMON_SELECTORS.paneBody)
121594
121759
  .getByTestId(COMMON_SELECTORS.customInputField("name"))
121595
121760
  .fill(label);
121596
121761
  isPresent(expiryDate) && (await this.enableExpiryDate(expiryDate));
@@ -126946,11 +127111,11 @@ const definePlaywrightConfig = (overrides) => {
126946
127111
  ...globalOverrides,
126947
127112
  use: {
126948
127113
  baseURL: process.env.BASE_URL,
126949
- trace: "on",
127114
+ trace: { mode: "on", attachments: false },
126950
127115
  screenshot: "only-on-failure",
126951
127116
  navigationTimeout: 35_000,
126952
127117
  actionTimeout: 10 * 1000,
126953
- timezoneId: "Asia/Calcutta",
127118
+ timezoneId: DEFAULT_TIMEZONE_ID,
126954
127119
  geolocation: { latitude: 18.553187, longitude: 73.948313 }, // BB Pune office
126955
127120
  permissions: ["geolocation"],
126956
127121
  ...useOverrides,
@@ -127101,4 +127266,4 @@ class InboundEmailApis {
127101
127266
  };
127102
127267
  }
127103
127268
 
127104
- export { ACTIONS, ADMIN_PANEL_SELECTORS, ALL_RESOURCES, ANALYTICS_RESOURCES, API_KEYS_SELECTORS, API_ROUTES, APP_RESOURCES, AUDIT_LOGS_SELECTORS, ApiKeysApi, ApiKeysPage, ApiKeysPageV2, AuditLogsPage, BASE_URL, CALENDAR_LABELS, CERTIFICATE_LIMIT_EXCEEDED_MESSAGE, CERTIFICATE_LIMIT_EXCEEDED_REGEXP, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CURRENT_TIME_RANGES, CUSTOM_DOMAIN_SELECTORS, CUSTOM_DOMAIN_SUFFIX, ColorPickerUtils, CustomCommands, CustomCommandsV2, CustomDomainApi, CustomDomainPage, DATE_FORMATS, DATE_PICKER_SELECTORS, DATE_RANGES, DATE_TEXTS, DEFAULT_WEBHOOKS_RESPONSE_TEXT, DESCRIPTION_EDITOR_TEXTS, EDITOR_VERIFY_TEXT_COLOR, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXAMPLE_URL, EXPANDED_FONT_SIZE, EXPORT_FILE_TYPES, EditorPage, EmailDeliveryUtils, EmbedBase, FILE_FORMATS, FONTS_RESOURCES, FONT_SIZE_SELECTORS, FROM_EMAIL_ENV_KEYS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_ANALYTICS_SELECTORS, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GOOGLE_SHEETS_SELECTORS, GooglePage, HELP_CENTER_ROUTES, HELP_CENTER_SELECTORS, HelpAndProfilePage, HelpAndProfilePageV2, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_CI, IS_DEV_ENV, IS_MAILPIT_ENABLED, IS_STAGING_ENV, ImageUploader, InboundEmailApis, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, KEYBOARD_SHORTCUT_TEST_CASES, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MAILPIT_BASE_URL, MAILPIT_DOMAIN_NAME, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MICROSOFT_LOGIN_SELECTORS, MICROSOFT_LOGIN_TEXTS, MailerUtils, MailpitApi, Member, MemberApis, MicrosoftPage, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_SEO_SELECTORS, NEETO_TEXT_MODIFIER_SELECTORS, NeetoAuthServer, NeetoChatWidget, NeetoEmailDeliveryApi, NeetoTowerApi, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PRODUCT_ROLES_ROUTE_MAP, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_NAMES, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RailsEmailApiClient, RailsEmailUtils, RoleApis, RolesPage, RolesPageV2, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SecurityApi, SidebarSection, SlackApi, SlackPage, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEAM_MEMBER_TEXTS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THEMES_TEXTS, THIRD_PARTY_RESOURCES, THIRD_PARTY_ROUTES, TIME_RANGES, TOASTR_MESSAGES, TWILIO_SELECTORS, TagsApi, TagsPage, TeamMembers, TeamMembersV2, ThankYouApi, ThankYouPage, TwilioApi, USER_AGENTS, WEBHOOK_SELECTORS, WebhookSiteApi, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_TEST_EMAIL_V2, ZAPIER_WEB_TEXTS, ZapierPage, authenticateUser, baseURLGenerator, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, createOrganizationViaRake, currencyUtils, dataQa, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, filterUtils, fixedMenuSelector, generatePhoneNumber, generatePhoneNumberDetails, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getDirname, getFormattedPhoneNumber, getFullUrl, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getIsoCodeFromPhoneCode, getListCount, globalShortcuts, grantClipboardPermissions, hexToRGB, hexToRGBA, i18nFixture, imageRegex, initializeCredentials, initializeTestData, initializeTotp, isGithubIssueOpen, isStagingOrganizationExpired, joinHyphenCase, joinString, login, mailpitDomainName, networkConditions, networkThrottlingUsingCDP, optionSelector, readFileAsBrowserFile, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipCustomDomainSetup, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, stealth as stealthTest, tableUtils, toCamelCase, updateCredentials, warmup, withCookieCache, writeDataToFile };
127269
+ export { ACTIONS, ADMIN_PANEL_SELECTORS, ALL_RESOURCES, ANALYTICS_RESOURCES, API_KEYS_SELECTORS, API_ROUTES, APP_RESOURCES, AUDIT_LOGS_SELECTORS, ApiKeysApi, ApiKeysPage, ApiKeysPageV2, AuditLogsPage, BASE_URL, CALENDAR_LABELS, CERTIFICATE_LIMIT_EXCEEDED_MESSAGE, CERTIFICATE_LIMIT_EXCEEDED_REGEXP, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CURRENT_TIME_RANGES, CUSTOM_DOMAIN_SELECTORS, CUSTOM_DOMAIN_SUFFIX, ColorPickerUtils, CustomCommands, CustomCommandsV2, CustomDomainApi, CustomDomainPage, DATE_FORMATS, DATE_PICKER_SELECTORS, DATE_RANGES, DATE_TEXTS, DEFAULT_TIMEZONE_ID, DEFAULT_WEBHOOKS_RESPONSE_TEXT, DESCRIPTION_EDITOR_TEXTS, EDITOR_VERIFY_TEXT_COLOR, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXAMPLE_URL, EXPANDED_FONT_SIZE, EXPORT_FILE_TYPES, EditorPage, EmailDeliveryUtils, EmbedBase, FILE_FORMATS, FONTS_RESOURCES, FONT_SIZE_SELECTORS, FROM_EMAIL_ENV_KEYS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_ANALYTICS_SELECTORS, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GOOGLE_SHEETS_SELECTORS, GooglePage, HELP_CENTER_ROUTES, HELP_CENTER_SELECTORS, HelpAndProfilePage, HelpAndProfilePageV2, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_CI, IS_DEV_ENV, IS_MAILPIT_ENABLED, IS_SHADCN_UI, IS_STAGING_ENV, ImageUploader, InboundEmailApis, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, KEYBOARD_SHORTCUT_TEST_CASES, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MAILPIT_BASE_URL, MAILPIT_DOMAIN_NAME, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MICROSOFT_LOGIN_SELECTORS, MICROSOFT_LOGIN_TEXTS, MailerUtils, MailpitApi, Member, MemberApis, MicrosoftPage, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_SEO_SELECTORS, NEETO_TEXT_MODIFIER_SELECTORS, NeetoAuthServer, NeetoChatWidget, NeetoEmailDeliveryApi, NeetoTowerApi, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PRODUCT_ROLES_ROUTE_MAP, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_NAMES, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RailsEmailApiClient, RailsEmailUtils, RoleApis, RolesPage, RolesPageV2, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SecurityApi, SidebarSection, SlackApi, SlackPage, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEAM_MEMBER_TEXTS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THEMES_TEXTS, THIRD_PARTY_RESOURCES, THIRD_PARTY_ROUTES, TIME_RANGES, TOASTR_MESSAGES, TWILIO_SELECTORS, TagsApi, TagsPage, TeamMembers, TeamMembersV2, ThankYouApi, ThankYouPage, TwilioApi, USER_AGENTS, WEBHOOK_SELECTORS, WebhookSiteApi, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_TEST_EMAIL_V2, ZAPIER_WEB_TEXTS, ZapierPage, authenticateUser, baseURLGenerator, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, createOrganizationViaApi, createOrganizationViaRake, currencyUtils, dataQa, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, filterUtils, fixedMenuSelector, generatePhoneNumber, generatePhoneNumberDetails, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getDirname, getFormattedPhoneNumber, getFullUrl, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getIsoCodeFromPhoneCode, getListCount, globalShortcuts, grantClipboardPermissions, hexToRGB, hexToRGBA, i18nFixture, imageRegex, initializeCredentials, initializeTestData, initializeTotp, isGithubIssueOpen, isStagingOrganizationExpired, joinHyphenCase, joinString, login, mailpitDomainName, networkConditions, networkThrottlingUsingCDP, optionSelector, readFileAsBrowserFile, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipCustomDomainSetup, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, stealth as stealthTest, tableUtils, toCamelCase, updateCredentials, warmup, withCookieCache, writeDataToFile };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigbinary/neeto-playwright-commons",
3
- "version": "4.5.1",
3
+ "version": "4.6.1",
4
4
  "description": "A package encapsulating common playwright code across neeto projects.",
5
5
  "repository": "git@github.com:bigbinary/neeto-playwright-commons.git",
6
6
  "license": "apache-2.0",